VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/keeview_app/html/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/jszip_worker.js
'use strict'

var ZipWorkerClass = Object.freeze(function () {
    var core = {};
    var retval = {};
    var blobcore = {};
    blobcore.compressContent = function (params, callbackfunc) {
        var zip = new JSZip();
        zip.file("untitled.dat", params.params.content);
        zip.generateAsync({type:"string", compression: "DEFLATE"}).then(function(content) {
            callbackfunc(content);
        });
    };
    blobcore.compress = function (params, callbackfunc) {
        var zip = new JSZip();
        var i, addf;
        addf = function (folder, content) {
            var i, tfolder;
            if (!EncodingClass.type.isArray(content)) content = [content];
            for (i = 0; i < content.length; i++) {
                if (content[i].type == "file") {
                    folder.file(content[i].name, content[i].content);
                }
                else if ((content[i].type == "folder") || (content[i].type == "directory")) {
                    tfolder = folder.folder(content[i].name);
                    addf(tfolder, content[i].content);
                }
            }
        };
        addf(zip, params.params);
        zip.generateAsync({type:"string", compression: "DEFLATE"}).then(function(content) {
            callbackfunc(content);
        });
    };
    blobcore.extract = function (params, callbackfunc) {
        var zip = new JSZip();
        zip.loadAsync(params.params[0].content).then(function (me, callbackfunc) {
            return function (zip) {
                var i;
                var keys = Object.keys(zip.files);
                for (i = 0; i < keys.length; i++) {
                    me.file(keys[i]).async("string").then(function (host) {
                        return function (r) {
                            var i, rv = {};
                            host["_data"].uncompressedContent = r;
                            for (i = 0; i < keys.length; i++) {
                                if (zip.files[keys[i]]["_data"].uncompressedContent === undefined) return;
                            }
                            for (i = 0; i < keys.length; i++) {
                                rv[keys[i]] = {
                                    name: zip.files[keys[i]].name,
                                    date: zip.files[keys[i]].date,
                                    size: zip.files[keys[i]]["_data"].uncompressedSize,
                                    content: zip.files[keys[i]]["_data"].uncompressedContent
                                };
                            }
                            callbackfunc(rv);
                        }
                    } (zip.files[keys[i]]));
                }
            }
        } (zip, callbackfunc));
    };
    blobcore.compressContentu8 = function (params, callbackfunc) {
        var zip = new JSZip();
        zip.file("untitled.dat", params.params.content);
        zip.generateAsync({type:"uint8array", compression: "DEFLATE"}).then(function(content) {
            callbackfunc(content, [content.buffer]);
        });
    };
    blobcore.compressu8 = function (params, callbackfunc) {
        var zip = new JSZip();
        var i, addf;
        addf = function (folder, content) {
            var i, tfolder;
            if (!EncodingClass.type.isArray(content)) content = [content];
            for (i = 0; i < content.length; i++) {
                if (content[i].type == "file") {
                    folder.file(content[i].name, content[i].content);
                }
                else if ((content[i].type == "folder") || (content[i].type == "directory")) {
                    tfolder = folder.folder(content[i].name);
                    addf(tfolder, content[i].content);
                }
            }
        };
        addf(zip, params.params);
        zip.generateAsync({type:"uint8array", compression: "DEFLATE"}).then(function(content) {
            callbackfunc(content, [content.buffer]);
        });
    };
    blobcore.extractu8 = function (params, callbackfunc) {
        var zip = new JSZip();
        zip.loadAsync(params.params[0].content).then(function (me, callbackfunc) {
            return function (zip) {
                var i;
                var keys = Object.keys(zip.files);
                for (i = 0; i < keys.length; i++) {
                    me.file(keys[i]).async("uint8array").then(function (host) {
                        return function (r) {
                            var i, rv = {}, transferList = [];
                            host["_data"].uncompressedContent = r;
                            for (i = 0; i < keys.length; i++) {
                                if (zip.files[keys[i]]["_data"].uncompressedContent === undefined) return;
                            }
                            for (i = 0; i < keys.length; i++) {
                                rv[keys[i]] = {
                                    name: zip.files[keys[i]].name,
                                    date: zip.files[keys[i]].date,
                                    size: zip.files[keys[i]]["_data"].uncompressedSize,
                                    content: zip.files[keys[i]]["_data"].uncompressedContent
                                };
                                if (zip.files[keys[i]]["_data"].uncompressedSize != zip.files[keys[i]]["_data"].uncompressedContent.buffer.byteLength) {
                                    console.log("zipsize error", zip.files[keys[i]]["_data"].uncompressedSize, zip.files[keys[i]]["_data"].uncompressedContent.buffer.byteLength);
                                }
                                transferList.push(zip.files[keys[i]]["_data"].uncompressedContent.buffer);
                            }
                            callbackfunc(rv, transferList);
                        }
                    } (zip.files[keys[i]]));
                }
            }
        } (zip, callbackfunc));
    };
    var wCode = EncodingClass.base64.decode(
        "LyohCgpKU1ppcCB2My41LjAgLSBBIEphdmFTY3JpcHQgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYW5kIHJlYWRpbmcgemlwIGZpbGVzCjxodHRwOi8vc3R1YXJ0ay5jb20vanN6aXA+CgooYykgMjAwOS0yMDE2IFN0" +
        "dWFydCBLbmlnaHRsZXkgPHN0dWFydCBbYXRdIHN0dWFydGsuY29tPgpEdWFsIGxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBvciBHUEx2My4gU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vU3R1ay9q" +
        "c3ppcC9tYXN0ZXIvTElDRU5TRS5tYXJrZG93bi4KCkpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgpodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bh" +
        "a28vYmxvYi9tYXN0ZXIvTElDRU5TRQoqLwoKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVs" +
        "c2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIil7Zz13aW5kb3d9ZWxzZSBpZih0" +
        "eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcuSlNaaXAgPSBmKCl9fSkoZnVuY3Rpb24oKXt2" +
        "YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiAoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiIm" +
        "JnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVf" +
        "Tk9UX0ZPVU5EIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUs" +
        "dCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltm" +
        "dW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwp2YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7CnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7Ci8vIHBy" +
        "aXZhdGUgcHJvcGVydHkKdmFyIF9rZXlTdHIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOwoKCi8vIHB1YmxpYyBtZXRob2QgZm9y" +
        "IGVuY29kaW5nCmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQpIHsKICAgIHZhciBvdXRwdXQgPSBbXTsKICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0OwogICAg" +
        "dmFyIGkgPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGgsIHJlbWFpbmluZ0J5dGVzID0gbGVuOwoKICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gInN0cmluZyI7CiAgICB3aGlsZSAo" +
        "aSA8IGlucHV0Lmxlbmd0aCkgewogICAgICAgIHJlbWFpbmluZ0J5dGVzID0gbGVuIC0gaTsKCiAgICAgICAgaWYgKCFpc0FycmF5KSB7CiAgICAgICAgICAgIGNocjEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7" +
        "CiAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXQuY2hhckNvZGVBdChpKyspIDogMDsKICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwOwogICAgICAg" +
        "IH0gZWxzZSB7CiAgICAgICAgICAgIGNocjEgPSBpbnB1dFtpKytdOwogICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwOwogICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0" +
        "W2krK10gOiAwOwogICAgICAgIH0KCiAgICAgICAgZW5jMSA9IGNocjEgPj4gMjsKICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTsKICAgICAgICBlbmMzID0gcmVtYWluaW5n" +
        "Qnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0OwogICAgICAgIGVuYzQgPSByZW1haW5pbmdCeXRlcyA+IDIgPyAoY2hyMyAmIDYzKSA6IDY0OwoKICAgICAgICBvdXRw" +
        "dXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7CgogICAgfQoKICAgIHJldHVybiBv" +
        "dXRwdXQuam9pbigiIik7Cn07CgovLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZwpleHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7CiAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMzsKICAgIHZhciBl" +
        "bmMxLCBlbmMyLCBlbmMzLCBlbmM0OwogICAgdmFyIGkgPSAwLCByZXN1bHRJbmRleCA9IDA7CgogICAgdmFyIGRhdGFVcmxQcmVmaXggPSAiZGF0YToiOwoKICAgIGlmIChpbnB1dC5zdWJzdHIoMCwgZGF0YVVy" +
        "bFByZWZpeC5sZW5ndGgpID09PSBkYXRhVXJsUHJlZml4KSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIGNvbW1vbiBlcnJvcjogcGVvcGxlIGdpdmUgYSBkYXRhIHVybAogICAgICAgIC8vIChkYXRhOmltYWdlL3Bu" +
        "ZztiYXNlNjQsaVZCT1IuLi4pIHdpdGggYSB7YmFzZTY0OiB0cnVlfSBhbmQKICAgICAgICAvLyB3b25kZXJzIHdoeSB0aGluZ3MgZG9uJ3Qgd29yay4KICAgICAgICAvLyBXZSBjYW4gZGV0ZWN0IHRoYXQgdGhl" +
        "IHN0cmluZyBpbnB1dCBsb29rcyBsaWtlIGEgZGF0YSB1cmwgYnV0IHdlCiAgICAgICAgLy8gKmNhbid0KiBiZSBzdXJlIGl0IGlzIG9uZTogcmVtb3ZpbmcgZXZlcnl0aGluZyB1cCB0byB0aGUgY29tbWEgd291" +
        "bGQKICAgICAgICAvLyBiZSB0b28gZGFuZ2Vyb3VzLgogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTsKICAgIH0KCiAgICBp" +
        "bnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XCtcL1w9XS9nLCAiIik7CgogICAgdmFyIHRvdGFsTGVuZ3RoID0gaW5wdXQubGVuZ3RoICogMyAvIDQ7CiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQu" +
        "bGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkgewogICAgICAgIHRvdGFsTGVuZ3RoLS07CiAgICB9CiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hh" +
        "ckF0KDY0KSkgewogICAgICAgIHRvdGFsTGVuZ3RoLS07CiAgICB9CiAgICBpZiAodG90YWxMZW5ndGggJSAxICE9PSAwKSB7CiAgICAgICAgLy8gdG90YWxMZW5ndGggaXMgbm90IGFuIGludGVnZXIsIHRoZSBs" +
        "ZW5ndGggZG9lcyBub3QgbWF0Y2ggYSB2YWxpZAogICAgICAgIC8vIGJhc2U2NCBjb250ZW50LiBUaGF0IGNhbiBoYXBwZW4gaWY6CiAgICAgICAgLy8gLSB0aGUgaW5wdXQgaXMgbm90IGEgYmFzZTY0IGNvbnRl" +
        "bnQKICAgICAgICAvLyAtIHRoZSBpbnB1dCBpcyAqYWxtb3N0KiBhIGJhc2U2NCBjb250ZW50LCB3aXRoIGEgZXh0cmEgY2hhcnMgYXQgdGhlCiAgICAgICAgLy8gICBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZAog" +
        "ICAgICAgIC8vIC0gdGhlIGlucHV0IHVzZXMgYSBiYXNlNjQgdmFyaWFudCAoYmFzZTY0dXJsIGZvciBleGFtcGxlKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGJhZCBj" +
        "b250ZW50IGxlbmd0aC4iKTsKICAgIH0KICAgIHZhciBvdXRwdXQ7CiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7CiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGh8MCk7CiAg" +
        "ICB9IGVsc2UgewogICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aHwwKTsKICAgIH0KCiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkgewoKICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRl" +
        "eE9mKGlucHV0LmNoYXJBdChpKyspKTsKICAgICAgICBlbmMyID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTsKICAgICAgICBlbmMzID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChp" +
        "KyspKTsKICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTsKCiAgICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7CiAgICAgICAgY2hyMiA9ICgoZW5j" +
        "MiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpOwogICAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7CgogICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7CgogICAgICAgIGlm" +
        "IChlbmMzICE9PSA2NCkgewogICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyOwogICAgICAgIH0KICAgICAgICBpZiAoZW5jNCAhPT0gNjQpIHsKICAgICAgICAgICAgb3V0cHV0W3Jlc3Vs" +
        "dEluZGV4KytdID0gY2hyMzsKICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiBvdXRwdXQ7Cn07Cgp9LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxl" +
        "eHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKdmFyIGV4dGVybmFsID0gcmVxdWlyZSgiLi9leHRlcm5hbCIpOwp2YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTsKdmFyIERhdGFM" +
        "ZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpOwp2YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTsKdmFyIERhdGFMZW5ndGhQcm9iZSA9" +
        "IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpOwoKLyoqCiAqIFJlcHJlc2VudCBhIGNvbXByZXNzZWQgb2JqZWN0LCB3aXRoIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGRlY29tcHJlc3MgaXQuCiAq" +
        "IEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC4KICogQHBhcmFtIHtudW1iZXJ9IHVuY29tcHJlc3NlZFNpemUgdGhl" +
        "IHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgZGVjb21wcmVzc2lvbi4KICogQHBhcmFtIHtudW1iZXJ9IGNyYzMyIHRoZSBjcmMzMiBvZiB0aGUgZGVjb21wcmVzc2VkIGZpbGUuCiAqIEBwYXJhbSB7b2JqZWN0fSBj" +
        "b21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuCiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBj" +
        "b21wcmVzc2VkIGRhdGEuCiAqLwpmdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHsKICAgIHRoaXMuY29t" +
        "cHJlc3NlZFNpemUgPSBjb21wcmVzc2VkU2l6ZTsKICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHVuY29tcHJlc3NlZFNpemU7CiAgICB0aGlzLmNyYzMyID0gY3JjMzI7CiAgICB0aGlzLmNvbXByZXNzaW9u" +
        "ID0gY29tcHJlc3Npb247CiAgICB0aGlzLmNvbXByZXNzZWRDb250ZW50ID0gZGF0YTsKfQoKQ29tcHJlc3NlZE9iamVjdC5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBn" +
        "ZXQgdGhlIHVuY29tcHJlc3NlZCBjb250ZW50LgogICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci4KICAgICAqLwogICAgZ2V0Q29udGVudFdvcmtlciA6IGZ1bmN0aW9uICgpIHsKICAg" +
        "ICAgICB2YXIgd29ya2VyID0gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKQogICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21w" +
        "cmVzc1dvcmtlcigpKQogICAgICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoImRhdGFfbGVuZ3RoIikpOwoKICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgd29ya2VyLm9uKCJlbmQiLCBmdW5j" +
        "dGlvbiAoKSB7CiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJ1" +
        "ZyA6IHVuY29tcHJlc3NlZCBkYXRhIHNpemUgbWlzbWF0Y2giKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3b3JrZXI7CiAgICB9LAogICAgLyoqCiAgICAgKiBDcmVhdGUgYSB3" +
        "b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuCiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLgogICAgICovCiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rp" +
        "b24gKCkgewogICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpCiAgICAgICAgLndpdGhTdHJlYW1JbmZvKCJjb21wcmVz" +
        "c2VkU2l6ZSIsIHRoaXMuY29tcHJlc3NlZFNpemUpCiAgICAgICAgLndpdGhTdHJlYW1JbmZvKCJ1bmNvbXByZXNzZWRTaXplIiwgdGhpcy51bmNvbXByZXNzZWRTaXplKQogICAgICAgIC53aXRoU3RyZWFtSW5m" +
        "bygiY3JjMzIiLCB0aGlzLmNyYzMyKQogICAgICAgIC53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLCB0aGlzLmNvbXByZXNzaW9uKQogICAgICAgIDsKICAgIH0KfTsKCi8qKgogKiBDaGFpbiB0aGUgZ2l2" +
        "ZW4gd29ya2VyIHdpdGggb3RoZXIgd29ya2VycyB0byBjb21wcmVzcyB0aGUgY29udGVudCB3aXRoIHRoZQogKiBnaXZlbiBjb21wcmVzc2lvbi4KICogQHBhcmFtIHtHZW5lcmljV29ya2VyfSB1bmNvbXByZXNz" +
        "ZWRXb3JrZXIgdGhlIHdvcmtlciB0byBwaXBlLgogKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9u" +
        "cyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy4KICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIG5ldyB3b3JrZXIgY29tcHJlc3NpbmcgdGhlIGNvbnRlbnQuCiAqLwpDb21wcmVzc2Vk" +
        "T2JqZWN0LmNyZWF0ZVdvcmtlckZyb20gPSBmdW5jdGlvbiAodW5jb21wcmVzc2VkV29ya2VyLCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7CiAgICByZXR1cm4gdW5jb21wcmVzc2VkV29ya2Vy" +
        "CiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKQogICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZSgidW5jb21wcmVzc2VkU2l6ZSIpKQogICAgLnBpcGUoY29tcHJlc3Npb24uY29tcHJlc3NXb3JrZXIoY29t" +
        "cHJlc3Npb25PcHRpb25zKSkKICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoImNvbXByZXNzZWRTaXplIikpCiAgICAud2l0aFN0cmVhbUluZm8oImNvbXByZXNzaW9uIiwgY29tcHJlc3Npb24pOwp9OwoK" +
        "bW9kdWxlLmV4cG9ydHMgPSBDb21wcmVzc2VkT2JqZWN0OwoKfSx7Ii4vZXh0ZXJuYWwiOjYsIi4vc3RyZWFtL0NyYzMyUHJvYmUiOjI1LCIuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUiOjI2LCIuL3N0cmVhbS9E" +
        "YXRhV29ya2VyIjoyN31dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgp2YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIi" +
        "KTsKCmV4cG9ydHMuU1RPUkUgPSB7CiAgICBtYWdpYzogIlx4MDBceDAwIiwKICAgIGNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykgewogICAgICAgIHJldHVybiBuZXcgR2Vu" +
        "ZXJpY1dvcmtlcigiU1RPUkUgY29tcHJlc3Npb24iKTsKICAgIH0sCiAgICB1bmNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcigiU1RPUkUgZGVj" +
        "b21wcmVzc2lvbiIpOwogICAgfQp9OwpleHBvcnRzLkRFRkxBVEUgPSByZXF1aXJlKCcuL2ZsYXRlJyk7Cgp9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbihy" +
        "ZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpOwoKLyoqCiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBm" +
        "cm9tIHBha28vbGliL3psaWIvY3JjMzIuanMKICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vCiAqLwoKLy8gVXNlIG9yZGlu" +
        "YXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmUKZnVuY3Rpb24gbWFrZVRhYmxlKCkgewogICAgdmFyIGMsIHRhYmxlID0gW107CgogICAgZm9yKHZhciBuID0wOyBuIDwgMjU2OyBu" +
        "KyspewogICAgICAgIGMgPSBuOwogICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7CiAgICAgICAgICAgIGMgPSAoKGMmMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpOwog" +
        "ICAgICAgIH0KICAgICAgICB0YWJsZVtuXSA9IGM7CiAgICB9CgogICAgcmV0dXJuIHRhYmxlOwp9CgovLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVt" +
        "Lgp2YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTsKCgpmdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHsKICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjsKCiAgICBjcmMgPSBj" +
        "cmMgXiAoLTEpOwoKICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHsKICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTsKICAgIH0KCiAgICByZXR1" +
        "cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDsKfQoKLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLgoKLyoqCiAqIENvbXB1dGUgdGhlIGNyYzMyIG9mIGEgc3RyaW5nLgogKiBUaGlzIGlzIGFs" +
        "bW9zdCB0aGUgc2FtZSBhcyB0aGUgZnVuY3Rpb24gY3JjMzIsIGJ1dCBmb3Igc3RyaW5ncy4gVXNpbmcgdGhlCiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxl" +
        "IHBlcmZvcm1hbmNlcy4KICogQHBhcmFtIHtOdW1iZXJ9IGNyYyB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGNyYy4KICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS4KICogQHBhcmFt" +
        "IHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgY3JjMzIgY29tcHV0YXRpb24uCiAqIEByZXR1" +
        "cm4ge051bWJlcn0gdGhlIGNvbXB1dGVkIGNyYzMyLgogKi8KZnVuY3Rpb24gY3JjMzJzdHIoY3JjLCBzdHIsIGxlbiwgcG9zKSB7CiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47CgogICAg" +
        "Y3JjID0gY3JjIF4gKC0xKTsKCiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7CiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBzdHIuY2hhckNvZGVBdChpKSkgJiAweEZG" +
        "XTsKICAgIH0KCiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDsKfQoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmMzMndyYXBwZXIoaW5wdXQsIGNyYykgewogICAgaWYgKHR5cGVvZiBpbnB1" +
        "dCA9PT0gInVuZGVmaW5lZCIgfHwgIWlucHV0Lmxlbmd0aCkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gInN0cmluZyI7Cgog" +
        "ICAgaWYoaXNBcnJheSkgewogICAgICAgIHJldHVybiBjcmMzMihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQs" +
        "IGlucHV0Lmxlbmd0aCwgMCk7CiAgICB9Cn07Cgp9LHsiLi91dGlscyI6MzJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwpleHBvcnRzLmJhc2U2NCA9IGZhbHNl" +
        "OwpleHBvcnRzLmJpbmFyeSA9IGZhbHNlOwpleHBvcnRzLmRpciA9IGZhbHNlOwpleHBvcnRzLmNyZWF0ZUZvbGRlcnMgPSB0cnVlOwpleHBvcnRzLmRhdGUgPSBudWxsOwpleHBvcnRzLmNvbXByZXNzaW9uID0g" +
        "bnVsbDsKZXhwb3J0cy5jb21wcmVzc2lvbk9wdGlvbnMgPSBudWxsOwpleHBvcnRzLmNvbW1lbnQgPSBudWxsOwpleHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7CmV4cG9ydHMuZG9zUGVybWlzc2lvbnMg" +
        "PSBudWxsOwoKfSx7fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Ci8qIGdsb2JhbCBQcm9taXNlICovCid1c2Ugc3RyaWN0JzsKCi8vIGxvYWQgdGhlIGdsb2JhbCBvYmplY3QgZmlyc3Q6" +
        "Ci8vIC0gaXQgc2hvdWxkIGJlIGJldHRlciBpbnRlZ3JhdGVkIGluIHRoZSBzeXN0ZW0gKHVuaGFuZGxlZFJlamVjdGlvbiBpbiBub2RlKQovLyAtIHRoZSBlbnZpcm9ubWVudCBtYXkgaGF2ZSBhIGN1c3RvbSBQ" +
        "cm9taXNlIGltcGxlbWVudGF0aW9uIChzZWUgem9uZS5qcykKdmFyIEVTNlByb21pc2UgPSBudWxsOwppZiAodHlwZW9mIFByb21pc2UgIT09ICJ1bmRlZmluZWQiKSB7CiAgICBFUzZQcm9taXNlID0gUHJvbWlz" +
        "ZTsKfSBlbHNlIHsKICAgIEVTNlByb21pc2UgPSByZXF1aXJlKCJsaWUiKTsKfQoKLyoqCiAqIExldCB0aGUgdXNlciB1c2UvY2hhbmdlIHNvbWUgaW1wbGVtZW50YXRpb25zLgogKi8KbW9kdWxlLmV4cG9ydHMg" +
        "PSB7CiAgICBQcm9taXNlOiBFUzZQcm9taXNlCn07Cgp9LHsibGllIjozN31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CnZhciBVU0VfVFlQRURBUlJBWSA9ICh0" +
        "eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7Cgp2YXIg" +
        "cGFrbyA9IHJlcXVpcmUoInBha28iKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgiLi91dGlscyIpOwp2YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTsKCnZhciBBUlJB" +
        "WV9UWVBFID0gVVNFX1RZUEVEQVJSQVkgPyAidWludDhhcnJheSIgOiAiYXJyYXkiOwoKZXhwb3J0cy5tYWdpYyA9ICJceDA4XHgwMCI7CgovKioKICogQ3JlYXRlIGEgd29ya2VyIHRoYXQgdXNlcyBwYWtvIHRv" +
        "IGluZmxhdGUvZGVmbGF0ZS4KICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIG5hbWUgb2YgdGhlIHBha28gZnVuY3Rpb24gdG8gY2FsbCA6IGVpdGhlciAiRGVmbGF0ZSIgb3Ig" +
        "IkluZmxhdGUiLgogKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuCiAqLwpmdW5jdGlvbiBGbGF0ZVdvcmtlcihhY3Rpb24sIG9wdGlvbnMp" +
        "IHsKICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCAiRmxhdGVXb3JrZXIvIiArIGFjdGlvbik7CgogICAgdGhpcy5fcGFrbyA9IG51bGw7CiAgICB0aGlzLl9wYWtvQWN0aW9uID0gYWN0aW9uOwogICAgdGhp" +
        "cy5fcGFrb09wdGlvbnMgPSBvcHRpb25zOwogICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZAogICAgLy8gdGhpcyBhbGxvdyB0aGlzIHdvcmtlciB0byBwYXNzIGFy" +
        "b3VuZCBtZXRhZGF0YQogICAgdGhpcy5tZXRhID0ge307Cn0KCnV0aWxzLmluaGVyaXRzKEZsYXRlV29ya2VyLCBHZW5lcmljV29ya2VyKTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5r" +
        "CiAqLwpGbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7CiAgICB0aGlzLm1ldGEgPSBjaHVuay5tZXRhOwogICAgaWYgKHRoaXMuX3Bha28gPT09IG51bGwpIHsK" +
        "ICAgICAgICB0aGlzLl9jcmVhdGVQYWtvKCk7CiAgICB9CiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTsKfTsKCi8qKgogKiBAc2Vl" +
        "IEdlbmVyaWNXb3JrZXIuZmx1c2gKICovCkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7CiAgICBp" +
        "ZiAodGhpcy5fcGFrbyA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuX2NyZWF0ZVBha28oKTsKICAgIH0KICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7Cn07Ci8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIu" +
        "Y2xlYW5VcAogKi8KRmxhdGVXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7CiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7CiAgICB0aGlzLl9wYWtv" +
        "ID0gbnVsbDsKfTsKCi8qKgogKiBDcmVhdGUgdGhlIF9wYWtvIG9iamVjdC4KICogVE9ETzogbGF6eS1sb2FkaW5nIHRoaXMgb2JqZWN0IGlzbid0IHRoZSBiZXN0IHNvbHV0aW9uIGJ1dCBpdCdzIHRoZQogKiBx" +
        "dWlja2VzdC4gVGhlIGJlc3Qgc29sdXRpb24gaXMgdG8gbGF6eS1sb2FkIHRoZSB3b3JrZXIgbGlzdC4gU2VlIGFsc28gdGhlCiAqIGlzc3VlICM0NDYuCiAqLwpGbGF0ZVdvcmtlci5wcm90b3R5cGUuX2NyZWF0" +
        "ZVBha28gPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLl9wYWtvID0gbmV3IHBha29bdGhpcy5fcGFrb0FjdGlvbl0oewogICAgICAgIHJhdzogdHJ1ZSwKICAgICAgICBsZXZlbDogdGhpcy5fcGFrb09wdGlvbnMu" +
        "bGV2ZWwgfHwgLTEgLy8gZGVmYXVsdCBjb21wcmVzc2lvbgogICAgfSk7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBzZWxmLnB1" +
        "c2goewogICAgICAgICAgICBkYXRhIDogZGF0YSwKICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YQogICAgICAgIH0pOwogICAgfTsKfTsKCmV4cG9ydHMuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoY29t" +
        "cHJlc3Npb25PcHRpb25zKSB7CiAgICByZXR1cm4gbmV3IEZsYXRlV29ya2VyKCJEZWZsYXRlIiwgY29tcHJlc3Npb25PcHRpb25zKTsKfTsKZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkg" +
        "ewogICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcigiSW5mbGF0ZSIsIHt9KTsKfTsKCn0seyIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi91dGlscyI6MzIsInBha28iOjM4fV0sODpbZnVuY3Rpb24ocmVx" +
        "dWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7CnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi4vc3RyZWFtL0dlbmVyaWNXb3Jr" +
        "ZXInKTsKdmFyIHV0ZjggPSByZXF1aXJlKCcuLi91dGY4Jyk7CnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7CnZhciBzaWduYXR1cmUgPSByZXF1aXJlKCcuLi9zaWduYXR1cmUnKTsKCi8qKgogKiBU" +
        "cmFuc2Zvcm0gYW4gaW50ZWdlciBpbnRvIGEgc3RyaW5nIGluIGhleGFkZWNpbWFsLgogKiBAcHJpdmF0ZQogKiBAcGFyYW0ge251bWJlcn0gZGVjIHRoZSBudW1iZXIgdG8gY29udmVydC4KICogQHBhcmFtIHtu" +
        "dW1iZXJ9IGJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGUuCiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSByZXN1bHQuCiAqLwp2YXIgZGVjVG9IZXggPSBmdW5jdGlvbihkZWMsIGJ5dGVzKSB7" +
        "CiAgICB2YXIgaGV4ID0gIiIsIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgewogICAgICAgIGhleCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlYyAmIDB4ZmYpOwogICAgICAgIGRlYyA9IGRl" +
        "YyA+Pj4gODsKICAgIH0KICAgIHJldHVybiBoZXg7Cn07CgovKioKICogR2VuZXJhdGUgdGhlIFVOSVggcGFydCBvZiB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgogKiBAcGFyYW0ge09iamVjdH0gdW5p" +
        "eFBlcm1pc3Npb25zIHRoZSB1bml4IHBlcm1pc3Npb25zIG9yIG51bGwuCiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNEaXIgdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZS4K" +
        "ICogQHJldHVybiB7TnVtYmVyfSBhIDMyIGJpdCBpbnRlZ2VyLgogKgogKiBhZGFwdGVkIGZyb20gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzE0NzA1L3RoZS16aXAtZm9ybWF0cy1l" +
        "eHRlcm5hbC1maWxlLWF0dHJpYnV0ZSA6CiAqCiAqIFRUVFRzc3Ryd3hyd3hyd3gwMDAwMDAwMDAwQURWU0hSCiAqIF5eXl5fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGZpbGUgdHlwZSwgc2VlIHppcGlu" +
        "Zm8uYyAoVU5YXyopCiAqICAgICBeXl5fX19fX19fX19fX19fX19fX19fX19fX19fIHNldHVpZCwgc2V0Z2lkLCBzdGlja3kKICogICAgICAgIF5eXl5eXl5eXl9fX19fX19fX19fX19fX18gcGVybWlzc2lvbnMK" +
        "ICogICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5fX19fX18gbm90IHVzZWQgPwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiBET1MgYXR0cmlidXRlIGJpdHMgOiBBcmNoaXZlLCBEaXJlY3Rv" +
        "cnksIFZvbHVtZSBsYWJlbCwgU3lzdGVtIGZpbGUsIEhpZGRlbiwgUmVhZCBvbmx5CiAqLwp2YXIgZ2VuZXJhdGVVbml4RXh0ZXJuYWxGaWxlQXR0ciA9IGZ1bmN0aW9uICh1bml4UGVybWlzc2lvbnMsIGlzRGly" +
        "KSB7CgogICAgdmFyIHJlc3VsdCA9IHVuaXhQZXJtaXNzaW9uczsKICAgIGlmICghdW5peFBlcm1pc3Npb25zKSB7CiAgICAgICAgLy8gSSBjYW4ndCB1c2Ugb2N0YWwgdmFsdWVzIGluIHN0cmljdCBtb2RlLCBo" +
        "ZW5jZSB0aGUgaGV4YS4KICAgICAgICAvLyAgMDQwNzc1ID0+IDB4NDFmZAogICAgICAgIC8vIDAxMDA2NjQgPT4gMHg4MWI0CiAgICAgICAgcmVzdWx0ID0gaXNEaXIgPyAweDQxZmQgOiAweDgxYjQ7CiAgICB9" +
        "CiAgICByZXR1cm4gKHJlc3VsdCAmIDB4RkZGRikgPDwgMTY7Cn07CgovKioKICogR2VuZXJhdGUgdGhlIERPUyBwYXJ0IG9mIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMuCiAqIEBwYXJhbSB7T2JqZWN0" +
        "fSBkb3NQZXJtaXNzaW9ucyB0aGUgZG9zIHBlcm1pc3Npb25zIG9yIG51bGwuCiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNEaXIgdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lz" +
        "ZS4KICogQHJldHVybiB7TnVtYmVyfSBhIDMyIGJpdCBpbnRlZ2VyLgogKgogKiBCaXQgMCAgICAgUmVhZC1Pbmx5CiAqIEJpdCAxICAgICBIaWRkZW4KICogQml0IDIgICAgIFN5c3RlbQogKiBCaXQgMyAgICAg" +
        "Vm9sdW1lIExhYmVsCiAqIEJpdCA0ICAgICBEaXJlY3RvcnkKICogQml0IDUgICAgIEFyY2hpdmUKICovCnZhciBnZW5lcmF0ZURvc0V4dGVybmFsRmlsZUF0dHIgPSBmdW5jdGlvbiAoZG9zUGVybWlzc2lvbnMs" +
        "IGlzRGlyKSB7CgogICAgLy8gdGhlIGRpciBmbGFnIGlzIGFscmVhZHkgc2V0IGZvciBjb21wYXRpYmlsaXR5CiAgICByZXR1cm4gKGRvc1Blcm1pc3Npb25zIHx8IDApICAmIDB4M0Y7Cn07CgovKioKICogR2Vu" +
        "ZXJhdGUgdGhlIHZhcmlvdXMgcGFydHMgdXNlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBmaW5hbCB6aXAgZmlsZS4KICogQHBhcmFtIHtPYmplY3R9IHN0cmVhbUluZm8gdGhlIGhhc2ggd2l0aCBpbmZv" +
        "cm1hdGlvbiBhYm91dCB0aGUgY29tcHJlc3NlZCBmaWxlLgogKiBAcGFyYW0ge0Jvb2xlYW59IHN0cmVhbWVkQ29udGVudCBpcyB0aGUgY29udGVudCBzdHJlYW1lZCA/CiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3Ry" +
        "ZWFtaW5nRW5kZWQgaXMgdGhlIHN0cmVhbSBmaW5pc2hlZCA/CiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB6aXAgZmlsZS4KICogQHBh" +
        "cmFtIHtTdHJpbmd9IHBsYXRmb3JtIGxldCdzIHByZXRlbmQgd2UgYXJlIHRoaXMgcGxhdGZvcm0gKGNoYW5nZSBwbGF0Zm9ybSBkZXBlbmRlbnRzIGZpZWxkcykKICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2Rl" +
        "RmlsZU5hbWUgdGhlIGZ1bmN0aW9uIHRvIGVuY29kZSB0aGUgZmlsZSBuYW1lIC8gY29tbWVudC4KICogQHJldHVybiB7T2JqZWN0fSB0aGUgemlwIHBhcnRzLgogKi8KdmFyIGdlbmVyYXRlWmlwUGFydHMgPSBm" +
        "dW5jdGlvbihzdHJlYW1JbmZvLCBzdHJlYW1lZENvbnRlbnQsIHN0cmVhbWluZ0VuZGVkLCBvZmZzZXQsIHBsYXRmb3JtLCBlbmNvZGVGaWxlTmFtZSkgewogICAgdmFyIGZpbGUgPSBzdHJlYW1JbmZvWydmaWxl" +
        "J10sCiAgICBjb21wcmVzc2lvbiA9IHN0cmVhbUluZm9bJ2NvbXByZXNzaW9uJ10sCiAgICB1c2VDdXN0b21FbmNvZGluZyA9IGVuY29kZUZpbGVOYW1lICE9PSB1dGY4LnV0ZjhlbmNvZGUsCiAgICBlbmNvZGVk" +
        "RmlsZU5hbWUgPSB1dGlscy50cmFuc2Zvcm1Ubygic3RyaW5nIiwgZW5jb2RlRmlsZU5hbWUoZmlsZS5uYW1lKSksCiAgICB1dGZFbmNvZGVkRmlsZU5hbWUgPSB1dGlscy50cmFuc2Zvcm1Ubygic3RyaW5nIiwg" +
        "dXRmOC51dGY4ZW5jb2RlKGZpbGUubmFtZSkpLAogICAgY29tbWVudCA9IGZpbGUuY29tbWVudCwKICAgIGVuY29kZWRDb21tZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oInN0cmluZyIsIGVuY29kZUZpbGVOYW1l" +
        "KGNvbW1lbnQpKSwKICAgIHV0ZkVuY29kZWRDb21tZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oInN0cmluZyIsIHV0ZjgudXRmOGVuY29kZShjb21tZW50KSksCiAgICB1c2VVVEY4Rm9yRmlsZU5hbWUgPSB1dGZF" +
        "bmNvZGVkRmlsZU5hbWUubGVuZ3RoICE9PSBmaWxlLm5hbWUubGVuZ3RoLAogICAgdXNlVVRGOEZvckNvbW1lbnQgPSB1dGZFbmNvZGVkQ29tbWVudC5sZW5ndGggIT09IGNvbW1lbnQubGVuZ3RoLAogICAgZG9z" +
        "VGltZSwKICAgIGRvc0RhdGUsCiAgICBleHRyYUZpZWxkcyA9ICIiLAogICAgdW5pY29kZVBhdGhFeHRyYUZpZWxkID0gIiIsCiAgICB1bmljb2RlQ29tbWVudEV4dHJhRmllbGQgPSAiIiwKICAgIGRpciA9IGZp" +
        "bGUuZGlyLAogICAgZGF0ZSA9IGZpbGUuZGF0ZTsKCgogICAgdmFyIGRhdGFJbmZvID0gewogICAgICAgIGNyYzMyIDogMCwKICAgICAgICBjb21wcmVzc2VkU2l6ZSA6IDAsCiAgICAgICAgdW5jb21wcmVzc2Vk" +
        "U2l6ZSA6IDAKICAgIH07CgogICAgLy8gaWYgdGhlIGNvbnRlbnQgaXMgc3RyZWFtZWQsIHRoZSBzaXplcy9jcmMzMiBhcmUgb25seSBhdmFpbGFibGUgQUZURVIKICAgIC8vIHRoZSBlbmQgb2YgdGhlIHN0cmVh" +
        "bS4KICAgIGlmICghc3RyZWFtZWRDb250ZW50IHx8IHN0cmVhbWluZ0VuZGVkKSB7CiAgICAgICAgZGF0YUluZm8uY3JjMzIgPSBzdHJlYW1JbmZvWydjcmMzMiddOwogICAgICAgIGRhdGFJbmZvLmNvbXByZXNz" +
        "ZWRTaXplID0gc3RyZWFtSW5mb1snY29tcHJlc3NlZFNpemUnXTsKICAgICAgICBkYXRhSW5mby51bmNvbXByZXNzZWRTaXplID0gc3RyZWFtSW5mb1sndW5jb21wcmVzc2VkU2l6ZSddOwogICAgfQoKICAgIHZh" +
        "ciBiaXRmbGFnID0gMDsKICAgIGlmIChzdHJlYW1lZENvbnRlbnQpIHsKICAgICAgICAvLyBCaXQgMzogdGhlIHNpemVzL2NyYzMyIGFyZSBzZXQgdG8gemVybyBpbiB0aGUgbG9jYWwgaGVhZGVyLgogICAgICAg" +
        "IC8vIFRoZSBjb3JyZWN0IHZhbHVlcyBhcmUgcHV0IGluIHRoZSBkYXRhIGRlc2NyaXB0b3IgaW1tZWRpYXRlbHkKICAgICAgICAvLyBmb2xsb3dpbmcgdGhlIGNvbXByZXNzZWQgZGF0YS4KICAgICAgICBiaXRm" +
        "bGFnIHw9IDB4MDAwODsKICAgIH0KICAgIGlmICghdXNlQ3VzdG9tRW5jb2RpbmcgJiYgKHVzZVVURjhGb3JGaWxlTmFtZSB8fCB1c2VVVEY4Rm9yQ29tbWVudCkpIHsKICAgICAgICAvLyBCaXQgMTE6IExhbmd1" +
        "YWdlIGVuY29kaW5nIGZsYWcgKEVGUykuCiAgICAgICAgYml0ZmxhZyB8PSAweDA4MDA7CiAgICB9CgoKICAgIHZhciBleHRGaWxlQXR0ciA9IDA7CiAgICB2YXIgdmVyc2lvbk1hZGVCeSA9IDA7CiAgICBpZiAo" +
        "ZGlyKSB7CiAgICAgICAgLy8gZG9zIG9yIHVuaXgsIHdlIHNldCB0aGUgZG9zIGRpciBmbGFnCiAgICAgICAgZXh0RmlsZUF0dHIgfD0gMHgwMDAxMDsKICAgIH0KICAgIGlmKHBsYXRmb3JtID09PSAiVU5JWCIp" +
        "IHsKICAgICAgICB2ZXJzaW9uTWFkZUJ5ID0gMHgwMzFFOyAvLyBVTklYLCB2ZXJzaW9uIDMuMAogICAgICAgIGV4dEZpbGVBdHRyIHw9IGdlbmVyYXRlVW5peEV4dGVybmFsRmlsZUF0dHIoZmlsZS51bml4UGVy" +
        "bWlzc2lvbnMsIGRpcik7CiAgICB9IGVsc2UgeyAvLyBET1Mgb3Igb3RoZXIsIGZhbGxiYWNrIHRvIERPUwogICAgICAgIHZlcnNpb25NYWRlQnkgPSAweDAwMTQ7IC8vIERPUywgdmVyc2lvbiAyLjAKICAgICAg" +
        "ICBleHRGaWxlQXR0ciB8PSBnZW5lcmF0ZURvc0V4dGVybmFsRmlsZUF0dHIoZmlsZS5kb3NQZXJtaXNzaW9ucywgZGlyKTsKICAgIH0KCiAgICAvLyBkYXRlCiAgICAvLyBAc2VlIGh0dHA6Ly93d3cuZGVsb3Jp" +
        "ZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNTIvMTMuaHRtbAogICAgLy8gQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWwKICAgIC8vIEBzZWUgaHR0" +
        "cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sCgogICAgZG9zVGltZSA9IGRhdGUuZ2V0VVRDSG91cnMoKTsKICAgIGRvc1RpbWUgPSBkb3NUaW1lIDw8IDY7CiAgICBk" +
        "b3NUaW1lID0gZG9zVGltZSB8IGRhdGUuZ2V0VVRDTWludXRlcygpOwogICAgZG9zVGltZSA9IGRvc1RpbWUgPDwgNTsKICAgIGRvc1RpbWUgPSBkb3NUaW1lIHwgZGF0ZS5nZXRVVENTZWNvbmRzKCkgLyAyOwoK" +
        "ICAgIGRvc0RhdGUgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTgwOwogICAgZG9zRGF0ZSA9IGRvc0RhdGUgPDwgNDsKICAgIGRvc0RhdGUgPSBkb3NEYXRlIHwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEp" +
        "OwogICAgZG9zRGF0ZSA9IGRvc0RhdGUgPDwgNTsKICAgIGRvc0RhdGUgPSBkb3NEYXRlIHwgZGF0ZS5nZXRVVENEYXRlKCk7CgogICAgaWYgKHVzZVVURjhGb3JGaWxlTmFtZSkgewogICAgICAgIC8vIHNldCB0" +
        "aGUgdW5pY29kZSBwYXRoIGV4dHJhIGZpZWxkLiB1bnppcCBuZWVkcyBhdCBsZWFzdCBvbmUgZXh0cmEKICAgICAgICAvLyBmaWVsZCB0byBjb3JyZWN0bHkgaGFuZGxlIHVuaWNvZGUgcGF0aCwgc28gdXNpbmcg" +
        "dGhlIHBhdGggaXMgYXMgZ29vZAogICAgICAgIC8vIGFzIGFueSBvdGhlciBpbmZvcm1hdGlvbi4gVGhpcyBjb3VsZCBpbXByb3ZlIHRoZSBzaXR1YXRpb24gd2l0aAogICAgICAgIC8vIG90aGVyIGFyY2hpdmUg" +
        "bWFuYWdlcnMgdG9vLgogICAgICAgIC8vIFRoaXMgZmllbGQgaXMgdXN1YWxseSB1c2VkIHdpdGhvdXQgdGhlIHV0ZjggZmxhZywgd2l0aCBhIG5vbgogICAgICAgIC8vIHVuaWNvZGUgcGF0aCBpbiB0aGUgaGVh" +
        "ZGVyICh3aW5yYXIsIHdpbnppcCkuIFRoaXMgaGVscHMgKGEgYml0KQogICAgICAgIC8vIHdpdGggdGhlIG1lc3N5IFdpbmRvd3MnIGRlZmF1bHQgY29tcHJlc3NlZCBmb2xkZXJzIGZlYXR1cmUgYnV0CiAgICAg" +
        "ICAgLy8gYnJlYWtzIG9uIHA3emlwIHdoaWNoIGRvZXNuJ3Qgc2VlayB0aGUgdW5pY29kZSBwYXRoIGV4dHJhIGZpZWxkLgogICAgICAgIC8vIFNvIGZvciBub3csIFVURi04IGV2ZXJ5d2hlcmUgIQogICAgICAg" +
        "IHVuaWNvZGVQYXRoRXh0cmFGaWVsZCA9CiAgICAgICAgICAgIC8vIFZlcnNpb24KICAgICAgICAgICAgZGVjVG9IZXgoMSwgMSkgKwogICAgICAgICAgICAvLyBOYW1lQ1JDMzIKICAgICAgICAgICAgZGVjVG9I" +
        "ZXgoY3JjMzIoZW5jb2RlZEZpbGVOYW1lKSwgNCkgKwogICAgICAgICAgICAvLyBVbmljb2RlTmFtZQogICAgICAgICAgICB1dGZFbmNvZGVkRmlsZU5hbWU7CgogICAgICAgIGV4dHJhRmllbGRzICs9CiAgICAg" +
        "ICAgICAgIC8vIEluZm8tWklQIFVuaWNvZGUgUGF0aCBFeHRyYSBGaWVsZAogICAgICAgICAgICAiXHg3NVx4NzAiICsKICAgICAgICAgICAgLy8gc2l6ZQogICAgICAgICAgICBkZWNUb0hleCh1bmljb2RlUGF0" +
        "aEV4dHJhRmllbGQubGVuZ3RoLCAyKSArCiAgICAgICAgICAgIC8vIGNvbnRlbnQKICAgICAgICAgICAgdW5pY29kZVBhdGhFeHRyYUZpZWxkOwogICAgfQoKICAgIGlmKHVzZVVURjhGb3JDb21tZW50KSB7Cgog" +
        "ICAgICAgIHVuaWNvZGVDb21tZW50RXh0cmFGaWVsZCA9CiAgICAgICAgICAgIC8vIFZlcnNpb24KICAgICAgICAgICAgZGVjVG9IZXgoMSwgMSkgKwogICAgICAgICAgICAvLyBDb21tZW50Q1JDMzIKICAgICAg" +
        "ICAgICAgZGVjVG9IZXgoY3JjMzIoZW5jb2RlZENvbW1lbnQpLCA0KSArCiAgICAgICAgICAgIC8vIFVuaWNvZGVOYW1lCiAgICAgICAgICAgIHV0ZkVuY29kZWRDb21tZW50OwoKICAgICAgICBleHRyYUZpZWxk" +
        "cyArPQogICAgICAgICAgICAvLyBJbmZvLVpJUCBVbmljb2RlIFBhdGggRXh0cmEgRmllbGQKICAgICAgICAgICAgIlx4NzVceDYzIiArCiAgICAgICAgICAgIC8vIHNpemUKICAgICAgICAgICAgZGVjVG9IZXgo" +
        "dW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkLmxlbmd0aCwgMikgKwogICAgICAgICAgICAvLyBjb250ZW50CiAgICAgICAgICAgIHVuaWNvZGVDb21tZW50RXh0cmFGaWVsZDsKICAgIH0KCiAgICB2YXIgaGVhZGVy" +
        "ID0gIiI7CgogICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdAogICAgaGVhZGVyICs9ICJceDBBXHgwMCI7CiAgICAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcKICAgIGhlYWRlciArPSBkZWNUb0hl" +
        "eChiaXRmbGFnLCAyKTsKICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZAogICAgaGVhZGVyICs9IGNvbXByZXNzaW9uLm1hZ2ljOwogICAgLy8gbGFzdCBtb2QgZmlsZSB0aW1lCiAgICBoZWFkZXIgKz0gZGVjVG9I" +
        "ZXgoZG9zVGltZSwgMik7CiAgICAvLyBsYXN0IG1vZCBmaWxlIGRhdGUKICAgIGhlYWRlciArPSBkZWNUb0hleChkb3NEYXRlLCAyKTsKICAgIC8vIGNyYy0zMgogICAgaGVhZGVyICs9IGRlY1RvSGV4KGRhdGFJ" +
        "bmZvLmNyYzMyLCA0KTsKICAgIC8vIGNvbXByZXNzZWQgc2l6ZQogICAgaGVhZGVyICs9IGRlY1RvSGV4KGRhdGFJbmZvLmNvbXByZXNzZWRTaXplLCA0KTsKICAgIC8vIHVuY29tcHJlc3NlZCBzaXplCiAgICBo" +
        "ZWFkZXIgKz0gZGVjVG9IZXgoZGF0YUluZm8udW5jb21wcmVzc2VkU2l6ZSwgNCk7CiAgICAvLyBmaWxlIG5hbWUgbGVuZ3RoCiAgICBoZWFkZXIgKz0gZGVjVG9IZXgoZW5jb2RlZEZpbGVOYW1lLmxlbmd0aCwg" +
        "Mik7CiAgICAvLyBleHRyYSBmaWVsZCBsZW5ndGgKICAgIGhlYWRlciArPSBkZWNUb0hleChleHRyYUZpZWxkcy5sZW5ndGgsIDIpOwoKCiAgICB2YXIgZmlsZVJlY29yZCA9IHNpZ25hdHVyZS5MT0NBTF9GSUxF" +
        "X0hFQURFUiArIGhlYWRlciArIGVuY29kZWRGaWxlTmFtZSArIGV4dHJhRmllbGRzOwoKICAgIHZhciBkaXJSZWNvcmQgPSBzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUiArCiAgICAgICAgLy8gdmVyc2lv" +
        "biBtYWRlIGJ5ICgwMDogRE9TKQogICAgICAgIGRlY1RvSGV4KHZlcnNpb25NYWRlQnksIDIpICsKICAgICAgICAvLyBmaWxlIGhlYWRlciAoY29tbW9uIHRvIGZpbGUgYW5kIGNlbnRyYWwgZGlyZWN0b3J5KQog" +
        "ICAgICAgIGhlYWRlciArCiAgICAgICAgLy8gZmlsZSBjb21tZW50IGxlbmd0aAogICAgICAgIGRlY1RvSGV4KGVuY29kZWRDb21tZW50Lmxlbmd0aCwgMikgKwogICAgICAgIC8vIGRpc2sgbnVtYmVyIHN0YXJ0" +
        "CiAgICAgICAgIlx4MDBceDAwIiArCiAgICAgICAgLy8gaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIFRPRE8KICAgICAgICAiXHgwMFx4MDAiICsKICAgICAgICAvLyBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMK" +
        "ICAgICAgICBkZWNUb0hleChleHRGaWxlQXR0ciwgNCkgKwogICAgICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXIKICAgICAgICBkZWNUb0hleChvZmZzZXQsIDQpICsKICAgICAgICAvLyBm" +
        "aWxlIG5hbWUKICAgICAgICBlbmNvZGVkRmlsZU5hbWUgKwogICAgICAgIC8vIGV4dHJhIGZpZWxkCiAgICAgICAgZXh0cmFGaWVsZHMgKwogICAgICAgIC8vIGZpbGUgY29tbWVudAogICAgICAgIGVuY29kZWRD" +
        "b21tZW50OwoKICAgIHJldHVybiB7CiAgICAgICAgZmlsZVJlY29yZDogZmlsZVJlY29yZCwKICAgICAgICBkaXJSZWNvcmQ6IGRpclJlY29yZAogICAgfTsKfTsKCi8qKgogKiBHZW5lcmF0ZSB0aGUgRU9DRCBy" +
        "ZWNvcmQuCiAqIEBwYXJhbSB7TnVtYmVyfSBlbnRyaWVzQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS4KICogQHBhcmFtIHtOdW1iZXJ9IGNlbnRyYWxEaXJMZW5ndGggdGhlIGxl" +
        "bmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBjZW50cmFsIGRpci4KICogQHBhcmFtIHtOdW1iZXJ9IGxvY2FsRGlyTGVuZ3RoIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbG9jYWwgZGlyLgogKiBAcGFyYW0g" +
        "e1N0cmluZ30gY29tbWVudCB0aGUgemlwIGZpbGUgY29tbWVudCBhcyBhIGJpbmFyeSBzdHJpbmcuCiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZUZpbGVOYW1lIHRoZSBmdW5jdGlvbiB0byBlbmNvZGUgdGhl" +
        "IGNvbW1lbnQuCiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIEVPQ0QgcmVjb3JkLgogKi8KdmFyIGdlbmVyYXRlQ2VudHJhbERpcmVjdG9yeUVuZCA9IGZ1bmN0aW9uIChlbnRyaWVzQ291bnQsIGNlbnRyYWxEaXJM" +
        "ZW5ndGgsIGxvY2FsRGlyTGVuZ3RoLCBjb21tZW50LCBlbmNvZGVGaWxlTmFtZSkgewogICAgdmFyIGRpckVuZCA9ICIiOwogICAgdmFyIGVuY29kZWRDb21tZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oInN0cmlu" +
        "ZyIsIGVuY29kZUZpbGVOYW1lKGNvbW1lbnQpKTsKCiAgICAvLyBlbmQgb2YgY2VudHJhbCBkaXIgc2lnbmF0dXJlCiAgICBkaXJFbmQgPSBzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EICsKICAgICAg" +
        "ICAvLyBudW1iZXIgb2YgdGhpcyBkaXNrCiAgICAgICAgIlx4MDBceDAwIiArCiAgICAgICAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQogICAg" +
        "ICAgICJceDAwXHgwMCIgKwogICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sKICAgICAgICBkZWNUb0hleChlbnRyaWVzQ291bnQs" +
        "IDIpICsKICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkKICAgICAgICBkZWNUb0hleChlbnRyaWVzQ291bnQsIDIpICsKICAgICAgICAvLyBzaXplIG9m" +
        "IHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgIDQgYnl0ZXMKICAgICAgICBkZWNUb0hleChjZW50cmFsRGlyTGVuZ3RoLCA0KSArCiAgICAgICAgLy8gb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5" +
        "IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhcnRpbmcgZGlzayBudW1iZXIKICAgICAgICBkZWNUb0hleChsb2NhbERpckxlbmd0aCwgNCkgKwogICAgICAgIC8vIC5aSVAgZmlsZSBjb21tZW50IGxlbmd0aAogICAg" +
        "ICAgIGRlY1RvSGV4KGVuY29kZWRDb21tZW50Lmxlbmd0aCwgMikgKwogICAgICAgIC8vIC5aSVAgZmlsZSBjb21tZW50CiAgICAgICAgZW5jb2RlZENvbW1lbnQ7CgogICAgcmV0dXJuIGRpckVuZDsKfTsKCi8q" +
        "KgogKiBHZW5lcmF0ZSBkYXRhIGRlc2NyaXB0b3JzIGZvciBhIGZpbGUgZW50cnkuCiAqIEBwYXJhbSB7T2JqZWN0fSBzdHJlYW1JbmZvIHRoZSBoYXNoIGdlbmVyYXRlZCBieSBhIHdvcmtlciwgY29udGFpbmlu" +
        "ZyBpbmZvcm1hdGlvbgogKiBvbiB0aGUgZmlsZSBlbnRyeS4KICogQHJldHVybiB7U3RyaW5nfSB0aGUgZGF0YSBkZXNjcmlwdG9ycy4KICovCnZhciBnZW5lcmF0ZURhdGFEZXNjcmlwdG9ycyA9IGZ1bmN0aW9u" +
        "IChzdHJlYW1JbmZvKSB7CiAgICB2YXIgZGVzY3JpcHRvciA9ICIiOwogICAgZGVzY3JpcHRvciA9IHNpZ25hdHVyZS5EQVRBX0RFU0NSSVBUT1IgKwogICAgICAgIC8vIGNyYy0zMiAgICAgICAgICAgICAgICAg" +
        "ICAgICAgICAgNCBieXRlcwogICAgICAgIGRlY1RvSGV4KHN0cmVhbUluZm9bJ2NyYzMyJ10sIDQpICsKICAgICAgICAvLyBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDQgYnl0ZXMKICAgICAgICBk" +
        "ZWNUb0hleChzdHJlYW1JbmZvWydjb21wcmVzc2VkU2l6ZSddLCA0KSArCiAgICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICA0IGJ5dGVzCiAgICAgICAgZGVjVG9IZXgoc3RyZWFtSW5m" +
        "b1sndW5jb21wcmVzc2VkU2l6ZSddLCA0KTsKCiAgICByZXR1cm4gZGVzY3JpcHRvcjsKfTsKCgovKioKICogQSB3b3JrZXIgdG8gY29uY2F0ZW5hdGUgb3RoZXIgd29ya2VycyB0byBjcmVhdGUgYSB6aXAgZmls" +
        "ZS4KICogQHBhcmFtIHtCb29sZWFufSBzdHJlYW1GaWxlcyBgdHJ1ZWAgdG8gc3RyZWFtIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlcywKICogYGZhbHNlYCB0byBhY2N1bXVsYXRlIGl0LgogKiBAcGFyYW0ge1N0" +
        "cmluZ30gY29tbWVudCB0aGUgY29tbWVudCB0byB1c2UuCiAqIEBwYXJhbSB7U3RyaW5nfSBwbGF0Zm9ybSB0aGUgcGxhdGZvcm0gdG8gdXNlLCAiVU5JWCIgb3IgIkRPUyIuCiAqIEBwYXJhbSB7RnVuY3Rpb259" +
        "IGVuY29kZUZpbGVOYW1lIHRoZSBmdW5jdGlvbiB0byBlbmNvZGUgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMuCiAqLwpmdW5jdGlvbiBaaXBGaWxlV29ya2VyKHN0cmVhbUZpbGVzLCBjb21tZW50LCBwbGF0Zm9y" +
        "bSwgZW5jb2RlRmlsZU5hbWUpIHsKICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCAiWmlwRmlsZVdvcmtlciIpOwogICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNvIGZhci4gVGhpcyBkb2Vz" +
        "bid0IGNvdW50IGFjY3VtdWxhdGVkIGNodW5rcy4KICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDsKICAgIC8vIFRoZSBjb21tZW50IG9mIHRoZSB6aXAgZmlsZQogICAgdGhpcy56aXBDb21tZW50ID0gY29tbWVu" +
        "dDsKICAgIC8vIFRoZSBwbGF0Zm9ybSAiZ2VuZXJhdGluZyIgdGhlIHppcCBmaWxlLgogICAgdGhpcy56aXBQbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgLy8gdGhlIGZ1bmN0aW9uIHRvIGVuY29kZSBmaWxlIG5h" +
        "bWVzIGFuZCBjb21tZW50cy4KICAgIHRoaXMuZW5jb2RlRmlsZU5hbWUgPSBlbmNvZGVGaWxlTmFtZTsKICAgIC8vIFNob3VsZCB3ZSBzdHJlYW0gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVzID8KICAgIHRoaXMu" +
        "c3RyZWFtRmlsZXMgPSBzdHJlYW1GaWxlczsKICAgIC8vIElmIGBzdHJlYW1GaWxlc2AgaXMgZmFsc2UsIHdlIHdpbGwgbmVlZCB0byBhY2N1bXVsYXRlIHRoZSBjb250ZW50IG9mIHRoZQogICAgLy8gZmlsZXMg" +
        "dG8gY2FsY3VsYXRlIHNpemVzIC8gY3JjMzIgKGFuZCB3cml0ZSB0aGVtICpiZWZvcmUqIHRoZSBjb250ZW50KS4KICAgIC8vIFRoaXMgYm9vbGVhbiBpbmRpY2F0ZXMgaWYgd2UgYXJlIGFjY3VtdWxhdGluZyBj" +
        "aHVua3MgKGl0IHdpbGwgY2hhbmdlIGEgbG90CiAgICAvLyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgd29ya2VyKS4KICAgIHRoaXMuYWNjdW11bGF0ZSA9IGZhbHNlOwogICAgLy8gVGhlIGJ1ZmZlciBy" +
        "ZWNlaXZpbmcgY2h1bmtzIHdoZW4gYWNjdW11bGF0aW5nIGNvbnRlbnQuCiAgICB0aGlzLmNvbnRlbnRCdWZmZXIgPSBbXTsKICAgIC8vIFRoZSBsaXN0IG9mIGdlbmVyYXRlZCBkaXJlY3RvcnkgcmVjb3Jkcy4K" +
        "ICAgIHRoaXMuZGlyUmVjb3JkcyA9IFtdOwogICAgLy8gVGhlIG9mZnNldCAoaW4gYnl0ZXMpIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgemlwIGZpbGUgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgIHRo" +
        "aXMuY3VycmVudFNvdXJjZU9mZnNldCA9IDA7CiAgICAvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB6aXAgZmlsZS4KICAgIHRoaXMuZW50cmllc0NvdW50ID0gMDsKICAgIC8vIHRoZSBu" +
        "YW1lIG9mIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgbnVsbCB3aGVuIGhhbmRsaW5nIHRoZSBlbmQgb2YgdGhlIHppcCBmaWxlLgogICAgLy8gVXNlZCBmb3IgdGhlIGVtaXR0ZWQgbWV0YWRhdGEu" +
        "CiAgICB0aGlzLmN1cnJlbnRGaWxlID0gbnVsbDsKCgoKICAgIHRoaXMuX3NvdXJjZXMgPSBbXTsKfQp1dGlscy5pbmhlcml0cyhaaXBGaWxlV29ya2VyLCBHZW5lcmljV29ya2VyKTsKCi8qKgogKiBAc2VlIEdl" +
        "bmVyaWNXb3JrZXIucHVzaAogKi8KWmlwRmlsZVdvcmtlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaykgewoKICAgIHZhciBjdXJyZW50RmlsZVBlcmNlbnQgPSBjaHVuay5tZXRhLnBlcmNlbnQg" +
        "fHwgMDsKICAgIHZhciBlbnRyaWVzQ291bnQgPSB0aGlzLmVudHJpZXNDb3VudDsKICAgIHZhciByZW1haW5pbmdGaWxlcyA9IHRoaXMuX3NvdXJjZXMubGVuZ3RoOwoKICAgIGlmKHRoaXMuYWNjdW11bGF0ZSkg" +
        "ewogICAgICAgIHRoaXMuY29udGVudEJ1ZmZlci5wdXNoKGNodW5rKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gY2h1bmsuZGF0YS5sZW5ndGg7CgogICAgICAgIEdlbmVyaWNX" +
        "b3JrZXIucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCB7CiAgICAgICAgICAgIGRhdGEgOiBjaHVuay5kYXRhLAogICAgICAgICAgICBtZXRhIDogewogICAgICAgICAgICAgICAgY3VycmVudEZpbGUgOiB0aGlz" +
        "LmN1cnJlbnRGaWxlLAogICAgICAgICAgICAgICAgcGVyY2VudCA6IGVudHJpZXNDb3VudCA/IChjdXJyZW50RmlsZVBlcmNlbnQgKyAxMDAgKiAoZW50cmllc0NvdW50IC0gcmVtYWluaW5nRmlsZXMgLSAxKSkg" +
        "LyBlbnRyaWVzQ291bnQgOiAxMDAKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQp9OwoKLyoqCiAqIFRoZSB3b3JrZXIgc3RhcnRlZCBhIG5ldyBzb3VyY2UgKGFuIG90aGVyIHdvcmtlcikuCiAqIEBw" +
        "YXJhbSB7T2JqZWN0fSBzdHJlYW1JbmZvIHRoZSBzdHJlYW1JbmZvIG9iamVjdCBmcm9tIHRoZSBuZXcgc291cmNlLgogKi8KWmlwRmlsZVdvcmtlci5wcm90b3R5cGUub3BlbmVkU291cmNlID0gZnVuY3Rpb24g" +
        "KHN0cmVhbUluZm8pIHsKICAgIHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCA9IHRoaXMuYnl0ZXNXcml0dGVuOwogICAgdGhpcy5jdXJyZW50RmlsZSA9IHN0cmVhbUluZm9bJ2ZpbGUnXS5uYW1lOwoKICAgIHZh" +
        "ciBzdHJlYW1lZENvbnRlbnQgPSB0aGlzLnN0cmVhbUZpbGVzICYmICFzdHJlYW1JbmZvWydmaWxlJ10uZGlyOwoKICAgIC8vIGRvbid0IHN0cmVhbSBmb2xkZXJzIChiZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSBh" +
        "bnkgY29udGVudCkKICAgIGlmKHN0cmVhbWVkQ29udGVudCkgewogICAgICAgIHZhciByZWNvcmQgPSBnZW5lcmF0ZVppcFBhcnRzKHN0cmVhbUluZm8sIHN0cmVhbWVkQ29udGVudCwgZmFsc2UsIHRoaXMuY3Vy" +
        "cmVudFNvdXJjZU9mZnNldCwgdGhpcy56aXBQbGF0Zm9ybSwgdGhpcy5lbmNvZGVGaWxlTmFtZSk7CiAgICAgICAgdGhpcy5wdXNoKHsKICAgICAgICAgICAgZGF0YSA6IHJlY29yZC5maWxlUmVjb3JkLAogICAg" +
        "ICAgICAgICBtZXRhIDoge3BlcmNlbnQ6MH0KICAgICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgd2hvbGUgZmlsZSBiZWZvcmUgcHVzaGluZyBhbnl0aGlu" +
        "ZwogICAgICAgIHRoaXMuYWNjdW11bGF0ZSA9IHRydWU7CiAgICB9Cn07CgovKioKICogVGhlIHdvcmtlciBmaW5pc2hlZCBhIHNvdXJjZSAoYW4gb3RoZXIgd29ya2VyKS4KICogQHBhcmFtIHtPYmplY3R9IHN0" +
        "cmVhbUluZm8gdGhlIHN0cmVhbUluZm8gb2JqZWN0IGZyb20gdGhlIGZpbmlzaGVkIHNvdXJjZS4KICovClppcEZpbGVXb3JrZXIucHJvdG90eXBlLmNsb3NlZFNvdXJjZSA9IGZ1bmN0aW9uIChzdHJlYW1JbmZv" +
        "KSB7CiAgICB0aGlzLmFjY3VtdWxhdGUgPSBmYWxzZTsKICAgIHZhciBzdHJlYW1lZENvbnRlbnQgPSB0aGlzLnN0cmVhbUZpbGVzICYmICFzdHJlYW1JbmZvWydmaWxlJ10uZGlyOwogICAgdmFyIHJlY29yZCA9" +
        "IGdlbmVyYXRlWmlwUGFydHMoc3RyZWFtSW5mbywgc3RyZWFtZWRDb250ZW50LCB0cnVlLCB0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsIHRoaXMuemlwUGxhdGZvcm0sIHRoaXMuZW5jb2RlRmlsZU5hbWUpOwoK" +
        "ICAgIHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHJlY29yZC5kaXJSZWNvcmQpOwogICAgaWYoc3RyZWFtZWRDb250ZW50KSB7CiAgICAgICAgLy8gYWZ0ZXIgdGhlIHN0cmVhbWVkIGZpbGUsIHdlIHB1dCBkYXRhIGRl" +
        "c2NyaXB0b3JzCiAgICAgICAgdGhpcy5wdXNoKHsKICAgICAgICAgICAgZGF0YSA6IGdlbmVyYXRlRGF0YURlc2NyaXB0b3JzKHN0cmVhbUluZm8pLAogICAgICAgICAgICBtZXRhIDoge3BlcmNlbnQ6MTAwfQog" +
        "ICAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgICAvLyB0aGUgY29udGVudCB3YXNuJ3Qgc3RyZWFtZWQsIHdlIG5lZWQgdG8gcHVzaCBldmVyeXRoaW5nIG5vdwogICAgICAgIC8vIGZpcnN0IHRoZSBmaWxl" +
        "IHJlY29yZCwgdGhlbiB0aGUgY29udGVudAogICAgICAgIHRoaXMucHVzaCh7CiAgICAgICAgICAgIGRhdGEgOiByZWNvcmQuZmlsZVJlY29yZCwKICAgICAgICAgICAgbWV0YSA6IHtwZXJjZW50OjB9CiAgICAg" +
        "ICAgfSk7CiAgICAgICAgd2hpbGUodGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jb250ZW50QnVmZmVyLnNoaWZ0KCkpOwogICAgICAgIH0KICAgIH0KICAg" +
        "IHRoaXMuY3VycmVudEZpbGUgPSBudWxsOwp9OwoKLyoqCiAqIEBzZWUgR2VuZXJpY1dvcmtlci5mbHVzaAogKi8KWmlwRmlsZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7CgogICAgdmFy" +
        "IGxvY2FsRGlyTGVuZ3RoID0gdGhpcy5ieXRlc1dyaXR0ZW47CiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXJSZWNvcmRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5wdXNoKHsKICAgICAgICAg" +
        "ICAgZGF0YSA6IHRoaXMuZGlyUmVjb3Jkc1tpXSwKICAgICAgICAgICAgbWV0YSA6IHtwZXJjZW50OjEwMH0KICAgICAgICB9KTsKICAgIH0KICAgIHZhciBjZW50cmFsRGlyTGVuZ3RoID0gdGhpcy5ieXRlc1dy" +
        "aXR0ZW4gLSBsb2NhbERpckxlbmd0aDsKCiAgICB2YXIgZGlyRW5kID0gZ2VuZXJhdGVDZW50cmFsRGlyZWN0b3J5RW5kKHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGgsIGNlbnRyYWxEaXJMZW5ndGgsIGxvY2FsRGly" +
        "TGVuZ3RoLCB0aGlzLnppcENvbW1lbnQsIHRoaXMuZW5jb2RlRmlsZU5hbWUpOwoKICAgIHRoaXMucHVzaCh7CiAgICAgICAgZGF0YSA6IGRpckVuZCwKICAgICAgICBtZXRhIDoge3BlcmNlbnQ6MTAwfQogICAg" +
        "fSk7Cn07CgovKioKICogUHJlcGFyZSB0aGUgbmV4dCBzb3VyY2UgdG8gYmUgcmVhZC4KICovClppcEZpbGVXb3JrZXIucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlID0gZnVuY3Rpb24gKCkgewogICAgdGhp" +
        "cy5wcmV2aW91cyA9IHRoaXMuX3NvdXJjZXMuc2hpZnQoKTsKICAgIHRoaXMub3BlbmVkU291cmNlKHRoaXMucHJldmlvdXMuc3RyZWFtSW5mbyk7CiAgICBpZiAodGhpcy5pc1BhdXNlZCkgewogICAgICAgIHRo" +
        "aXMucHJldmlvdXMucGF1c2UoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5wcmV2aW91cy5yZXN1bWUoKTsKICAgIH0KfTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVnaXN0ZXJQcmV2aW91cwog" +
        "Ki8KWmlwRmlsZVdvcmtlci5wcm90b3R5cGUucmVnaXN0ZXJQcmV2aW91cyA9IGZ1bmN0aW9uIChwcmV2aW91cykgewogICAgdGhpcy5fc291cmNlcy5wdXNoKHByZXZpb3VzKTsKICAgIHZhciBzZWxmID0gdGhp" +
        "czsKCiAgICBwcmV2aW91cy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgewogICAgICAgIHNlbGYucHJvY2Vzc0NodW5rKGNodW5rKTsKICAgIH0pOwogICAgcHJldmlvdXMub24oJ2VuZCcsIGZ1bmN0aW9u" +
        "ICgpIHsKICAgICAgICBzZWxmLmNsb3NlZFNvdXJjZShzZWxmLnByZXZpb3VzLnN0cmVhbUluZm8pOwogICAgICAgIGlmKHNlbGYuX3NvdXJjZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHNlbGYucHJlcGFyZU5l" +
        "eHRTb3VyY2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLmVuZCgpOwogICAgICAgIH0KICAgIH0pOwogICAgcHJldmlvdXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBz" +
        "ZWxmLmVycm9yKGUpOwogICAgfSk7CiAgICByZXR1cm4gdGhpczsKfTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lCiAqLwpaaXBGaWxlV29ya2VyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlv" +
        "biAoKSB7CiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKCF0aGlzLnByZXZpb3VzICYmIHRoaXMu" +
        "X3NvdXJjZXMubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5wcmVwYXJlTmV4dFNvdXJjZSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCF0aGlzLnByZXZpb3VzICYmICF0aGlzLl9zb3VyY2Vz" +
        "Lmxlbmd0aCAmJiAhdGhpcy5nZW5lcmF0ZWRFcnJvcikgewogICAgICAgIHRoaXMuZW5kKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn07CgovKioKICogQHNlZSBHZW5lcmljV29ya2VyLmVycm9yCiAq" +
        "LwpaaXBGaWxlV29ya2VyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICB2YXIgc291cmNlcyA9IHRoaXMuX3NvdXJjZXM7CiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuZXJyb3Iu" +
        "Y2FsbCh0aGlzLCBlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc291" +
        "cmNlc1tpXS5lcnJvcihlKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgLy8gdGhlIGBlcnJvcmAgZXhwbG9kZWQsIG5vdGhpbmcgdG8gZG8KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1" +
        "ZTsKfTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIubG9jawogKi8KWmlwRmlsZVdvcmtlci5wcm90b3R5cGUubG9jayA9IGZ1bmN0aW9uICgpIHsKICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmxvY2su" +
        "Y2FsbCh0aGlzKTsKICAgIHZhciBzb3VyY2VzID0gdGhpcy5fc291cmNlczsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc291cmNlc1tpXS5sb2NrKCk7CiAg" +
        "ICB9Cn07Cgptb2R1bGUuZXhwb3J0cyA9IFppcEZpbGVXb3JrZXI7Cgp9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4u" +
        "L3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgp2YXIgY29tcHJlc3Npb25zID0gcmVxdWlyZSgnLi4vY29tcHJlc3Npb25zJyk7CnZhciBaaXBG" +
        "aWxlV29ya2VyID0gcmVxdWlyZSgnLi9aaXBGaWxlV29ya2VyJyk7CgovKioKICogRmluZCB0aGUgY29tcHJlc3Npb24gdG8gdXNlLgogKiBAcGFyYW0ge1N0cmluZ30gZmlsZUNvbXByZXNzaW9uIHRoZSBjb21w" +
        "cmVzc2lvbiBkZWZpbmVkIGF0IHRoZSBmaWxlIGxldmVsLCBpZiBhbnkuCiAqIEBwYXJhbSB7U3RyaW5nfSB6aXBDb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gZGVmaW5lZCBhdCB0aGUgbG9hZCgpIGxldmVs" +
        "LgogKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBjb21wcmVzc2lvbiBvYmplY3QgdG8gdXNlLgogKi8KdmFyIGdldENvbXByZXNzaW9uID0gZnVuY3Rpb24gKGZpbGVDb21wcmVzc2lvbiwgemlwQ29tcHJlc3Npb24p" +
        "IHsKCiAgICB2YXIgY29tcHJlc3Npb25OYW1lID0gZmlsZUNvbXByZXNzaW9uIHx8IHppcENvbXByZXNzaW9uOwogICAgdmFyIGNvbXByZXNzaW9uID0gY29tcHJlc3Npb25zW2NvbXByZXNzaW9uTmFtZV07CiAg" +
        "ICBpZiAoIWNvbXByZXNzaW9uKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXByZXNzaW9uTmFtZSArICIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTsKICAgIH0KICAgIHJldHVy" +
        "biBjb21wcmVzc2lvbjsKfTsKCi8qKgogKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2VuZXJhdGUgYSB6aXAgZmlsZS4KICogQHBhcmFtIHtKU1ppcH0gemlwIHRoZSBKU1ppcCBpbnN0YW5jZSBhdCB0aGUgcmlnaHQg" +
        "cm9vdCBsZXZlbC4KICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlLgogKiBAcGFyYW0ge1N0cmluZ30gY29tbWVudCB0aGUgY29tbWVudCB0byB1c2UuCiAqLwpleHBv" +
        "cnRzLmdlbmVyYXRlV29ya2VyID0gZnVuY3Rpb24gKHppcCwgb3B0aW9ucywgY29tbWVudCkgewoKICAgIHZhciB6aXBGaWxlV29ya2VyID0gbmV3IFppcEZpbGVXb3JrZXIob3B0aW9ucy5zdHJlYW1GaWxlcywg" +
        "Y29tbWVudCwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5lbmNvZGVGaWxlTmFtZSk7CiAgICB2YXIgZW50cmllc0NvdW50ID0gMDsKICAgIHRyeSB7CgogICAgICAgIHppcC5mb3JFYWNoKGZ1bmN0aW9uIChy" +
        "ZWxhdGl2ZVBhdGgsIGZpbGUpIHsKICAgICAgICAgICAgZW50cmllc0NvdW50Kys7CiAgICAgICAgICAgIHZhciBjb21wcmVzc2lvbiA9IGdldENvbXByZXNzaW9uKGZpbGUub3B0aW9ucy5jb21wcmVzc2lvbiwg" +
        "b3B0aW9ucy5jb21wcmVzc2lvbik7CiAgICAgICAgICAgIHZhciBjb21wcmVzc2lvbk9wdGlvbnMgPSBmaWxlLm9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25zIHx8IG9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25z" +
        "IHx8IHt9OwogICAgICAgICAgICB2YXIgZGlyID0gZmlsZS5kaXIsIGRhdGUgPSBmaWxlLmRhdGU7CgogICAgICAgICAgICBmaWxlLl9jb21wcmVzc1dvcmtlcihjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRp" +
        "b25zKQogICAgICAgICAgICAud2l0aFN0cmVhbUluZm8oImZpbGUiLCB7CiAgICAgICAgICAgICAgICBuYW1lIDogcmVsYXRpdmVQYXRoLAogICAgICAgICAgICAgICAgZGlyIDogZGlyLAogICAgICAgICAgICAg" +
        "ICAgZGF0ZSA6IGRhdGUsCiAgICAgICAgICAgICAgICBjb21tZW50IDogZmlsZS5jb21tZW50IHx8ICIiLAogICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogZmlsZS51bml4UGVybWlzc2lvbnMsCiAg" +
        "ICAgICAgICAgICAgICBkb3NQZXJtaXNzaW9ucyA6IGZpbGUuZG9zUGVybWlzc2lvbnMKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnBpcGUoemlwRmlsZVdvcmtlcik7CiAgICAgICAgfSk7CiAgICAgICAg" +
        "emlwRmlsZVdvcmtlci5lbnRyaWVzQ291bnQgPSBlbnRyaWVzQ291bnQ7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgemlwRmlsZVdvcmtlci5lcnJvcihlKTsKICAgIH0KCiAgICByZXR1cm4gemlwRmlsZVdv" +
        "cmtlcjsKfTsKCn0seyIuLi9jb21wcmVzc2lvbnMiOjMsIi4vWmlwRmlsZVdvcmtlciI6OH1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKLyoqCiAqIFJlcHJl" +
        "c2VudGF0aW9uIGEgb2YgemlwIGZpbGUgaW4ganMKICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBKU1ppcCgpIHsKICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aXRob3V0IGBuZXdgLCBp" +
        "dCBhZGRzIGBuZXdgIGJlZm9yZSBpdHNlbGY6CiAgICBpZighKHRoaXMgaW5zdGFuY2VvZiBKU1ppcCkpIHsKICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7CiAgICB9CgogICAgaWYoYXJndW1lbnRzLmxlbmd0" +
        "aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1" +
        "aWRlLiIpOwogICAgfQoKICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6CiAgICAvLyB7CiAgICAvLyAgICJmb2xkZXIvIiA6IHsuLi59LAogICAgLy8gICAiZm9sZGVyL2RhdGEudHh0IiA6IHsu" +
        "Li59CiAgICAvLyB9CiAgICB0aGlzLmZpbGVzID0ge307CgogICAgdGhpcy5jb21tZW50ID0gbnVsbDsKCiAgICAvLyBXaGVyZSB3ZSBhcmUgaW4gdGhlIGhpZXJhcmNoeQogICAgdGhpcy5yb290ID0gIiI7CiAg" +
        "ICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpOwogICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNb" +
        "aV0gIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIG5ld09ialtpXSA9IHRoaXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iajsKICAgIH07Cn0KSlNaaXAu" +
        "cHJvdG90eXBlID0gcmVxdWlyZSgnLi9vYmplY3QnKTsKSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpOwpKU1ppcC5zdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7CkpT" +
        "WmlwLmRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpOwoKLy8gVE9ETyBmaW5kIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcyB2ZXJzaW9uLAovLyBhIHJlcXVpcmUoJ3BhY2thZ2UuanNvbicpLnZl" +
        "cnNpb24gZG9lc24ndCB3b3JrIHdpdGggd2VicGFjaywgc2VlICMzMjcKSlNaaXAudmVyc2lvbiA9ICIzLjUuMCI7CgpKU1ppcC5sb2FkQXN5bmMgPSBmdW5jdGlvbiAoY29udGVudCwgb3B0aW9ucykgewogICAg" +
        "cmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTsKfTsKCkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZSgiLi9leHRlcm5hbCIpOwptb2R1bGUuZXhwb3J0cyA9IEpTWmlwOwoKfSx7" +
        "Ii4vZGVmYXVsdHMiOjUsIi4vZXh0ZXJuYWwiOjYsIi4vbG9hZCI6MTEsIi4vb2JqZWN0IjoxNSwiLi9zdXBwb3J0IjozMH1dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJp" +
        "Y3QnOwp2YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7CnZhciBleHRlcm5hbCA9IHJlcXVpcmUoIi4vZXh0ZXJuYWwiKTsKdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTsKdmFyIHV0aWxzID0gcmVx" +
        "dWlyZSgnLi91dGlscycpOwp2YXIgWmlwRW50cmllcyA9IHJlcXVpcmUoJy4vemlwRW50cmllcycpOwp2YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTsKdmFyIG5vZGVqc1V0" +
        "aWxzID0gcmVxdWlyZSgiLi9ub2RlanNVdGlscyIpOwoKLyoqCiAqIENoZWNrIHRoZSBDUkMzMiBvZiBhbiBlbnRyeS4KICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVj" +
        "ay4KICogQHJldHVybiB7UHJvbWlzZX0gdGhlIHJlc3VsdC4KICovCmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkgewogICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChy" +
        "ZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgd29ya2VyID0gemlwRW50cnkuZGVjb21wcmVzc2VkLmdldENvbnRlbnRXb3JrZXIoKS5waXBlKG5ldyBDcmMzMlByb2JlKCkpOwogICAgICAgIHdvcmtlci5v" +
        "bigiZXJyb3IiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgfSkKICAgICAgICAub24oImVuZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHdvcmtlci5zdHJl" +
        "YW1JbmZvLmNyYzMyICE9PSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuY3JjMzIpIHsKICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgOiBDUkMzMiBtaXNtYXRjaCIpKTsKICAg" +
        "ICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgLnJlc3VtZSgpOwogICAgfSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gZnVu" +
        "Y3Rpb24oZGF0YSwgb3B0aW9ucykgewogICAgdmFyIHppcCA9IHRoaXM7CiAgICBvcHRpb25zID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHsKICAgICAgICBiYXNlNjQ6IGZhbHNlLAogICAgICAgIGNo" +
        "ZWNrQ1JDMzI6IGZhbHNlLAogICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogZmFsc2UsCiAgICAgICAgY3JlYXRlRm9sZGVyczogZmFsc2UsCiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRl" +
        "Y29kZQogICAgfSk7CgogICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkgewogICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChuZXcgRXJy" +
        "b3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk7CiAgICB9CgogICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KCJ0aGUgbG9hZGVkIHppcCBmaWxl" +
        "IiwgZGF0YSwgdHJ1ZSwgb3B0aW9ucy5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG9wdGlvbnMuYmFzZTY0KQogICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHZhciB6aXBFbnRyaWVzID0gbmV3IFpp" +
        "cEVudHJpZXMob3B0aW9ucyk7CiAgICAgICAgemlwRW50cmllcy5sb2FkKGRhdGEpOwogICAgICAgIHJldHVybiB6aXBFbnRyaWVzOwogICAgfSkudGhlbihmdW5jdGlvbiBjaGVja0NSQzMyKHppcEVudHJpZXMp" +
        "IHsKICAgICAgICB2YXIgcHJvbWlzZXMgPSBbZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcEVudHJpZXMpXTsKICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzOwogICAgICAgIGlmIChvcHRp" +
        "b25zLmNoZWNrQ1JDMzIpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmls" +
        "ZXNbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgfSkudGhlbihmdW5jdGlvbiBhZGRGaWxlcyhyZXN1bHRzKSB7" +
        "CiAgICAgICAgdmFyIHppcEVudHJpZXMgPSByZXN1bHRzLnNoaWZ0KCk7CiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlczsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0" +
        "aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGZpbGVzW2ldOwogICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7CiAgICAgICAgICAgICAg" +
        "ICBiaW5hcnk6IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IHRydWUsCiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLAogICAgICAgICAgICAgICAgZGlyOiBpbnB1" +
        "dC5kaXIsCiAgICAgICAgICAgICAgICBjb21tZW50IDogaW5wdXQuZmlsZUNvbW1lbnRTdHIubGVuZ3RoID8gaW5wdXQuZmlsZUNvbW1lbnRTdHIgOiBudWxsLAogICAgICAgICAgICAgICAgdW5peFBlcm1pc3Np" +
        "b25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLAogICAgICAgICAgICAgICAgZG9zUGVybWlzc2lvbnMgOiBpbnB1dC5kb3NQZXJtaXNzaW9ucywKICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IG9wdGlv" +
        "bnMuY3JlYXRlRm9sZGVycwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHppcEVudHJpZXMuemlwQ29tbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRy" +
        "aWVzLnppcENvbW1lbnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gemlwOwogICAgfSk7Cn07Cgp9LHsiLi9leHRlcm5hbCI6NiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0NyYzMyUHJvYmUiOjI1" +
        "LCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyaWVzIjozM31dLDEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKdmFyIHV0aWxzID0gcmVxdWlyZSgn" +
        "Li4vdXRpbHMnKTsKdmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpOwoKLyoqCiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2Uu" +
        "CiAqIEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZW50cnkgZm9yIHRoaXMgc3RyZWFtLgogKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhl" +
        "IG5vZGVqcyBzdHJlYW0uCiAqLwpmdW5jdGlvbiBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIoZmlsZW5hbWUsIHN0cmVhbSkgewogICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsICJOb2RlanMgc3RyZWFtIGlu" +
        "cHV0IGFkYXB0ZXIgZm9yICIgKyBmaWxlbmFtZSk7CiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7CiAgICB0aGlzLl9iaW5kU3RyZWFtKHN0cmVhbSk7Cn0KCnV0aWxzLmluaGVyaXRzKE5vZGVqc1N0" +
        "cmVhbUlucHV0QWRhcHRlciwgR2VuZXJpY1dvcmtlcik7CgovKioKICogUHJlcGFyZSB0aGUgc3RyZWFtIGFuZCBiaW5kIHRoZSBjYWxsYmFja3Mgb24gaXQuCiAqIERvIHRoaXMgQVNBUCBvbiBub2RlIDAuMTAg" +
        "ISBBIGxhenkgYmluZGluZyBkb2Vzbid0IGFsd2F5cyB3b3JrLgogKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS4KICovCk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5w" +
        "cm90b3R5cGUuX2JpbmRTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07CiAgICBzdHJlYW0ucGF1c2UoKTsKICAgIHN0cmVh" +
        "bQogICAgLm9uKCJkYXRhIiwgZnVuY3Rpb24gKGNodW5rKSB7CiAgICAgICAgc2VsZi5wdXNoKHsKICAgICAgICAgICAgZGF0YTogY2h1bmssCiAgICAgICAgICAgIG1ldGEgOiB7CiAgICAgICAgICAgICAgICBw" +
        "ZXJjZW50IDogMAogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KQogICAgLm9uKCJlcnJvciIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkgewogICAgICAgICAgICB0aGlz" +
        "LmdlbmVyYXRlZEVycm9yID0gZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLmVycm9yKGUpOwogICAgICAgIH0KICAgIH0pCiAgICAub24oImVuZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBp" +
        "ZihzZWxmLmlzUGF1c2VkKSB7CiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlbGYuZW5kKCk7CiAgICAgICAgfQogICAgfSk7Cn07" +
        "Ck5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7CiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucGF1c2UuY2FsbCh0aGlzKSkgewogICAgICAgIHJl" +
        "dHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuX3N0cmVhbS5wYXVzZSgpOwogICAgcmV0dXJuIHRydWU7Cn07Ck5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkg" +
        "ewogICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHsKICAgICAg" +
        "ICB0aGlzLmVuZCgpOwogICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0" +
        "QWRhcHRlcjsKCn0seyIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4uL3V0aWxzIjozMn1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKdmFyIFJlYWRh" +
        "YmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7Cgp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpOwp1dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBS" +
        "ZWFkYWJsZSk7CgovKioKKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLgoqIEBzZWUgdGhlIFNvdXJjZVdyYXBwZXIgaW4gaHR0cDovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1s" +
        "CiogQGNvbnN0cnVjdG9yCiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXIKKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgbm9kZWpzIHN0cmVh" +
        "bSBvcHRpb25zCiogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay4KKi8KZnVuY3Rpb24gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcihoZWxwZXIsIG9wdGlvbnMsIHVwZGF0" +
        "ZUNiKSB7CiAgICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgdGhpcy5faGVscGVyID0gaGVscGVyOwoKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGhlbHBlci5vbigiZGF0YSIsIGZ1bmN0aW9u" +
        "IChkYXRhLCBtZXRhKSB7CiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHsKICAgICAgICAgICAgc2VsZi5faGVscGVyLnBhdXNlKCk7CiAgICAgICAgfQogICAgICAgIGlmKHVwZGF0ZUNiKSB7CiAgICAg" +
        "ICAgICAgIHVwZGF0ZUNiKG1ldGEpOwogICAgICAgIH0KICAgIH0pCiAgICAub24oImVycm9yIiwgZnVuY3Rpb24oZSkgewogICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTsKICAgIH0pCiAgICAub24oImVu" +
        "ZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxmLnB1c2gobnVsbCk7CiAgICB9KTsKfQoKCk5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24oKSB7CiAgICB0aGlz" +
        "Ll9oZWxwZXIucmVzdW1lKCk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7Cgp9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9u" +
        "KHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAgIC8qKgogICAgICogVHJ1ZSBpZiB0aGlzIGlzIHJ1bm5pbmcgaW4gTm9kZWpzLCB3aWxsIGJlIHVu" +
        "ZGVmaW5lZCBpbiBhIGJyb3dzZXIuCiAgICAgKiBJbiBhIGJyb3dzZXIsIGJyb3dzZXJpZnkgd29uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHRoZSB3aG9sZSBtb2R1bGUKICAgICAqIHdpbGwgYmUgcmVzb2x2" +
        "ZWQgYW4gZW1wdHkgb2JqZWN0LgogICAgICovCiAgICBpc05vZGUgOiB0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIiwKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIgZnJvbSBh" +
        "biBleGlzdGluZyBjb250ZW50LgogICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmcgdGhl" +
        "IGVuY29kaW5nIHRvIHVzZS4KICAgICAqIEByZXR1cm4ge0J1ZmZlcn0gYSBuZXcgQnVmZmVyLgogICAgICovCiAgICBuZXdCdWZmZXJGcm9tOiBmdW5jdGlvbihkYXRhLCBlbmNvZGluZykgewogICAgICAgIGlm" +
        "IChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuZnJvbSAhPT0gVWludDhBcnJheS5mcm9tKSB7CiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhLCBlbmNvZGluZyk7CiAgICAgICAgfSBlbHNlIHsKICAg" +
        "ICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgLy8gU2FmZWd1YXJkIGZvciBvbGQgTm9kZS5qcyB2ZXJzaW9ucy4gT24gbmV3ZXIgdmVyc2lvbnMsCiAgICAg" +
        "ICAgICAgICAgICAvLyBCdWZmZXIuZnJvbShudW1iZXIpIC8gQnVmZmVyKG51bWJlciwgZW5jb2RpbmcpIGFscmVhZHkgdGhyb3cuCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBcImRhdGFc" +
        "IiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGRhdGEsIGVuY29kaW5nKTsKICAgICAgICB9CiAgICB9LAogICAgLyoq" +
        "CiAgICAgKiBDcmVhdGUgYSBuZXcgbm9kZWpzIEJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgogICAgICog" +
        "QHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuCiAgICAgKi8KICAgIGFsbG9jQnVmZmVyOiBmdW5jdGlvbiAoc2l6ZSkgewogICAgICAgIGlmIChCdWZmZXIuYWxsb2MpIHsKICAgICAgICAgICAgcmV0dXJu" +
        "IEJ1ZmZlci5hbGxvYyhzaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzaXplKTsKICAgICAgICAgICAgYnVmLmZpbGwoMCk7CiAgICAgICAgICAgIHJldHVy" +
        "biBidWY7CiAgICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogRmluZCBvdXQgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyLgogICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0Lgog" +
        "ICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgQnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7CiAgICAgICAgcmV0" +
        "dXJuIEJ1ZmZlci5pc0J1ZmZlcihiKTsKICAgIH0sCgogICAgaXNTdHJlYW0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgcmV0dXJuIG9iaiAmJgogICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSAiZnVu" +
        "Y3Rpb24iICYmCiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09ICJmdW5jdGlvbiI7CiAgICB9Cn07Cgp9LHt9XSwx" +
        "NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpOwp2YXIgR2Vu" +
        "ZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTsKdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpOwp2YXIgZGVmYXVsdHMgPSByZXF1" +
        "aXJlKCcuL2RlZmF1bHRzJyk7CnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7CnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpOwp2YXIgZ2Vu" +
        "ZXJhdGUgPSByZXF1aXJlKCIuL2dlbmVyYXRlIik7CnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoIi4vbm9kZWpzVXRpbHMiKTsKdmFyIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciA9IHJlcXVpcmUoIi4vbm9k" +
        "ZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlciIpOwoKCi8qKgogKiBBZGQgYSBmaWxlIGluIHRoZSBjdXJyZW50IGZvbGRlci4KICogQHByaXZhdGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUg" +
        "b2YgdGhlIGZpbGUKICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgb2YgdGhlIGZpbGUKICogQHBhcmFtIHtPYmplY3R9IG9yaWdpbmFsT3B0aW9u" +
        "cyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZQogKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZmlsZS4KICovCnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3JpZ2luYWxPcHRpb25zKSB7CiAg" +
        "ICAvLyBiZSBzdXJlIHN1YiBmb2xkZXJzIGV4aXN0CiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksCiAgICAgICAgcGFyZW50OwoKCiAgICAvKgogICAgICogQ29ycmVjdCBvcHRpb25z" +
        "LgogICAgICovCgogICAgdmFyIG8gPSB1dGlscy5leHRlbmQob3JpZ2luYWxPcHRpb25zIHx8IHt9LCBkZWZhdWx0cyk7CiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTsKICAgIGlmIChvLmNvbXBy" +
        "ZXNzaW9uICE9PSBudWxsKSB7CiAgICAgICAgby5jb21wcmVzc2lvbiA9IG8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTsKICAgIH0KCiAgICBpZiAodHlwZW9mIG8udW5peFBlcm1pc3Npb25zID09PSAic3Ry" +
        "aW5nIikgewogICAgICAgIG8udW5peFBlcm1pc3Npb25zID0gcGFyc2VJbnQoby51bml4UGVybWlzc2lvbnMsIDgpOwogICAgfQoKICAgIC8vIFVOWF9JRkRJUiAgMDA0MDAwMCBzZWUgemlwaW5mby5jCiAgICBp" +
        "ZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkgewogICAgICAgIG8uZGlyID0gdHJ1ZTsKICAgIH0KICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeQogICAgaWYgKG8u" +
        "ZG9zUGVybWlzc2lvbnMgJiYgKG8uZG9zUGVybWlzc2lvbnMgJiAweDAwMTApKSB7CiAgICAgICAgby5kaXIgPSB0cnVlOwogICAgfQoKICAgIGlmIChvLmRpcikgewogICAgICAgIG5hbWUgPSBmb3JjZVRyYWls" +
        "aW5nU2xhc2gobmFtZSk7CiAgICB9CiAgICBpZiAoby5jcmVhdGVGb2xkZXJzICYmIChwYXJlbnQgPSBwYXJlbnRGb2xkZXIobmFtZSkpKSB7CiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0" +
        "cnVlKTsKICAgIH0KCiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09ICJzdHJpbmciICYmIG8uYmluYXJ5ID09PSBmYWxzZSAmJiBvLmJhc2U2NCA9PT0gZmFsc2U7CiAgICBpZiAoIW9yaWdp" +
        "bmFsT3B0aW9ucyB8fCB0eXBlb2Ygb3JpZ2luYWxPcHRpb25zLmJpbmFyeSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7CiAgICB9CgoKICAgIHZhciBpc0Nv" +
        "bXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwOwoKICAgIGlmIChpc0NvbXByZXNzZWRFbXB0eSB8fCBvLmRpciB8" +
        "fCAhZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgewogICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7CiAgICAgICAgby5iaW5hcnkgPSB0cnVlOwogICAgICAgIGRhdGEgPSAiIjsKICAgICAgICBvLmNvbXByZXNz" +
        "aW9uID0gIlNUT1JFIjsKICAgICAgICBkYXRhVHlwZSA9ICJzdHJpbmciOwogICAgfQoKICAgIC8qCiAgICAgKiBDb252ZXJ0IGNvbnRlbnQgdG8gZml0LgogICAgICovCgogICAgdmFyIHppcE9iamVjdENvbnRl" +
        "bnQgPSBudWxsOwogICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7CiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IGRhdGE7" +
        "CiAgICB9IGVsc2UgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkgewogICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFw" +
        "dGVyKG5hbWUsIGRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gdXRpbHMucHJlcGFyZUNvbnRlbnQobmFtZSwgZGF0YSwgby5iaW5hcnksIG8ub3B0aW1pemVkQmluYXJ5U3Ry" +
        "aW5nLCBvLmJhc2U2NCk7CiAgICB9CgogICAgdmFyIG9iamVjdCA9IG5ldyBaaXBPYmplY3QobmFtZSwgemlwT2JqZWN0Q29udGVudCwgbyk7CiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0OwogICAgLyoK" +
        "ICAgIFRPRE86IHdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIGhhdmUgYXN5bmMgcHJvbWlzZXMKICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUp" +
        "IGJ1dCByZXR1cm5pbmcgYQogICAgcHJvbWlzZSBpcyB1c2VsZXNzIGJlY2F1c2UgZmlsZShuYW1lLCBkYXRhKSByZXR1cm5zIHRoZSBKU1ppcAogICAgb2JqZWN0IGZvciBjaGFpbmluZy4gU2hvdWxkIHdlIGJy" +
        "ZWFrIHRoYXQgdG8gYWxsb3cgdGhlIHVzZXIKICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/CgogICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBPYmplY3RDb250ZW50KQogICAgLnRoZW4oZnVu" +
        "Y3Rpb24gKCkgewogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9KTsKICAgICovCn07CgovKioKICogRmluZCB0aGUgcGFyZW50IGZvbGRlciBvZiB0aGUgcGF0aC4KICogQHByaXZhdGUKICogQHBhcmFtIHtz" +
        "dHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlCiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHBhcmVudCBmb2xkZXIsIG9yICIiCiAqLwp2YXIgcGFyZW50Rm9sZGVyID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgIGlm" +
        "IChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7CiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICB9CiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhP" +
        "ZignLycpOwogICAgcmV0dXJuIChsYXN0U2xhc2ggPiAwKSA/IHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkgOiAiIjsKfTsKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGggYSBzbGFzaCBhdCB0aGUg" +
        "ZW5kLgogKiBAcHJpdmF0ZQogKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay4KICogQHJldHVybiB7U3RyaW5nfSB0aGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCiAqLwp2YXIg" +
        "Zm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkgewogICAgLy8gQ2hlY2sgdGhlIG5hbWUgZW5kcyB3aXRoIGEgLwogICAgaWYgKHBhdGguc2xpY2UoLTEpICE9PSAiLyIpIHsKICAgICAgICBwYXRo" +
        "ICs9ICIvIjsgLy8gSUUgZG9lc24ndCBsaWtlIHN1YnN0cigtMSkKICAgIH0KICAgIHJldHVybiBwYXRoOwp9OwoKLyoqCiAqIEFkZCBhIChzdWIpIGZvbGRlciBpbiB0aGUgY3VycmVudCBmb2xkZXIuCiAqIEBw" +
        "cml2YXRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lCiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtjcmVhdGVGb2xkZXJzXSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdWIK" +
        "ICogIGZvbGRlcnMuIERlZmF1bHRzIHRvIGZhbHNlLgogKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLgogKi8KdmFyIGZvbGRlckFkZCA9IGZ1bmN0aW9uKG5hbWUsIGNyZWF0ZUZvbGRlcnMpIHsK" +
        "ICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzOwoKICAgIG5hbWUgPSBmb3JjZVRy" +
        "YWlsaW5nU2xhc2gobmFtZSk7CgogICAgLy8gRG9lcyB0aGlzIGZvbGRlciBhbHJlYWR5IGV4aXN0PwogICAgaWYgKCF0aGlzLmZpbGVzW25hbWVdKSB7CiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUs" +
        "IG51bGwsIHsKICAgICAgICAgICAgZGlyOiB0cnVlLAogICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBjcmVhdGVGb2xkZXJzCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5maWxlc1tuYW1lXTsK" +
        "fTsKCi8qKgoqIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb24KKiBAcGFyYW0gIHtPYmplY3R9ICBvYmplY3QgQW55dGhpbmcKKiBAcmV0dXJuIHtC" +
        "b29sZWFufSAgICAgICAgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLAoqIGZhbHNlIG90aGVyd2lzZQoqLwpmdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHsKICAgIHJldHVybiBP" +
        "YmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgUmVnRXhwXSI7Cn0KCi8vIHJldHVybiB0aGUgYWN0dWFsIHByb3RvdHlwZSBvZiBKU1ppcAp2YXIgb3V0ID0gewogICAg" +
        "LyoqCiAgICAgKiBAc2VlIGxvYWRBc3luYwogICAgICovCiAgICBsb2FkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAg" +
        "My4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7CiAgICB9LAoKCiAgICAvKioKICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBs" +
        "ZXZlbC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKICAgICAqIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGZpbGUpIHsuLi59CiAgICAgKiBJdCB0YWtlcyAyIGFy" +
        "Z3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS4KICAgICAqLwogICAgZm9yRWFjaDogZnVuY3Rpb24oY2IpIHsKICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTsK" +
        "ICAgICAgICBmb3IgKGZpbGVuYW1lIGluIHRoaXMuZmlsZXMpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzLmhhc093blByb3BlcnR5KGZpbGVuYW1lKSkgewogICAgICAgICAgICAgICAgY29udGludWU7" +
        "CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbZmlsZW5hbWVdOwogICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxl" +
        "bmFtZS5sZW5ndGgpOwogICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoICYmIGZpbGVuYW1lLnNsaWNlKDAsIHRoaXMucm9vdC5sZW5ndGgpID09PSB0aGlzLnJvb3QpIHsgLy8gdGhlIGZpbGUgaXMgaW4gdGhl" +
        "IGN1cnJlbnQgcm9vdAogICAgICAgICAgICAgICAgY2IocmVsYXRpdmVQYXRoLCBmaWxlKTsgLy8gVE9ETyByZXZlcnNlIHRoZSBwYXJhbWV0ZXJzID8gbmVlZCB0byBiZSBjbGVhbiBBTkQgY29uc2lzdGVudCB3" +
        "aXRoIHRoZSBmaWx0ZXIgc2VhcmNoIGZuLi4uCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogRmlsdGVyIG5lc3RlZCBmaWxlcy9mb2xkZXJzIHdpdGggdGhlIHNwZWNpZmll" +
        "ZCBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6CiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufQogICAgICogSXQg" +
        "dGFrZXMgMiBhcmd1bWVudHMgOiB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIGZpbGUuCiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuCiAgICAgKi8KICAgIGZp" +
        "bHRlcjogZnVuY3Rpb24oc2VhcmNoKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBlbnRyeSkgewogICAgICAgICAgICBpZiAo" +
        "c2VhcmNoKHJlbGF0aXZlUGF0aCwgZW50cnkpKSB7IC8vIHRoZSBmaWxlIG1hdGNoZXMgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7CiAgICAgICAgICAgIH0KCiAgICAg" +
        "ICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGQgYSBmaWxlIHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoIGEgZmlsZS4KICAgICAqIEBwYXJhbSAgIHtzdHJp" +
        "bmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSwKICAgICAqIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGZpbmQgKGlmIG5vIGRhdGEpIG9yIGEg" +
        "cmVnZXggdG8gbWF0Y2ggZmlsZXMuCiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhICBUaGUgZmlsZSBkYXRhLCBlaXRoZXIgcmF3IG9yIGJhc2U2NCBl" +
        "bmNvZGVkCiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnMKICAgICAqIEByZXR1cm4gIHtKU1ppcHxPYmplY3R8QXJyYXl9IHRoaXMgSlNaaXAgb2JqZWN0ICh3aGVuIGFkZGluZyBh" +
        "IGZpbGUpLAogICAgICogYSBmaWxlICh3aGVuIHNlYXJjaGluZyBieSBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIGZpbGVzICh3aGVuIHNlYXJjaGluZyBieSByZWdleCkuCiAgICAgKi8KICAgIGZpbGU6IGZ1bmN0" +
        "aW9uKG5hbWUsIGRhdGEsIG8pIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHsKICAgICAgICAgICAgICAgIHZhciByZWdleHAg" +
        "PSBuYW1lOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhw" +
        "LnRlc3QocmVsYXRpdmVQYXRoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5maWxlc1t0" +
        "aGlzLnJvb3QgKyBuYW1lXTsKICAgICAgICAgICAgICAgIGlmIChvYmogJiYgIW9iai5kaXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg" +
        "ICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUg" +
        "ZGF0YSAhCiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lOwogICAgICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgZGF0YSwgbyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlz" +
        "OwogICAgfSwKCiAgICAvKioKICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaC4KICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhl" +
        "IGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuCiAgICAgKiBAcmV0dXJuICB7SlNaaXB9IGFuIG9iamVjdCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IGFzIHRoZSByb290LCBv" +
        "ciBhbiBhcnJheSBjb250YWluaW5nIG1hdGNoaW5nIGZvbGRlcnMuCiAgICAgKi8KICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKCFhcmcpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7" +
        "CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNSZWdFeHAoYXJnKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7CiAgICAgICAgICAgICAgICBy" +
        "ZXR1cm4gZmlsZS5kaXIgJiYgYXJnLnRlc3QocmVsYXRpdmVQYXRoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBlbHNlLCBuYW1lIGlzIGEgbmV3IGZvbGRlcgogICAgICAgIHZhciBu" +
        "YW1lID0gdGhpcy5yb290ICsgYXJnOwogICAgICAgIHZhciBuZXdGb2xkZXIgPSBmb2xkZXJBZGQuY2FsbCh0aGlzLCBuYW1lKTsKCiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3" +
        "IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290CiAgICAgICAgdmFyIHJldCA9IHRoaXMuY2xvbmUoKTsKICAgICAgICByZXQucm9vdCA9IG5ld0ZvbGRlci5uYW1lOwogICAgICAgIHJldHVybiBy" +
        "ZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcAogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhl" +
        "IG5hbWUgb2YgdGhlIGZpbGUgdG8gZGVsZXRlCiAgICAgKiBAcmV0dXJuIHtKU1ppcH0gdGhpcyBKU1ppcCBvYmplY3QKICAgICAqLwogICAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgbmFtZSA9" +
        "IHRoaXMucm9vdCArIG5hbWU7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdOwogICAgICAgIGlmICghZmlsZSkgewogICAgICAgICAgICAvLyBMb29rIGZvciBhbnkgZm9sZGVycwogICAgICAg" +
        "ICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09ICIvIikgewogICAgICAgICAgICAgICAgbmFtZSArPSAiLyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07CiAgICAg" +
        "ICAgfQoKICAgICAgICBpZiAoZmlsZSAmJiAhZmlsZS5kaXIpIHsKICAgICAgICAgICAgLy8gZmlsZQogICAgICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTsKICAgICAgICB9IGVsc2UgewogICAgICAg" +
        "ICAgICAvLyBtYXliZSBhIGZvbGRlciwgZGVsZXRlIHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7CiAgICAgICAgICAg" +
        "ICAgICByZXR1cm4gZmlsZS5uYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoKSA9PT0gbmFtZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykg" +
        "ewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNba2lkc1tpXS5uYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIC8qKgogICAgICog" +
        "R2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOgogICAgICogLSBjb21wcmVzc2lv" +
        "biwgIlNUT1JFIiBieSBkZWZhdWx0LgogICAgICogLSB0eXBlLCAiYmFzZTY0IiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLgog" +
        "ICAgICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSB6aXAgZmlsZQogICAgICovCiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAg" +
        "IHRocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBH" +
        "ZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXMgYW4gaW50ZXJuYWwgc3RyZWFtLgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxl" +
        "IDoKICAgICAqIC0gY29tcHJlc3Npb24sICJTVE9SRSIgYnkgZGVmYXVsdC4KICAgICAqIC0gdHlwZSwgImJhc2U2NCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5" +
        "LCBhcnJheWJ1ZmZlciwgYmxvYi4KICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIHN0cmVhbWVkIHppcCBmaWxlLgogICAgICovCiAgICBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihv" +
        "cHRpb25zKSB7CiAgICAgIHZhciB3b3JrZXIsIG9wdHMgPSB7fTsKICAgICAgdHJ5IHsKICAgICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwgewogICAgICAgICAgICAgIHN0cmVhbUZp" +
        "bGVzOiBmYWxzZSwKICAgICAgICAgICAgICBjb21wcmVzc2lvbjogIlNUT1JFIiwKICAgICAgICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBudWxsLAogICAgICAgICAgICAgIHR5cGU6ICIiLAogICAgICAg" +
        "ICAgICAgIHBsYXRmb3JtOiAiRE9TIiwKICAgICAgICAgICAgICBjb21tZW50OiBudWxsLAogICAgICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vemlwJywKICAgICAgICAgICAgICBlbmNvZGVGaWxl" +
        "TmFtZTogdXRmOC51dGY4ZW5jb2RlCiAgICAgICAgICB9KTsKCiAgICAgICAgICBvcHRzLnR5cGUgPSBvcHRzLnR5cGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNv" +
        "bXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7CgogICAgICAgICAgLy8gImJpbmFyeXN0cmluZyIgaXMgcHJlZmVycmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSAic3RyaW5nIi4KICAgICAgICAgIGlmKG9wdHMudHlw" +
        "ZSA9PT0gImJpbmFyeXN0cmluZyIpIHsKICAgICAgICAgICAgb3B0cy50eXBlID0gInN0cmluZyI7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFvcHRzLnR5cGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3" +
        "IEVycm9yKCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuIik7CiAgICAgICAgICB9CgogICAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KG9wdHMudHlwZSk7CgogICAgICAgICAgLy8gYWNjZXB0IG5vZGVqcyBg" +
        "cHJvY2Vzcy5wbGF0Zm9ybWAKICAgICAgICAgIGlmKAogICAgICAgICAgICAgIG9wdHMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8CiAgICAgICAgICAgICAgb3B0cy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnIHx8" +
        "CiAgICAgICAgICAgICAgb3B0cy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JyB8fAogICAgICAgICAgICAgIG9wdHMucGxhdGZvcm0gPT09ICdzdW5vcycKICAgICAgICAgICkgewogICAgICAgICAgICAgIG9wdHMucGxh" +
        "dGZvcm0gPSAiVU5JWCI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0cy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykgewogICAgICAgICAgICAgIG9wdHMucGxhdGZvcm0gPSAiRE9TIjsKICAgICAgICAgIH0K" +
        "CiAgICAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgIiI7CiAgICAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21t" +
        "ZW50KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHdvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKCJlcnJvciIpOwogICAgICAgIHdvcmtlci5lcnJvcihlKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3" +
        "IFN0cmVhbUhlbHBlcih3b3JrZXIsIG9wdHMudHlwZSB8fCAic3RyaW5nIiwgb3B0cy5taW1lVHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNo" +
        "cm9ub3VzbHkuCiAgICAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW0KICAgICAqLwogICAgZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHsKICAgICAgICByZXR1cm4gdGhp" +
        "cy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLmFjY3VtdWxhdGUob25VcGRhdGUpOwogICAgfSwKICAgIC8qKgogICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91" +
        "c2x5LgogICAgICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtCiAgICAgKi8KICAgIGdlbmVyYXRlTm9kZVN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHsKICAgICAgICBvcHRpb25zID0g" +
        "b3B0aW9ucyB8fCB7fTsKICAgICAgICBpZiAoIW9wdGlvbnMudHlwZSkgewogICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAibm9kZWJ1ZmZlciI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdlbmVy" +
        "YXRlSW50ZXJuYWxTdHJlYW0ob3B0aW9ucykudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpOwogICAgfQp9Owptb2R1bGUuZXhwb3J0cyA9IG91dDsKCn0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vZGVmYXVs" +
        "dHMiOjUsIi4vZ2VuZXJhdGUiOjksIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlciI6MTIsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3Ry" +
        "ZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMSwiLi91dGlscyI6MzIsIi4vemlwT2JqZWN0IjozNX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLyoKICogVGhpcyBmaWxlIGlzIHVzZWQg" +
        "YnkgbW9kdWxlIGJ1bmRsZXJzIChicm93c2VyaWZ5L3dlYnBhY2svZXRjKSB3aGVuCiAqIGluY2x1ZGluZyBhIHN0cmVhbSBpbXBsZW1lbnRhdGlvbi4gV2UgdXNlICJyZWFkYWJsZS1zdHJlYW0iIHRvIGdldCBh" +
        "CiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYmV0d2VlbiBub2RlanMgdmVyc2lvbnMgYnV0IGJ1bmRsZXJzIG9mdGVuIGhhdmUgYSBzaGltCiAqIGZvciAic3RyZWFtIi4gVXNpbmcgdGhpcyBzaGltIGdyZWF0bHkg" +
        "aW1wcm92ZSB0aGUgY29tcGF0aWJpbGl0eSBhbmQgZ3JlYXRseQogKiByZWR1Y2UgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGJ1bmRsZSAob25seSBvbmUgc3RyZWFtIGltcGxlbWVudGF0aW9uLCBub3QKICogdHdv" +
        "KS4KICovCm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgic3RyZWFtIik7Cgp9LHsic3RyZWFtIjp1bmRlZmluZWR9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsK" +
        "dmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTsKCmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHsKICAgIERhdGFSZWFkZXIu" +
        "Y2FsbCh0aGlzLCBkYXRhKTsKCWZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKCQlkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7Cgl9Cn0KdXRpbHMuaW5oZXJpdHMoQXJyYXlSZWFk" +
        "ZXIsIERhdGFSZWFkZXIpOwovKioKICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdAogKi8KQXJyYXlSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHsKICAgIHJldHVybiB0aGlzLmRhdGFbdGhp" +
        "cy56ZXJvICsgaV07Cn07Ci8qKgogKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUKICovCkFycmF5UmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNp" +
        "ZykgewogICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSwKICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksCiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLAogICAgICAgIHNpZzMg" +
        "PSBzaWcuY2hhckNvZGVBdCgzKTsKICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDQ7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PT0gc2lnMCAmJiB0aGlzLmRhdGFbaSAr" +
        "IDFdID09PSBzaWcxICYmIHRoaXMuZGF0YVtpICsgMl0gPT09IHNpZzIgJiYgdGhpcy5kYXRhW2kgKyAzXSA9PT0gc2lnMykgewogICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybzsKICAgICAgICB9CiAg" +
        "ICB9CgogICAgcmV0dXJuIC0xOwp9OwovKioKICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZQogKi8KQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1" +
        "bmN0aW9uIChzaWcpIHsKICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksCiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLAogICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSwKICAg" +
        "ICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyksCiAgICAgICAgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7CiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIg" +
        "PT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTsKfTsKLyoqCiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YQogKi8KQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkg" +
        "ewogICAgdGhpcy5jaGVja09mZnNldChzaXplKTsKICAgIGlmKHNpemUgPT09IDApIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyAr" +
        "IHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTsKICAgIHRoaXMuaW5kZXggKz0gc2l6ZTsKICAgIHJldHVybiByZXN1bHQ7Cn07Cm1vZHVsZS5leHBvcnRzID0gQXJyYXlSZWFkZXI7" +
        "Cgp9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxz" +
        "Jyk7CgpmdW5jdGlvbiBEYXRhUmVhZGVyKGRhdGEpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb24KICAgIHRoaXMubGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICB0" +
        "aGlzLmluZGV4ID0gMDsKICAgIHRoaXMuemVybyA9IDA7Cn0KRGF0YVJlYWRlci5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLgog" +
        "ICAgICogQHBhcmFtIHtzdHJpbmd9IG9mZnNldCB0aGUgYWRkaXRpb25hbCBvZmZzZXQgdG8gY2hlY2suCiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91" +
        "bmRzLgogICAgICovCiAgICBjaGVja09mZnNldDogZnVuY3Rpb24ob2Zmc2V0KSB7CiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpOwogICAgfSwKICAgIC8qKgogICAgICogQ2hl" +
        "Y2sgdGhhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHdpbGwgbm90IGJlIHRvbyBmYXIuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLgogICAgICogQHRocm93cyB7RXJy" +
        "b3J9IGFuIEVycm9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLgogICAgICovCiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMu" +
        "emVybyArIG5ld0luZGV4IHx8IG5ld0luZGV4IDwgMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gIiArIHRoaXMubGVuZ3RoICsgIiwg" +
        "YXNrZWQgaW5kZXggPSAiICsgKG5ld0luZGV4KSArICIpLiBDb3JydXB0ZWQgemlwID8iKTsKICAgICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LgogICAgICogQHBhcmFtIHtu" +
        "dW1iZXJ9IG5ld0luZGV4IFRoZSBuZXcgaW5kZXguCiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuCiAgICAgKi8KICAgIHNldEluZGV4OiBmdW5jdGlv" +
        "bihuZXdJbmRleCkgewogICAgICAgIHRoaXMuY2hlY2tJbmRleChuZXdJbmRleCk7CiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4OwogICAgfSwKICAgIC8qKgogICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5" +
        "dGVzLgogICAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgogICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLgog" +
        "ICAgICovCiAgICBza2lwOiBmdW5jdGlvbihuKSB7CiAgICAgICAgdGhpcy5zZXRJbmRleCh0aGlzLmluZGV4ICsgbik7CiAgICB9LAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmll" +
        "ZCBpbmRleC4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuCiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGEgYnl0ZS4KICAgICAqLwogICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7CiAg" +
        "ICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9ucwogICAgfSwKICAgIC8qKgogICAgICogR2V0IHRoZSBuZXh0IG51bWJlciB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLgogICAgICogQHBhcmFtIHtudW1iZXJ9IHNp" +
        "emUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgogICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuCiAgICAgKi8KICAgIHJlYWRJbnQ6IGZ1bmN0aW9uKHNpemUpIHsK" +
        "ICAgICAgICB2YXIgcmVzdWx0ID0gMCwKICAgICAgICAgICAgaTsKICAgICAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpOwogICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlz" +
        "LmluZGV4OyBpLS0pIHsKICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIHRoaXMuYnl0ZUF0KGkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7CiAgICAgICAgcmV0dXJu" +
        "IHJlc3VsdDsKICAgIH0sCiAgICAvKioKICAgICAqIEdldCB0aGUgbmV4dCBzdHJpbmcgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0" +
        "ZXMgdG8gcmVhZC4KICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLgogICAgICovCiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbihzaXplKSB7CiAgICAgICAgcmV0dXJuIHV0" +
        "aWxzLnRyYW5zZm9ybVRvKCJzdHJpbmciLCB0aGlzLnJlYWREYXRhKHNpemUpKTsKICAgIH0sCiAgICAvKioKICAgICAqIEdldCByYXcgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24sIDxzaXplPiBieXRlcy4KICAg" +
        "ICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHJhdyBkYXRhLCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KICAg" +
        "ICAqLwogICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zCiAgICB9LAogICAgLyoqCiAgICAgKiBGaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSB6" +
        "aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIHNpZ25hdHVyZSB0byBmaW5kLgogICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGxhc3Qg" +
        "b2NjdXJyZW5jZSwgLTEgaWYgbm90IGZvdW5kLgogICAgICovCiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7CiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9ucwogICAgfSwKICAg" +
        "IC8qKgogICAgICogUmVhZCB0aGUgc2lnbmF0dXJlICg0IGJ5dGVzKSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgY29tcGFyZSBpdCB3aXRoIHNpZy4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhl" +
        "IGV4cGVjdGVkIHNpZ25hdHVyZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgcmVhZEFuZENoZWNrU2ln" +
        "bmF0dXJlOiBmdW5jdGlvbihzaWcpIHsKICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zCiAgICB9LAogICAgLyoqCiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS4KICAgICAqIEByZXR1cm4ge0RhdGV9IHRo" +
        "ZSBkYXRlLgogICAgICovCiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRvc3RpbWUgPSB0aGlzLnJlYWRJbnQoNCk7CiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKAogICAg" +
        "ICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXIKICAgICAgICAoKGRvc3RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvLyBtb250aAogICAgICAgIChkb3N0aW1lID4+IDE2KSAmIDB4" +
        "MWYsIC8vIGRheQogICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXIKICAgICAgICAoZG9zdGltZSA+PiA1KSAmIDB4M2YsIC8vIG1pbnV0ZQogICAgICAgIChkb3N0aW1lICYgMHgxZikgPDwg" +
        "MSkpOyAvLyBzZWNvbmQKICAgIH0KfTsKbW9kdWxlLmV4cG9ydHMgPSBEYXRhUmVhZGVyOwoKfSx7Ii4uL3V0aWxzIjozMn1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJp" +
        "Y3QnOwp2YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpOwoKZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihk" +
        "YXRhKSB7CiAgICBVaW50OEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7Cn0KdXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7CgovKioKICogQHNlZSBEYXRhUmVh" +
        "ZGVyLnJlYWREYXRhCiAqLwpOb2RlQnVmZmVyUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHsKICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7CiAgICB2YXIgcmVzdWx0ID0gdGhp" +
        "cy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTsKICAgIHRoaXMuaW5kZXggKz0gc2l6ZTsKICAgIHJldHVybiByZXN1bHQ7Cn07Cm1vZHVs" +
        "ZS5leHBvcnRzID0gTm9kZUJ1ZmZlclJlYWRlcjsKCn0seyIuLi91dGlscyI6MzIsIi4vVWludDhBcnJheVJlYWRlciI6MjF9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3Ry" +
        "aWN0JzsKdmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTsKCmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7CiAgICBEYXRh" +
        "UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7Cn0KdXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTsKLyoqCiAqIEBzZWUgRGF0YVJlYWRlci5ieXRlQXQKICovClN0cmluZ1JlYWRlci5wcm90" +
        "b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkgewogICAgcmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMuemVybyArIGkpOwp9OwovKioKICogQHNlZSBEYXRhUmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0" +
        "dXJlCiAqLwpTdHJpbmdSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKHNpZykgLSB0aGlzLnplcm87" +
        "Cn07Ci8qKgogKiBAc2VlIERhdGFSZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlCiAqLwpTdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHsKICAg" +
        "IHZhciBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTsKICAgIHJldHVybiBzaWcgPT09IGRhdGE7Cn07Ci8qKgogKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGEKICovClN0cmluZ1JlYWRlci5wcm90b3R5cGUucmVh" +
        "ZERhdGEgPSBmdW5jdGlvbihzaXplKSB7CiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpOwogICAgLy8gdGhpcyB3aWxsIHdvcmsgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgYXBwbGllZCB0aGUgIiYgMHhmZiIg" +
        "bWFzay4KICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpOwogICAgdGhpcy5pbmRleCArPSBzaXplOwog" +
        "ICAgcmV0dXJuIHJlc3VsdDsKfTsKbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdSZWFkZXI7Cgp9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4" +
        "cG9ydHMpewondXNlIHN0cmljdCc7CnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTsKCmZ1bmN0aW9uIFVpbnQ4QXJyYXlS" +
        "ZWFkZXIoZGF0YSkgewogICAgQXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTsKfQp1dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7Ci8qKgogKiBAc2VlIERhdGFSZWFkZXIu" +
        "cmVhZERhdGEKICovClVpbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkgewogICAgdGhpcy5jaGVja09mZnNldChzaXplKTsKICAgIGlmKHNpemUgPT09IDApIHsKICAg" +
        "ICAgICAvLyBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS4KICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7" +
        "CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTsKICAgIHRoaXMuaW5kZXggKz0gc2l6" +
        "ZTsKICAgIHJldHVybiByZXN1bHQ7Cn07Cm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheVJlYWRlcjsKCn0seyIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUs" +
        "bW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpOwp2YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTsKdmFyIEFycmF5UmVhZGVyID0g" +
        "cmVxdWlyZSgnLi9BcnJheVJlYWRlcicpOwp2YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTsKdmFyIE5vZGVCdWZmZXJSZWFkZXIgPSByZXF1aXJlKCcuL05vZGVCdWZmZXJSZWFk" +
        "ZXInKTsKdmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL1VpbnQ4QXJyYXlSZWFkZXInKTsKCi8qKgogKiBDcmVhdGUgYSByZWFkZXIgYWRhcHRlZCB0byB0aGUgZGF0YS4KICogQHBhcmFtIHtTdHJp" +
        "bmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC4KICogQHJldHVybiB7RGF0YVJlYWRlcn0gdGhlIGRhdGEgcmVhZGVyLgogKi8KbW9kdWxlLmV4cG9ydHMgPSBm" +
        "dW5jdGlvbiAoZGF0YSkgewogICAgdmFyIHR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7CiAgICB1dGlscy5jaGVja1N1cHBvcnQodHlwZSk7CiAgICBpZiAodHlwZSA9PT0gInN0cmluZyIgJiYgIXN1cHBv" +
        "cnQudWludDhhcnJheSkgewogICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpOwogICAgfQogICAgaWYgKHR5cGUgPT09ICJub2RlYnVmZmVyIikgewogICAgICAgIHJldHVybiBuZXcgTm9kZUJ1" +
        "ZmZlclJlYWRlcihkYXRhKTsKICAgIH0KICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHsKICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oInVpbnQ4YXJyYXki" +
        "LCBkYXRhKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKCJhcnJheSIsIGRhdGEpKTsKfTsKCn0seyIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0Fy" +
        "cmF5UmVhZGVyIjoxNywiLi9Ob2RlQnVmZmVyUmVhZGVyIjoxOSwiLi9TdHJpbmdSZWFkZXIiOjIwLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMp" +
        "ewondXNlIHN0cmljdCc7CmV4cG9ydHMuTE9DQUxfRklMRV9IRUFERVIgPSAiUEtceDAzXHgwNCI7CmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9ICJQS1x4MDFceDAyIjsKZXhwb3J0cy5DRU5UUkFMX0RJ" +
        "UkVDVE9SWV9FTkQgPSAiUEtceDA1XHgwNiI7CmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9ICJQS1x4MDZceDA3IjsKZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQg" +
        "PSAiUEtceDA2XHgwNiI7CmV4cG9ydHMuREFUQV9ERVNDUklQVE9SID0gIlBLXHgwN1x4MDgiOwoKfSx7fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgp2YXIg" +
        "R2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpOwoKLyoqCiAqIEEgd29ya2VyIHdoaWNoIGNvbnZlcnQgY2h1bmtzIHRvIGEg" +
        "c3BlY2lmaWVkIHR5cGUuCiAqIEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuCiAqLwpmdW5jdGlvbiBDb252ZXJ0V29ya2VyKGRlc3RUeXBlKSB7" +
        "CiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgIkNvbnZlcnRXb3JrZXIgdG8gIiArIGRlc3RUeXBlKTsKICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTsKfQp1dGlscy5pbmhlcml0cyhDb252ZXJ0V29y" +
        "a2VyLCBHZW5lcmljV29ya2VyKTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rCiAqLwpDb252ZXJ0V29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmsp" +
        "IHsKICAgIHRoaXMucHVzaCh7CiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLAogICAgICAgIG1ldGEgOiBjaHVuay5tZXRhCiAgICB9KTsKfTsKbW9k" +
        "dWxlLmV4cG9ydHMgPSBDb252ZXJ0V29ya2VyOwoKfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3Qn" +
        "OwoKdmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTsKdmFyIGNyYzMyID0gcmVxdWlyZSgnLi4vY3JjMzInKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTsKCi8q" +
        "KgogKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIGNyYzMyIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBDcmMzMlByb2JlKCkgewogICAgR2Vu" +
        "ZXJpY1dvcmtlci5jYWxsKHRoaXMsICJDcmMzMlByb2JlIik7CiAgICB0aGlzLndpdGhTdHJlYW1JbmZvKCJjcmMzMiIsIDApOwp9CnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpOwoK" +
        "LyoqCiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmsKICovCkNyYzMyUHJvYmUucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykgewogICAgdGhpcy5zdHJlYW1JbmZvLmNy" +
        "YzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApOwogICAgdGhpcy5wdXNoKGNodW5rKTsKfTsKbW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlOwoKfSx7Ii4uL2NyYzMy" +
        "Ijo0LCIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0" +
        "aWxzJyk7CnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7CgovKioKICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgZmxv" +
        "d2luZyB0aHJvdWdoLgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lIHRoZSBuYW1lIHVzZWQgdG8gZXhwb3NlIHRoZSBsZW5ndGgKICovCmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9i" +
        "ZShwcm9wTmFtZSkgewogICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsICJEYXRhTGVuZ3RoUHJvYmUgZm9yICIgKyBwcm9wTmFtZSk7CiAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7CiAgICB0aGlzLndp" +
        "dGhTdHJlYW1JbmZvKHByb3BOYW1lLCAwKTsKfQp1dGlscy5pbmhlcml0cyhEYXRhTGVuZ3RoUHJvYmUsIEdlbmVyaWNXb3JrZXIpOwoKLyoqCiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmsKICov" +
        "CkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7CiAgICBpZihjaHVuaykgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnN0cmVhbUluZm9bdGhpcy5w" +
        "cm9wTmFtZV0gfHwgMDsKICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDsKICAgIH0KICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBy" +
        "b2Nlc3NDaHVuay5jYWxsKHRoaXMsIGNodW5rKTsKfTsKbW9kdWxlLmV4cG9ydHMgPSBEYXRhTGVuZ3RoUHJvYmU7CgoKfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI3OltmdW5jdGlv" +
        "bihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTsKdmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXIn" +
        "KTsKCi8vIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY2h1bmtzCi8vIFRPRE8gZXhwb3NlIHRoaXMgYXMgYSBwdWJsaWMgdmFyaWFibGUKdmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDsKCi8q" +
        "KgogKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtQcm9taXNlfSBkYXRhUCB0aGUgcHJvbWlzZSBvZiB0aGUgZGF0YSB0" +
        "byBzcGxpdAogKi8KZnVuY3Rpb24gRGF0YVdvcmtlcihkYXRhUCkgewogICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsICJEYXRhV29ya2VyIik7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLmRhdGFJ" +
        "c1JlYWR5ID0gZmFsc2U7CiAgICB0aGlzLmluZGV4ID0gMDsKICAgIHRoaXMubWF4ID0gMDsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLnR5cGUgPSAiIjsKCiAgICB0aGlzLl90aWNrU2NoZWR1bGVk" +
        "ID0gZmFsc2U7CgogICAgZGF0YVAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgIHNlbGYuZGF0YUlzUmVhZHkgPSB0cnVlOwogICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CiAgICAgICAgc2VsZi5tYXgg" +
        "PSBkYXRhICYmIGRhdGEubGVuZ3RoIHx8IDA7CiAgICAgICAgc2VsZi50eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpOwogICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7CiAgICAgICAgICAgIHNlbGYuX3Rp" +
        "Y2tBbmRSZXBlYXQoKTsKICAgICAgICB9CiAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgIHNlbGYuZXJyb3IoZSk7CiAgICB9KTsKfQoKdXRpbHMuaW5oZXJpdHMoRGF0YVdvcmtlciwgR2VuZXJpY1dvcmtl" +
        "cik7CgovKioKICogQHNlZSBHZW5lcmljV29ya2VyLmNsZWFuVXAKICovCkRhdGFXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7CiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVh" +
        "blVwLmNhbGwodGhpcyk7CiAgICB0aGlzLmRhdGEgPSBudWxsOwp9OwoKLyoqCiAqIEBzZWUgR2VuZXJpY1dvcmtlci5yZXN1bWUKICovCkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgp" +
        "IHsKICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoIXRoaXMuX3RpY2tTY2hlZHVsZWQgJiYgdGhp" +
        "cy5kYXRhSXNSZWFkeSkgewogICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTsKICAgIH0KICAgIHJldHVy" +
        "biB0cnVlOwp9OwoKLyoqCiAqIFRyaWdnZXIgYSB0aWNrIGEgc2NoZWR1bGUgYW4gb3RoZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgogKi8KRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBm" +
        "dW5jdGlvbigpIHsKICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5f" +
        "dGljaygpOwogICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkgewogICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTsKICAgICAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gdHJ1" +
        "ZTsKICAgIH0KfTsKCi8qKgogKiBSZWFkIGFuZCBwdXNoIGEgY2h1bmsuCiAqLwpEYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkgewoKICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5p" +
        "c0ZpbmlzaGVkKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFOwogICAgdmFyIGRhdGEgPSBudWxsLCBuZXh0SW5kZXggPSBNYXRoLm1pbih0" +
        "aGlzLm1heCwgdGhpcy5pbmRleCArIHNpemUpOwogICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5tYXgpIHsKICAgICAgICAvLyBFT0YKICAgICAgICByZXR1cm4gdGhpcy5lbmQoKTsKICAgIH0gZWxzZSB7CiAg" +
        "ICAgICAgc3dpdGNoKHRoaXMudHlwZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCwgbmV4dEluZGV4KTsK" +
        "ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInVpbnQ4YXJyYXkiOgogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpOwogICAg" +
        "ICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgICBjYXNlICJub2RlYnVmZmVyIjoKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRl" +
        "eCwgbmV4dEluZGV4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW5kZXggPSBuZXh0SW5kZXg7CiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7CiAgICAgICAgICAgIGRhdGEg" +
        "OiBkYXRhLAogICAgICAgICAgICBtZXRhIDogewogICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMAogICAgICAgICAgICB9CiAgICAgICAg" +
        "fSk7CiAgICB9Cn07Cgptb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7Cgp9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMp" +
        "ewondXNlIHN0cmljdCc7CgovKioKICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlCiAqIGEgbm9kZWpzIHN0cmVhbSBi" +
        "dXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzLiBPbiB0aGUgZ29vZCBzaWRlIDoKICogLSBpdCB3b3JrcyBvbiBJRSA2LTkgd2l0aG91dCBhbnkgaXNzdWUgLyBwb2x5ZmlsbAogKiAtIGl0IHdlaWdodHMgbGVzcyB0" +
        "aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeQogKiAtIGl0IGZvcndhcmRzIGVycm9ycyAobm8gbmVlZCB0byBkZWNsYXJlIGFuIGVycm9yIGhhbmRsZXIgRVZFUllXSEVS" +
        "RSkKICoKICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhbgogKiBvYmplY3QgY29udGFpbmluZyBhbnl0aGluZyAoYHBl" +
        "cmNlbnRgIGZvciBleGFtcGxlKSwgc2VlIGVhY2ggd29ya2VyIGZvciBtb3JlCiAqIGRldGFpbHMuIFRoZSBsYXR0ZXIgaXMgdGhlIHJlYWwgZGF0YSAoU3RyaW5nLCBVaW50OEFycmF5LCBldGMpLgogKgogKiBA" +
        "Y29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAobWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcykKICovCmZ1bmN0aW9uIEdlbmVyaWNXb3Jr" +
        "ZXIobmFtZSkgewogICAgLy8gdGhlIG5hbWUgb2YgdGhlIHdvcmtlcgogICAgdGhpcy5uYW1lID0gbmFtZSB8fCAiZGVmYXVsdCI7CiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0" +
        "aGUgd29ya2VycyBjaGFpbgogICAgdGhpcy5zdHJlYW1JbmZvID0ge307CiAgICAvLyBhbiBlcnJvciB3aGljaCBoYXBwZW5lZCB3aGVuIHRoZSB3b3JrZXIgd2FzIHBhdXNlZAogICAgdGhpcy5nZW5lcmF0ZWRF" +
        "cnJvciA9IG51bGw7CiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSB0byBiZSBtZXJnZWQgYnkgdGhpcyB3b3JrZXIgaW50byB0aGUgZ2VuZXJhbCBtZXRhZGF0YQogICAgdGhpcy5leHRyYVN0" +
        "cmVhbUluZm8gPSB7fTsKICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlCiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1" +
        "ZTsKICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBmaW5pc2hlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2UKICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlOwogICAg" +
        "Ly8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGxvY2tlZCB0byBwcmV2ZW50IGZ1cnRoZXIgc3RydWN0dXJlIHVwZGF0ZXMgKHBpcGUpLCBmYWxzZSBvdGhlcndpc2UKICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTsK" +
        "ICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnMKICAgIHRoaXMuX2xpc3RlbmVycyA9IHsKICAgICAgICAnZGF0YSc6W10sCiAgICAgICAgJ2VuZCc6W10sCiAgICAgICAgJ2Vycm9yJzpbXQogICAgfTsKICAgIC8v" +
        "IHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueQogICAgdGhpcy5wcmV2aW91cyA9IG51bGw7Cn0KCkdlbmVyaWNXb3JrZXIucHJvdG90eXBlID0gewogICAgLyoqCiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhl" +
        "IG5leHQgd29ya2Vycy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHVzaAogICAgICovCiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7CiAgICAgICAgdGhpcy5lbWl0KCJk" +
        "YXRhIiwgY2h1bmspOwogICAgfSwKICAgIC8qKgogICAgICogRW5kIHRoZSBzdHJlYW0uCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyLCBmYWxzZSBv" +
        "dGhlcndpc2UuCiAgICAgKi8KICAgIGVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHRo" +
        "aXMuZmx1c2goKTsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmVtaXQoImVuZCIpOwogICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTsKICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTsK" +
        "ICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAogICAgLyoqCiAgICAgKiBFbmQgdGhlIHN0" +
        "cmVhbSB3aXRoIGFuIGVycm9yLgogICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLgogICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0" +
        "aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciB3aXRoIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVk" +
        "KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmKHRoaXMuaXNQYXVzZWQpIHsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7CiAgICAgICAgfSBlbHNl" +
        "IHsKICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBlKTsKCiAgICAgICAgICAgIC8vIGluIHRoZSB3b3JrZXJzIGNoYWluIGV4cGxvZGVk" +
        "IGluIHRoZSBtaWRkbGUgb2YgdGhlIGNoYWluLAogICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeQogICAgICAgICAgICAvLyB3" +
        "b3JrZXJzIHVwd2FyZCB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yLgogICAgICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpOwogICAg" +
        "ICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAogICAgLyoqCiAgICAgKiBBZGQgYSBjYWxsYmFjayBvbiBhbiBldmVudC4K" +
        "ICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcikKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIHRoZSBmdW5jdGlvbiB0byBj" +
        "YWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZAogICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmFiaWxpdHkKICAgICAqLwogICAgb24gOiBmdW5j" +
        "dGlvbiAobmFtZSwgbGlzdGVuZXIpIHsKICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgLyoqCiAgICAgKiBDbGVhbiBh" +
        "bnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy4KICAgICAqLwogICAgY2xlYW5VcCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9y" +
        "ID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsOwogICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdOwogICAgfSwKICAgIC8qKgogICAgICogVHJpZ2dlciBhbiBldmVudC4gVGhpcyB3aWxsIGNhbGwgcmVn" +
        "aXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBwcm92aWRlZCBhcmcuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGRhdGEsIGVuZCwgZXJyb3IpCiAgICAgKiBAcGFy" +
        "YW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLgogICAgICovCiAgICBlbWl0IDogZnVuY3Rpb24gKG5hbWUsIGFyZykgewogICAgICAgIGlmICh0aGlzLl9saXN0" +
        "ZW5lcnNbbmFtZV0pIHsKICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVd" +
        "W2ldLmNhbGwodGhpcywgYXJnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIENoYWluIGEgd29ya2VyIHdpdGggYW4gb3RoZXIuCiAgICAgKiBAcGFyYW0ge1dvcmtlcn0g" +
        "bmV4dCB0aGUgd29ya2VyIHJlY2VpdmluZyBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvbmUuCiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5CiAgICAgKi8K" +
        "ICAgIHBpcGUgOiBmdW5jdGlvbiAobmV4dCkgewogICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3Ro" +
        "ZXIgZGlyZWN0aW9uLgogICAgICogVXNpbmcgYW4gQVBJIHdpdGggYHBpcGUobmV4dClgIGlzIHZlcnkgZWFzeS4KICAgICAqIEltcGxlbWVudGluZyB0aGUgQVBJIHdpdGggdGhlIHBvaW50IG9mIHZpZXcgb2Yg" +
        "dGhlIG5leHQgb25lIHJlZ2lzdGVyaW5nCiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci4KICAgICAqIEBwYXJhbSB7V29ya2VyfSBwcmV2aW91cyB0aGUgcHJldmlvdXMg" +
        "d29ya2VyLCBzZW5kaW5nIGV2ZW50cyB0byB0aGlzIG9uZQogICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eQogICAgICovCiAgICByZWdpc3RlclByZXZp" +
        "b3VzIDogZnVuY3Rpb24gKHByZXZpb3VzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciICsgdGhpcyArICInIGhhcyBhbHJl" +
        "YWR5IGJlZW4gdXNlZC4iKTsKICAgICAgICB9CgogICAgICAgIC8vIHNoYXJpbmcgdGhlIHN0cmVhbUluZm8uLi4KICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSBwcmV2aW91cy5zdHJlYW1JbmZvOwogICAgICAg" +
        "IC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0cwogICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7CiAgICAgICAgdGhpcy5wcmV2aW91cyA9ICBwcmV2aW91czsKICAgICAgICB2YXIgc2VsZiA9IHRo" +
        "aXM7CiAgICAgICAgcHJldmlvdXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsKICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ2h1bmsoY2h1bmspOwogICAgICAgIH0pOwogICAgICAgIHByZXZpb3VzLm9u" +
        "KCdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNlbGYuZW5kKCk7CiAgICAgICAgfSk7CiAgICAgICAgcHJldmlvdXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgc2VsZi5l" +
        "cnJvcihlKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAvKioKICAgICAqIFBhdXNlIHRoZSBzdHJlYW0gc28gaXQgZG9lc24ndCBzZW5kIGV2ZW50cyBhbnltb3JlLgogICAg" +
        "ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcGF1c2VkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYo" +
        "dGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTsKCiAgICAgICAgaWYodGhpcy5w" +
        "cmV2aW91cykgewogICAgICAgICAgICB0aGlzLnByZXZpb3VzLnBhdXNlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKICAgIC8qKgogICAgICogUmVzdW1lIGEgcGF1c2VkIHN0cmVh" +
        "bS4KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHJlc3VtZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICovCiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7CiAg" +
        "ICAgICAgaWYoIXRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlOwoKICAgICAg" +
        "ICAvLyBpZiB0cnVlLCB0aGUgd29ya2VyIHRyaWVkIHRvIHJlc3VtZSBidXQgZmFpbGVkCiAgICAgICAgdmFyIHdpdGhFcnJvciA9IGZhbHNlOwogICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHsKICAg" +
        "ICAgICAgICAgdGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKTsKICAgICAgICAgICAgd2l0aEVycm9yID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5wcmV2aW91cykgewogICAgICAgICAg" +
        "ICB0aGlzLnByZXZpb3VzLnJlc3VtZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICF3aXRoRXJyb3I7CiAgICB9LAogICAgLyoqCiAgICAgKiBGbHVzaCBhbnkgcmVtYWluaW5nIGJ5dGVzIGFzIHRoZSBz" +
        "dHJlYW0gaXMgZW5kaW5nLgogICAgICovCiAgICBmbHVzaCA6IGZ1bmN0aW9uICgpIHt9LAogICAgLyoqCiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRk" +
        "ZW4uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHByb2Nlc3MuCiAgICAgKi8KICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7CiAgICAgICAgdGhpcy5wdXNoKGNo" +
        "dW5rKTsKICAgIH0sCiAgICAvKioKICAgICAqIEFkZCBhIGtleS92YWx1ZSB0byBiZSBhZGRlZCBpbiB0aGUgd29ya2VycyBjaGFpbiBzdHJlYW1JbmZvIG9uY2UgYWN0aXZhdGVkLgogICAgICogQHBhcmFtIHtT" +
        "dHJpbmd9IGtleSB0aGUga2V5IHRvIHVzZQogICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlCiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBm" +
        "b3IgY2hhaW5hYmlsaXR5CiAgICAgKi8KICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldID0gdmFsdWU7CiAgICAgICAg" +
        "dGhpcy5tZXJnZVN0cmVhbUluZm8oKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAvKioKICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVh" +
        "bUluZm8uCiAgICAgKi8KICAgIG1lcmdlU3RyZWFtSW5mbyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykgewogICAgICAgICAgICBpZiAoIXRoaXMu" +
        "ZXh0cmFTdHJlYW1JbmZvLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc3RyZWFtSW5mb1trZXldID0gdGhpcy5l" +
        "eHRyYVN0cmVhbUluZm9ba2V5XTsKICAgICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLgog" +
        "ICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYWxsIGNhbGxzIHRvIHBpcGUgd2lsbCBmYWlsLgogICAgICovCiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQp" +
        "IHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciICsgdGhpcyArICInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4iKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IHRy" +
        "dWU7CiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHsKICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5sb2NrKCk7CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBQcmV0dHkgcHJpbnQg" +
        "dGhlIHdvcmtlcnMgY2hhaW4uCiAgICAgKi8KICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBtZSA9ICJXb3JrZXIgIiArIHRoaXMubmFtZTsKICAgICAgICBpZiAodGhpcy5wcmV2aW91" +
        "cykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyArICIgLT4gIiArIG1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBtZTsKICAgICAgICB9CiAgICB9Cn07Cgptb2R1bGUu" +
        "ZXhwb3J0cyA9IEdlbmVyaWNXb3JrZXI7Cgp9LHt9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7CnZh" +
        "ciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7CnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7CnZhciBiYXNlNjQgPSByZXF1aXJlKCcuLi9i" +
        "YXNlNjQnKTsKdmFyIHN1cHBvcnQgPSByZXF1aXJlKCIuLi9zdXBwb3J0Iik7CnZhciBleHRlcm5hbCA9IHJlcXVpcmUoIi4uL2V4dGVybmFsIik7Cgp2YXIgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciA9IG51" +
        "bGw7CmlmIChzdXBwb3J0Lm5vZGVzdHJlYW0pIHsKICAgIHRyeSB7CiAgICAgICAgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciA9IHJlcXVpcmUoJy4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVy" +
        "Jyk7CiAgICB9IGNhdGNoKGUpIHt9Cn0KCi8qKgogKiBBcHBseSB0aGUgZmluYWwgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGRhdGEuIElmIHRoZSB1c2VyIHdhbnRzIGEgQmxvYiBmb3IKICogZXhhbXBsZSwgaXQn" +
        "cyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlCiAqIEFycmF5QnVmZmVyL0Jsb2IgY29udmVyc2lvbi4KICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG5hbWUg" +
        "b2YgdGhlIGZpbmFsIHR5cGUKICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtCiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUg" +
        "bWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLgogKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIGNvbnRlbnQgaW4gdGhlIHJpZ2h0" +
        "IGZvcm1hdC4KICovCmZ1bmN0aW9uIHRyYW5zZm9ybVppcE91dHB1dCh0eXBlLCBjb250ZW50LCBtaW1lVHlwZSkgewogICAgc3dpdGNoKHR5cGUpIHsKICAgICAgICBjYXNlICJibG9iIiA6CiAgICAgICAgICAg" +
        "IHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKCJhcnJheWJ1ZmZlciIsIGNvbnRlbnQpLCBtaW1lVHlwZSk7CiAgICAgICAgY2FzZSAiYmFzZTY0IiA6CiAgICAgICAgICAgIHJldHVybiBi" +
        "YXNlNjQuZW5jb2RlKGNvbnRlbnQpOwogICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8odHlwZSwgY29udGVudCk7CiAgICB9Cn0KCi8qKgogKiBDb25jYXRlbmF0" +
        "ZSBhbiBhcnJheSBvZiBkYXRhIG9mIHRoZSBnaXZlbiB0eXBlLgogKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gYXJyYXkuCiAqIEBwYXJhbSB7QXJyYXl9" +
        "IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGUKICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgY29uY2F0ZW5hdGVkIGRh" +
        "dGEKICogQHRocm93cyBFcnJvciBpZiB0aGUgYXNrZWQgdHlwZSBpcyB1bnN1cHBvcnRlZAogKi8KZnVuY3Rpb24gY29uY2F0ICh0eXBlLCBkYXRhQXJyYXkpIHsKICAgIHZhciBpLCBpbmRleCA9IDAsIHJlcyA9" +
        "IG51bGwsIHRvdGFsTGVuZ3RoID0gMDsKICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7CiAgICB9CiAg" +
        "ICBzd2l0Y2godHlwZSkgewogICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgIHJldHVybiBkYXRhQXJyYXkuam9pbigiIik7CiAgICAgICAgICBjYXNlICJhcnJheSI6CiAgICAgICAgICAgIHJldHVy" +
        "biBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBkYXRhQXJyYXkpOwogICAgICAgIGNhc2UgInVpbnQ4YXJyYXkiOgogICAgICAgICAgICByZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7" +
        "CiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcmVzLnNldChkYXRhQXJyYXlbaV0sIGluZGV4KTsKICAgICAgICAgICAgICAgIGluZGV4" +
        "ICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICBjYXNlICJub2RlYnVmZmVyIjoKICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25j" +
        "YXQoZGF0YUFycmF5KTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImNvbmNhdCA6IHVuc3VwcG9ydGVkIHR5cGUgJyIgICsgdHlwZSArICInIik7CiAgICB9Cn0KCi8qKgog" +
        "KiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYQogKiBjb21wbGV0ZSBibG9jay4KICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhl" +
        "bHBlciB0aGUgaGVscGVyIHRvIHVzZS4KICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2FsbGJhY2sgYSBjYWxsYmFjayBjYWxsZWQgb24gZWFjaCB1cGRhdGUuIENhbGxlZAogKiB3aXRoIG9uZSBhcmcgOgog" +
        "KiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC4KICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLgogKi8KZnVuY3Rpb24gYWNjdW11" +
        "bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7CiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgdmFyIGRhdGFBcnJheSA9IFtdOwog" +
        "ICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSwKICAgICAgICAgICAgcmVzdWx0VHlwZSA9IGhlbHBlci5fb3V0cHV0VHlwZSwKICAgICAgICAgICAgbWltZVR5cGUgPSBoZWxwZXIu" +
        "X21pbWVUeXBlOwogICAgICAgIGhlbHBlcgogICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7CiAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKGRhdGEpOwogICAgICAgICAgICBpZih1" +
        "cGRhdGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2sobWV0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAg" +
        "ICAgICAgICAgZGF0YUFycmF5ID0gW107CiAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0pCiAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKXsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAg" +
        "ICAgICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1aaXBPdXRwdXQocmVzdWx0VHlwZSwgY29uY2F0KGNodW5rVHlwZSwgZGF0YUFycmF5KSwgbWltZVR5cGUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1" +
        "bHQpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YUFycmF5ID0gW107CiAgICAgICAgfSkKICAgICAgICAu" +
        "cmVzdW1lKCk7CiAgICB9KTsKfQoKLyoqCiAqIEFuIGhlbHBlciB0byBlYXNpbHkgdXNlIHdvcmtlcnMgb3V0c2lkZSBvZiBKU1ppcC4KICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIg" +
        "dGhlIHdvcmtlciB0byB3cmFwCiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgYnkgdGhlIHVzZQogKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1p" +
        "bWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS4KICovCmZ1bmN0aW9uIFN0cmVhbUhlbHBlcih3b3JrZXIsIG91dHB1dFR5cGUsIG1pbWVUeXBlKSB7CiAgICB2YXIgaW50ZXJuYWxUeXBlID0g" +
        "b3V0cHV0VHlwZTsKICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7CiAgICAgICAgY2FzZSAiYmxvYiI6CiAgICAgICAgY2FzZSAiYXJyYXlidWZmZXIiOgogICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSAidWludDhh" +
        "cnJheSI7CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gInN0cmluZyI7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgdHJ5IHsKICAgICAg" +
        "ICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHkKICAgICAgICB0aGlzLl9pbnRlcm5hbFR5cGUgPSBpbnRlcm5hbFR5cGU7CiAgICAgICAgLy8gdGhlIHR5cGUgdXNlZCB0byBvdXRwdXQgcmVzdWx0cwogICAg" +
        "ICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlOwogICAgICAgIC8vIHRoZSBtaW1lIHR5cGUKICAgICAgICB0aGlzLl9taW1lVHlwZSA9IG1pbWVUeXBlOwogICAgICAgIHV0aWxzLmNoZWNrU3VwcG9y" +
        "dChpbnRlcm5hbFR5cGUpOwogICAgICAgIHRoaXMuX3dvcmtlciA9IHdvcmtlci5waXBlKG5ldyBDb252ZXJ0V29ya2VyKGludGVybmFsVHlwZSkpOwogICAgICAgIC8vIHRoZSBsYXN0IHdvcmtlcnMgY2FuIGJl" +
        "IHJld2lyZWQgd2l0aG91dCBpc3N1ZXMgYnV0IHdlIG5lZWQgdG8KICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuCiAgICAgICAgd29ya2VyLmxvY2soKTsKICAgIH0g" +
        "Y2F0Y2goZSkgewogICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKCJlcnJvciIpOwogICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTsKICAgIH0KfQoKU3RyZWFtSGVscGVyLnByb3Rv" +
        "dHlwZSA9IHsKICAgIC8qKgogICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGEKICAgICAqIGNvbXBsZXRlIGJsb2NrLgog" +
        "ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay4KICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi4KICAgICAqLwog" +
        "ICAgYWNjdW11bGF0ZSA6IGZ1bmN0aW9uICh1cGRhdGVDYikgewogICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTsKICAgIH0sCiAgICAvKioKICAgICAqIEFkZCBhIGxpc3RlbmVyIG9u" +
        "IGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldnQgdGhlIG5hbWUgb2YgdGhlIGV2ZW50CiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgbGlzdGVu" +
        "ZXIKICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLgogICAgICovCiAgICBvbiA6IGZ1bmN0aW9uIChldnQsIGZuKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAg" +
        "ICAgICBpZihldnQgPT09ICJkYXRhIikgewogICAgICAgICAgICB0aGlzLl93b3JrZXIub24oZXZ0LCBmdW5jdGlvbiAoY2h1bmspIHsKICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwg" +
        "Y2h1bmsubWV0YSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHV0aWxzLmRlbGF5" +
        "KGZuLCBhcmd1bWVudHMsIHNlbGYpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZXN1bWUgdGhlIGZsb3cgb2YgY2h1bmtzLgog" +
        "ICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuCiAgICAgKi8KICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICB1dGlscy5kZWxheSh0aGlzLl93b3JrZXIucmVz" +
        "dW1lLCBbXSwgdGhpcy5fd29ya2VyKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAvKioKICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy4KICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBl" +
        "cn0gdGhlIGN1cnJlbnQgaGVscGVyLgogICAgICovCiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLl93b3JrZXIucGF1c2UoKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAv" +
        "KioKICAgICAqIFJldHVybiBhIG5vZGVqcyBzdHJlYW0gZm9yIHRoaXMgaGVscGVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay4KICAgICAqIEByZXR1cm4g" +
        "e05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJ9IHRoZSBub2RlanMgc3RyZWFtLgogICAgICovCiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikgewogICAgICAgIHV0aWxzLmNoZWNrU3Vw" +
        "cG9ydCgibm9kZXN0cmVhbSIpOwogICAgICAgIGlmICh0aGlzLl9vdXRwdXRUeXBlICE9PSAibm9kZWJ1ZmZlciIpIHsKICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHN0cmVhbSBjb250YWluaW5nIGJsb2IvYXJy" +
        "YXlidWZmZXIvdWludDhhcnJheS9zdHJpbmcKICAgICAgICAgICAgLy8gaXMgc3RyYW5nZSBhbmQgSSBkb24ndCBrbm93IGlmIGl0IHdvdWxkIGJlIHVzZWZ1bC4KICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0" +
        "aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGEKICAgICAgICAgICAgLy8gYnVnIHJlcG9ydCAhCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRU" +
        "eXBlICsgIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIodGhpcywgewogICAgICAgICAgICBv" +
        "YmplY3RNb2RlIDogdGhpcy5fb3V0cHV0VHlwZSAhPT0gIm5vZGVidWZmZXIiCiAgICAgICAgfSwgdXBkYXRlQ2IpOwogICAgfQp9OwoKCm1vZHVsZS5leHBvcnRzID0gU3RyZWFtSGVscGVyOwoKfSx7Ii4uL2Jh" +
        "c2U2NCI6MSwiLi4vZXh0ZXJuYWwiOjYsIi4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyIjoxMywiLi4vc3VwcG9ydCI6MzAsIi4uL3V0aWxzIjozMiwiLi9Db252ZXJ0V29ya2VyIjoyNCwiLi9H" +
        "ZW5lcmljV29ya2VyIjoyOH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKZXhwb3J0cy5iYXNlNjQgPSB0cnVlOwpleHBvcnRzLmFycmF5ID0gdHJ1ZTsKZXhw" +
        "b3J0cy5zdHJpbmcgPSB0cnVlOwpleHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgVWludDhBcnJheSAhPT0gInVuZGVmaW5lZCI7CmV4cG9y" +
        "dHMubm9kZWJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiOwovLyBjb250YWlucyB0cnVlIGlmIEpTWmlwIGNhbiByZWFkL2dlbmVyYXRlIFVpbnQ4QXJyYXksIGZhbHNlIG90aGVyd2lzZS4K" +
        "ZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICJ1bmRlZmluZWQiOwoKaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gInVuZGVmaW5lZCIpIHsKICAgIGV4cG9ydHMuYmxvYiA9IGZh" +
        "bHNlOwp9CmVsc2UgewogICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTsKICAgIHRyeSB7CiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgICAgICAgdHlw" +
        "ZTogImFwcGxpY2F0aW9uL3ppcCIKICAgICAgICB9KS5zaXplID09PSAwOwogICAgfQogICAgY2F0Y2ggKGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgQnVpbGRlciA9IHNlbGYuQmxvYkJ1aWxk" +
        "ZXIgfHwgc2VsZi5XZWJLaXRCbG9iQnVpbGRlciB8fCBzZWxmLk1vekJsb2JCdWlsZGVyIHx8IHNlbGYuTVNCbG9iQnVpbGRlcjsKICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpOwogICAg" +
        "ICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpOwogICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBidWlsZGVyLmdldEJsb2IoJ2FwcGxpY2F0aW9uL3ppcCcpLnNpemUgPT09IDA7CiAgICAgICAgfQogICAg" +
        "ICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KfQoKdHJ5IHsKICAgIGV4cG9ydHMubm9kZXN0cmVhbSA9ICEhcmVxdWlyZSgncmVhZGFibGUt" +
        "c3RyZWFtJykuUmVhZGFibGU7Cn0gY2F0Y2goZSkgewogICAgZXhwb3J0cy5ub2Rlc3RyZWFtID0gZmFsc2U7Cn0KCn0seyJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxl" +
        "LGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgp2YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7CnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7CnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUo" +
        "Jy4vbm9kZWpzVXRpbHMnKTsKdmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7CgovKioKICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28s" +
        "IGZyb20gcGFrby9saWIvdXRpbHMvc3RyaW5ncwogKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby8KICovCgovLyBUYWJsZSB3" +
        "aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKQovLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBi" +
        "ZSByZXByZXNlbnRlZCBpbiBKUywKLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmCnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpOwpmb3IgKHZhciBpPTA7IGk8MjU2OyBp" +
        "KyspIHsKICBfdXRmOGxlbltpXSA9IChpID49IDI1MiA/IDYgOiBpID49IDI0OCA/IDUgOiBpID49IDI0MCA/IDQgOiBpID49IDIyNCA/IDMgOiBpID49IDE5MiA/IDIgOiAxKTsKfQpfdXRmOGxlblsyNTRdPV91" +
        "dGY4bGVuWzI1NF09MTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydAoKLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKQp2YXIgc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChz" +
        "dHIpIHsKICAgIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwOwoKICAgIC8vIGNvdW50IGJpbmFyeSBzaXplCiAgICBmb3IgKG1fcG9zID0gMDsgbV9w" +
        "b3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7CiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTsKICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkg" +
        "ewogICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpOwogICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7CiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgo" +
        "YyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTsKICAgICAgICAgICAgICAgIG1fcG9zKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBj" +
        "IDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDsKICAgIH0KCiAgICAvLyBhbGxvY2F0ZSBidWZmZXIKICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHsKICAgICAgICBidWYgPSBuZXcgVWludDhB" +
        "cnJheShidWZfbGVuKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pOwogICAgfQoKICAgIC8vIGNvbnZlcnQKICAgIGZvciAoaT0wLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVu" +
        "OyBtX3BvcysrKSB7CiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTsKICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkgewogICAgICAgICAg" +
        "ICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpOwogICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7CiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkg" +
        "PDwgMTApICsgKGMyIC0gMHhkYzAwKTsKICAgICAgICAgICAgICAgIG1fcG9zKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGMgPCAweDgwKSB7CiAgICAgICAgICAgIC8qIG9uZSBieXRl" +
        "ICovCiAgICAgICAgICAgIGJ1ZltpKytdID0gYzsKICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkgewogICAgICAgICAgICAvKiB0d28gYnl0ZXMgKi8KICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwg" +
        "KGMgPj4+IDYpOwogICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpOwogICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHsKICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi8KICAg" +
        "ICAgICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTsKICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTsKICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMg" +
        "JiAweDNmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBmb3VyIGJ5dGVzICovCiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7CiAgICAgICAgICAgIGJ1ZltpKytdID0g" +
        "MHg4MCB8IChjID4+PiAxMiAmIDB4M2YpOwogICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpOwogICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpOwogICAg" +
        "ICAgIH0KICAgIH0KCiAgICByZXR1cm4gYnVmOwp9OwoKLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlciwKLy8gdGhhdCB3aWxsIG5vdCBicmVhayBzZXF1ZW5jZS4gSWYg" +
        "dGhhdCdzIG5vdCBwb3NzaWJsZQovLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLgovLwovLyBidWZbXSAtIHV0ZjggYnl0ZXMgYXJyYXkKLy8gbWF4ICAgLSBsZW5ndGggbGlt" +
        "aXQgKG1hbmRhdG9yeSk7CnZhciB1dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHsKICAgIHZhciBwb3M7CgogICAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7CiAgICBpZiAobWF4ID4gYnVmLmxlbmd0" +
        "aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9CgogICAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kCiAgICBwb3MgPSBtYXgtMTsKICAgIHdoaWxlIChw" +
        "b3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfQoKICAgIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSwKICAgIC8vIHJldHVybiBtYXgsIGJl" +
        "Y2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LgogICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfQoKICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBt" +
        "ZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLAogICAgLy8gcmV0dXJuIG1heCB0b28uCiAgICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH0KCiAgICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3Nd" +
        "XSA+IG1heCkgPyBwb3MgOiBtYXg7Cn07CgovLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZwp2YXIgYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHsKICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47CiAg" +
        "ICB2YXIgbGVuID0gYnVmLmxlbmd0aDsKCiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpCiAgICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBz" +
        "aWduaWZpY2FudGx5IGZhc3RlciBmb3IKICAgIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuCiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpOwoKICAg" +
        "IGZvciAob3V0PTAsIGk9MDsgaTxsZW47KSB7CiAgICAgICAgYyA9IGJ1ZltpKytdOwogICAgICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWkKICAgICAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0Kytd" +
        "ID0gYzsgY29udGludWU7IH0KCiAgICAgICAgY19sZW4gPSBfdXRmOGxlbltjXTsKICAgICAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXMKICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsr" +
        "XSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfQoKICAgICAgICAvLyBhcHBseSBtYXNrIG9uIGZpcnN0IGJ5dGUKICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAz" +
        "ID8gMHgwZiA6IDB4MDc7CiAgICAgICAgLy8gam9pbiB0aGUgcmVzdAogICAgICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikgewogICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAw" +
        "eDNmKTsKICAgICAgICAgICAgY19sZW4tLTsKICAgICAgICB9CgogICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz8KICAgICAgICBpZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9" +
        "IDB4ZmZmZDsgY29udGludWU7IH0KCiAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7CiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYyAtPSAweDEw" +
        "MDAwOwogICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpOwogICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTsKICAg" +
        "ICAgICB9CiAgICB9CgogICAgLy8gc2hyaW5rQnVmKHV0ZjE2YnVmLCBvdXQpCiAgICBpZiAodXRmMTZidWYubGVuZ3RoICE9PSBvdXQpIHsKICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkgewogICAgICAg" +
        "ICAgICB1dGYxNmJ1ZiA9IHV0ZjE2YnVmLnN1YmFycmF5KDAsIG91dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0OwogICAgICAgIH0KICAgIH0KCiAgICAvLyBy" +
        "ZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGYxNmJ1Zik7CiAgICByZXR1cm4gdXRpbHMuYXBwbHlGcm9tQ2hhckNvZGUodXRmMTZidWYpOwp9OwoKCi8vIFRoYXQncyBhbGwgZm9yIHRo" +
        "ZSBwYWtvIGZ1bmN0aW9ucy4KCgovKioKICogVHJhbnNmb3JtIGEgamF2YXNjcmlwdCBzdHJpbmcgaW50byBhbiBhcnJheSAodHlwZWQgaWYgcG9zc2libGUpIG9mIGJ5dGVzLAogKiBVVEYtOCBlbmNvZGVkLgog" +
        "KiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlCiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmcuCiAqLwpleHBvcnRzLnV0" +
        "ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikgewogICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikgewogICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXJGcm9tKHN0ciwgInV0Zi04" +
        "Iik7CiAgICB9CgogICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTsKfTsKCgovKioKICogVHJhbnNmb3JtIGEgYnl0ZXMgYXJyYXkgKG9yIGEgcmVwcmVzZW50YXRpb24pIHJlcHJlc2VudGluZyBhbiBVVEYtOCBl" +
        "bmNvZGVkCiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuCiAqIEBwYXJhbSB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IGJ1ZiB0aGUgZGF0YSBkZSBkZWNvZGUKICogQHJldHVybiB7U3RyaW5n" +
        "fSB0aGUgZGVjb2RlZCBzdHJpbmcuCiAqLwpleHBvcnRzLnV0ZjhkZWNvZGUgPSBmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ1ZikgewogICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikgewogICAgICAgIHJldHVybiB1" +
        "dGlscy50cmFuc2Zvcm1Ubygibm9kZWJ1ZmZlciIsIGJ1ZikudG9TdHJpbmcoInV0Zi04Iik7CiAgICB9CgogICAgYnVmID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gInVpbnQ4YXJy" +
        "YXkiIDogImFycmF5IiwgYnVmKTsKCiAgICByZXR1cm4gYnVmMnN0cmluZyhidWYpOwp9OwoKLyoqCiAqIEEgd29ya2VyIHRvIGRlY29kZSB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcyBpbnRvIHN0cmluZyBj" +
        "aHVua3MuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gVXRmOERlY29kZVdvcmtlcigpIHsKICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCAidXRmLTggZGVjb2RlIik7CiAgICAvLyB0aGUgbGFzdCBi" +
        "eXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC4KICAgIHRoaXMubGVmdE92ZXIgPSBudWxsOwp9CnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVy" +
        "aWNXb3JrZXIpOwoKLyoqCiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmsKICovClV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykgewoKICAg" +
        "IHZhciBkYXRhID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gInVpbnQ4YXJyYXkiIDogImFycmF5IiwgY2h1bmsuZGF0YSk7CgogICAgLy8gMXN0IHN0ZXAsIHJlLXVzZSB3aGF0J3Mg" +
        "bGVmdCBvZiB0aGUgcHJldmlvdXMgY2h1bmsKICAgIGlmICh0aGlzLmxlZnRPdmVyICYmIHRoaXMubGVmdE92ZXIubGVuZ3RoKSB7CiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7CiAgICAgICAgICAg" +
        "IHZhciBwcmV2aW91c0RhdGEgPSBkYXRhOwogICAgICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocHJldmlvdXNEYXRhLmxlbmd0aCArIHRoaXMubGVmdE92ZXIubGVuZ3RoKTsKICAgICAgICAgICAgZGF0" +
        "YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7CiAgICAgICAgICAgIGRhdGEuc2V0KHByZXZpb3VzRGF0YSwgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRhdGEgPSB0" +
        "aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7CiAgICB9CgogICAgdmFyIG5leHRCb3VuZGFyeSA9IHV0Zjhib3JkZXIoZGF0YSk7CiAgICB2" +
        "YXIgdXNhYmxlRGF0YSA9IGRhdGE7CiAgICBpZiAobmV4dEJvdW5kYXJ5ICE9PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHsKICAgICAgICAgICAgdXNhYmxlRGF0YSA9" +
        "IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTsKICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc3ViYXJyYXkobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsK" +
        "ICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTsKICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc2xpY2UobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7" +
        "CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMucHVzaCh7CiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSwKICAgICAgICBtZXRhIDogY2h1bmsubWV0YQogICAgfSk7Cn07Cgov" +
        "KioKICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoCiAqLwpVdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zl" +
        "ci5sZW5ndGgpIHsKICAgICAgICB0aGlzLnB1c2goewogICAgICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLAogICAgICAgICAgICBtZXRhIDoge30KICAgICAgICB9KTsK" +
        "ICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDsKICAgIH0KfTsKZXhwb3J0cy5VdGY4RGVjb2RlV29ya2VyID0gVXRmOERlY29kZVdvcmtlcjsKCi8qKgogKiBBIHdvcmtlciB0byBlbmRjb2RlIHN0cmluZyBj" +
        "aHVua3MgaW50byB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcy4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBVdGY4RW5jb2RlV29ya2VyKCkgewogICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsICJ1" +
        "dGYtOCBlbmNvZGUiKTsKfQp1dGlscy5pbmhlcml0cyhVdGY4RW5jb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTsKCi8qKgogKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rCiAqLwpVdGY4RW5jb2Rl" +
        "V29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHsKICAgIHRoaXMucHVzaCh7CiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGVuY29kZShjaHVuay5kYXRhKSwKICAgICAg" +
        "ICBtZXRhIDogY2h1bmsubWV0YQogICAgfSk7Cn07CmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7Cgp9LHsiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0dlbmVyaWNXb3Jr" +
        "ZXIiOjI4LCIuL3N1cHBvcnQiOjMwLCIuL3V0aWxzIjozMn1dLDMyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKdmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBv" +
        "cnQnKTsKdmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7CnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTsKdmFyIHNldEltbWVkaWF0ZSA9IHJlcXVpcmUoJ3NldC1pbW1l" +
        "ZGlhdGUtc2hpbScpOwp2YXIgZXh0ZXJuYWwgPSByZXF1aXJlKCIuL2V4dGVybmFsIik7CgoKLyoqCiAqIENvbnZlcnQgYSBzdHJpbmcgdGhhdCBwYXNzIGFzIGEgImJpbmFyeSBzdHJpbmciOiBpdCBzaG91bGQg" +
        "cmVwcmVzZW50IGEgYnl0ZQogKiBhcnJheSBidXQgbWF5IGhhdmUgPiAyNTUgY2hhciBjb2Rlcy4gQmUgc3VyZSB0byB0YWtlIG9ubHkgdGhlIGZpcnN0IGJ5dGUKICogYW5kIHJldHVybnMgdGhlIGJ5dGUgYXJy" +
        "YXkuCiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uCiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl9IHRoZSBzdHJpbmcgaW4gYSBiaW5hcnkgZm9ybWF0LgogKi8KZnVu" +
        "Y3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkgewogICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3Ro" +
        "KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShzdHIubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIHJlc3VsdCk7Cn0KCi8qKgogKiBDcmVhdGUg" +
        "YSBuZXcgYmxvYiB3aXRoIHRoZSBnaXZlbiBjb250ZW50IGFuZCB0aGUgZ2l2ZW4gdHlwZS4KICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9i" +
        "LiBETyBOT1QgdXNlCiAqIGFuIFVpbnQ4QXJyYXkgYmVjYXVzZSB0aGUgc3RvY2sgYnJvd3NlciBvZiBhbmRyb2lkIDQgd29uJ3QgYWNjZXB0IGl0IChpdAogKiB3aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0" +
        "byBhIHN0cmluZywgIltvYmplY3QgVWludDhBcnJheV0iKS4KICoKICogVXNlIG9ubHkgT05FIHBhcnQgdG8gYnVpbGQgdGhlIGJsb2IgdG8gYXZvaWQgYSBtZW1vcnkgbGVhayBpbiBJRTExIC8gRWRnZToKICog" +
        "d2hlbiBhIGxhcmdlIGFtb3VudCBvZiBBcnJheSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgQmxvYiwgdGhlIGFtb3VudCBvZgogKiBtZW1vcnkgY29uc3VtZWQgaXMgbmVhcmx5IDEwMCB0aW1lcyB0aGUgb3JpZ2lu" +
        "YWwgZGF0YSBhbW91bnQuCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGJsb2IuCiAqIEByZXR1cm4ge0Jsb2J9IHRoZSBjcmVhdGVkIGJsb2IuCiAqLwpleHBvcnRzLm5l" +
        "d0Jsb2IgPSBmdW5jdGlvbihwYXJ0LCB0eXBlKSB7CiAgICBleHBvcnRzLmNoZWNrU3VwcG9ydCgiYmxvYiIpOwoKICAgIHRyeSB7CiAgICAgICAgLy8gQmxvYiBjb25zdHJ1Y3RvcgogICAgICAgIHJldHVybiBu" +
        "ZXcgQmxvYihbcGFydF0sIHsKICAgICAgICAgICAgdHlwZTogdHlwZQogICAgICAgIH0pOwogICAgfQogICAgY2F0Y2ggKGUpIHsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJv" +
        "d3NlciBvbmx5LCBvbGQgd2F5CiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gc2VsZi5CbG9iQnVpbGRlciB8fCBzZWxmLldlYktpdEJsb2JCdWlsZGVyIHx8IHNlbGYuTW96QmxvYkJ1aWxkZXIgfHwgc2VsZi5N" +
        "U0Jsb2JCdWlsZGVyOwogICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7CiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnQpOwogICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRC" +
        "bG9iKHR5cGUpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewoKICAgICAgICAgICAgLy8gd2VsbCwgZnVjayA/IQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IGNhbid0IGNvbnN0cnVj" +
        "dCB0aGUgQmxvYi4iKTsKICAgICAgICB9CiAgICB9CgoKfTsKLyoqCiAqIFRoZSBpZGVudGl0eSBmdW5jdGlvbi4KICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC4KICogQHJldHVybiB7T2JqZWN0" +
        "fSB0aGUgc2FtZSBpbnB1dC4KICovCmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7CiAgICByZXR1cm4gaW5wdXQ7Cn0KCi8qKgogKiBGaWxsIGluIGFuIGFycmF5IHdpdGggYSBzdHJpbmcuCiAqIEBwYXJhbSB7" +
        "U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuCiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byBmaWxsIGluICh3aWxsIGJlIG11dGF0" +
        "ZWQpLgogKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgYXJyYXkuCiAqLwpmdW5jdGlvbiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIGFycmF5KSB7CiAg" +
        "ICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGOwogICAgfQogICAgcmV0dXJuIGFycmF5Owp9CgovKioKICog" +
        "QW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuCiAqIFRoaXMgY29udGFpbnMgc3RhdGljIGluZm9ybWF0aW9uIGFuZCBmdW5jdGlvbnMgdGhhdAogKiBjYW4gYmUgb3B0aW1pemVk" +
        "IGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci4KICovCnZhciBhcnJheVRvU3RyaW5nSGVscGVyID0gewogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm0gYW4gYXJyYXkgb2YgaW50IGludG8gYSBzdHJpbmcsIGNo" +
        "dW5rIGJ5IGNodW5rLgogICAgICogU2VlIHRoZSBwZXJmb3JtYW5jZXMgbm90ZXMgb24gYXJyYXlMaWtlVG9TdHJpbmcuCiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVy" +
        "fSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGFycmF5LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjaHVuayB0aGUgY2h1" +
        "bmsgc2l6ZS4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuCiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjaHVuayBpcyB0b28gYmlnIGZvciB0aGUgc3RhY2suCiAgICAg" +
        "Ki8KICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykgewogICAgICAgIHZhciByZXN1bHQgPSBbXSwgayA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAvLyBz" +
        "aG9ydGN1dAogICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHsKICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAo" +
        "ayA8IGxlbikgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gImFycmF5IiB8fCB0eXBlID09PSAibm9kZWJ1ZmZlciIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUu" +
        "YXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3Ry" +
        "aW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgayArPSBjaHVuazsKICAgICAg" +
        "ICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICAgIH0sCiAgICAvKioKICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS4KICAgICAqIFRo" +
        "aXMgaXMgdGhlIG5haXZlIGltcGxlbWVudGF0aW9uLCB3aGljaCBnZW5lcmF0ZSBBIExPVCBvZiBpbnRlcm1lZGlhdGUgc3RyaW5nLgogICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGV2ZXJ5dGhpbmcg" +
        "ZWxzZSBmYWlsLgogICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhl" +
        "IHJlc3VsdC4KICAgICAqLwogICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7CiAgICAgICAgdmFyIHJlc3VsdFN0ciA9ICIiOwogICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5n" +
        "dGg7IGkrKykgewogICAgICAgICAgICByZXN1bHRTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRTdHI7CiAgICB9LAogICAgYXBwbHlD" +
        "YW5CZVVzZWQgOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIFVpbnQ4QXJyYXkKICAgICAgICAgKi8KICAg" +
        "ICAgICB1aW50OGFycmF5IDogKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBs" +
        "eShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9" +
        "KSgpLAogICAgICAgIC8qKgogICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLgogICAgICAgICAqLwogICAgICAg" +
        "IG5vZGVidWZmZXIgOiAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51" +
        "bGwsIG5vZGVqc1V0aWxzLmFsbG9jQnVmZmVyKDEpKS5sZW5ndGggPT09IDE7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAg" +
        "ICAgIH0pKCkKICAgIH0KfTsKCi8qKgogKiBUcmFuc2Zvcm0gYW4gYXJyYXktbGlrZSBvYmplY3QgdG8gYSBzdHJpbmcuCiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFy" +
        "cmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uCiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC4KICovCmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7CiAgICAvLyBQZXJmb3JtYW5jZXMg" +
        "bm90ZXMgOgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWUKICAgIC8vIHNlZSBodHRwOi8v" +
        "anNwZXJmLmNvbS9jb252ZXJ0aW5nLWEtdWludDhhcnJheS10by1hLXN0cmluZy8yCiAgICAvLyBidXQgdGhlIHN0YWNrIGlzIGxpbWl0ZWQgKGFuZCB3ZSBjYW4gZ2V0IGh1Z2UgYXJyYXlzICEpLgogICAgLy8K" +
        "ICAgIC8vIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTsgZ2VuZXJhdGUgdG9vIG1hbnkgc3RyaW5ncyAhCiAgICAvLwogICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6" +
        "Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yCiAgICAvLyBUT0RPIDogd2Ugbm93IGhhdmUgd29ya2VycyB0aGF0IHNwbGl0IHRoZSB3b3JrLiBEbyB3ZSBzdGls" +
        "bCBuZWVkIHRoYXQgPwogICAgdmFyIGNodW5rID0gNjU1MzYsCiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSwKICAgICAgICBjYW5Vc2VBcHBseSA9IHRydWU7CiAgICBpZiAodHlwZSA9" +
        "PT0gInVpbnQ4YXJyYXkiKSB7CiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJub2RlYnVm" +
        "ZmVyIikgewogICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyOwogICAgfQoKICAgIGlmIChjYW5Vc2VBcHBseSkgewogICAgICAgIHdoaWxl" +
        "IChjaHVuayA+IDEpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTsKICAgICAg" +
        "ICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY2h1bmsgPSBNYXRoLmZsb29yKGNodW5rIC8gMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gbm8gYXBwbHkgb3IgY2h1" +
        "bmsgZXJyb3IgOiBzbG93IGFuZCBwYWluZnVsIGFsZ29yaXRobQogICAgLy8gZGVmYXVsdCBicm93c2VyIG9uIGFuZHJvaWQgNC4qCiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNo" +
        "YXIoYXJyYXkpOwp9CgpleHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7CgoKLyoqCiAqIENvcHkgdGhlIGRhdGEgZnJvbSBhbiBhcnJheS1saWtlIHRvIGFuIG90aGVyIGFycmF5" +
        "LWxpa2UuCiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5RnJvbSB0aGUgb3JpZ2luIGFycmF5LgogKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJy" +
        "YXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuCiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBk" +
        "YXRlZCBkZXN0aW5hdGlvbiBhcnJheS4KICovCmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUZyb20ubGVuZ3Ro" +
        "OyBpKyspIHsKICAgICAgICBhcnJheVRvW2ldID0gYXJyYXlGcm9tW2ldOwogICAgfQogICAgcmV0dXJuIGFycmF5VG87Cn0KCi8vIGEgbWF0cml4IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybSBl" +
        "dmVyeXRoaW5nIGludG8gZXZlcnl0aGluZy4KdmFyIHRyYW5zZm9ybSA9IHt9OwoKLy8gc3RyaW5nIHRvID8KdHJhbnNmb3JtWyJzdHJpbmciXSA9IHsKICAgICJzdHJpbmciOiBpZGVudGl0eSwKICAgICJhcnJh" +
        "eSI6IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7CiAgICB9LAogICAgImFycmF5YnVmZmVyIjogZnVuY3Rp" +
        "b24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gdHJhbnNmb3JtWyJzdHJpbmciXVsidWludDhhcnJheSJdKGlucHV0KS5idWZmZXI7CiAgICB9LAogICAgInVpbnQ4YXJyYXkiOiBmdW5jdGlvbihpbnB1dCkgewog" +
        "ICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7CiAgICB9LAogICAgIm5vZGVidWZmZXIiOiBmdW5jdGlvbihpbnB1dCkgewogICAgICAg" +
        "IHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMuYWxsb2NCdWZmZXIoaW5wdXQubGVuZ3RoKSk7CiAgICB9Cn07CgovLyBhcnJheSB0byA/CnRyYW5zZm9ybVsiYXJyYXkiXSA9IHsK" +
        "ICAgICJzdHJpbmciOiBhcnJheUxpa2VUb1N0cmluZywKICAgICJhcnJheSI6IGlkZW50aXR5LAogICAgImFycmF5YnVmZmVyIjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFy" +
        "cmF5KGlucHV0KSkuYnVmZmVyOwogICAgfSwKICAgICJ1aW50OGFycmF5IjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpOwogICAgfSwKICAgICJub2RlYnVm" +
        "ZmVyIjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyRnJvbShpbnB1dCk7CiAgICB9Cn07CgovLyBhcnJheWJ1ZmZlciB0byA/CnRyYW5zZm9ybVsiYXJyYXli" +
        "dWZmZXIiXSA9IHsKICAgICJzdHJpbmciOiBmdW5jdGlvbihpbnB1dCkgewogICAgICAgIHJldHVybiBhcnJheUxpa2VUb1N0cmluZyhuZXcgVWludDhBcnJheShpbnB1dCkpOwogICAgfSwKICAgICJhcnJheSI6" +
        "IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKG5ldyBVaW50OEFycmF5KGlucHV0KSwgbmV3IEFycmF5KGlucHV0LmJ5dGVMZW5ndGgpKTsKICAgIH0sCiAgICAi" +
        "YXJyYXlidWZmZXIiOiBpZGVudGl0eSwKICAgICJ1aW50OGFycmF5IjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpOwogICAgfSwKICAgICJub2RlYnVmZmVy" +
        "IjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyRnJvbShuZXcgVWludDhBcnJheShpbnB1dCkpOwogICAgfQp9OwoKLy8gdWludDhhcnJheSB0byA/CnRyYW5z" +
        "Zm9ybVsidWludDhhcnJheSJdID0gewogICAgInN0cmluZyI6IGFycmF5TGlrZVRvU3RyaW5nLAogICAgImFycmF5IjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxp" +
        "a2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTsKICAgIH0sCiAgICAiYXJyYXlidWZmZXIiOiBmdW5jdGlvbihpbnB1dCkgewogICAgICAgIHJldHVybiBpbnB1dC5idWZmZXI7CiAgICB9LAogICAg" +
        "InVpbnQ4YXJyYXkiOiBpZGVudGl0eSwKICAgICJub2RlYnVmZmVyIjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyRnJvbShpbnB1dCk7CiAgICB9Cn07Cgov" +
        "LyBub2RlYnVmZmVyIHRvID8KdHJhbnNmb3JtWyJub2RlYnVmZmVyIl0gPSB7CiAgICAic3RyaW5nIjogYXJyYXlMaWtlVG9TdHJpbmcsCiAgICAiYXJyYXkiOiBmdW5jdGlvbihpbnB1dCkgewogICAgICAgIHJl" +
        "dHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpOwogICAgfSwKICAgICJhcnJheWJ1ZmZlciI6IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRy" +
        "YW5zZm9ybVsibm9kZWJ1ZmZlciJdWyJ1aW50OGFycmF5Il0oaW5wdXQpLmJ1ZmZlcjsKICAgIH0sCiAgICAidWludDhhcnJheSI6IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRv" +
        "QXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTsKICAgIH0sCiAgICAibm9kZWJ1ZmZlciI6IGlkZW50aXR5Cn07CgovKioKICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55" +
        "IHR5cGUuCiAqIFRoZSBzdXBwb3J0ZWQgb3V0cHV0IHR5cGUgYXJlIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIG5vZGVidWZmZXIuCiAqIElmIG5vIG91dHB1dCB0eXBlIGlzIHNw" +
        "ZWNpZmllZCwgdGhlIHVubW9kaWZpZWQgaW5wdXQgd2lsbCBiZSByZXR1cm5lZC4KICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLgogKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxB" +
        "cnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gaW5wdXQgdGhlIGlucHV0IHRvIGNvbnZlcnQuCiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhl" +
        "IHJlcXVlc3RlZCBvdXRwdXQgdHlwZS4KICovCmV4cG9ydHMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbihvdXRwdXRUeXBlLCBpbnB1dCkgewogICAgaWYgKCFpbnB1dCkgewogICAgICAgIC8vIHVuZGVmaW5lZCwg" +
        "bnVsbCwgZXRjCiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvbid0IGhhcm0uCiAgICAgICAgaW5wdXQgPSAiIjsKICAgIH0KICAgIGlmICghb3V0cHV0VHlwZSkgewogICAgICAgIHJldHVybiBpbnB1dDsK" +
        "ICAgIH0KICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpOwogICAgdmFyIGlucHV0VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGlucHV0KTsKICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1baW5w" +
        "dXRUeXBlXVtvdXRwdXRUeXBlXShpbnB1dCk7CiAgICByZXR1cm4gcmVzdWx0Owp9OwoKLyoqCiAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW5wdXQuCiAqIFRoZSB0eXBlIHdpbGwgYmUgaW4gYSBmb3JtYXQg" +
        "dmFsaWQgZm9yIEpTWmlwLnV0aWxzLnRyYW5zZm9ybVRvIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIuCiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRp" +
        "ZnkuCiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIChsb3dlcmNhc2UpIHR5cGUgb2YgdGhlIGlucHV0LgogKi8KZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkgewogICAgaWYgKHR5cGVvZiBpbnB1" +
        "dCA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gIltvYmplY3QgQXJyYXldIikgewog" +
        "ICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgfQogICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHsKICAgICAgICByZXR1cm4gIm5vZGVidWZmZXIiOwog" +
        "ICAgfQogICAgaWYgKHN1cHBvcnQudWludDhhcnJheSAmJiBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICByZXR1cm4gInVpbnQ4YXJyYXkiOwogICAgfQogICAgaWYgKHN1cHBvcnQuYXJy" +
        "YXlidWZmZXIgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgIHJldHVybiAiYXJyYXlidWZmZXIiOwogICAgfQp9OwoKLyoqCiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlw" +
        "ZSBpcyBub3Qgc3VwcG9ydGVkLgogKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0byBjaGVjay4KICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9y" +
        "dCB0aGUgcmVxdWVzdGVkIHR5cGUuCiAqLwpleHBvcnRzLmNoZWNrU3VwcG9ydCA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgIHZhciBzdXBwb3J0ZWQgPSBzdXBwb3J0W3R5cGUudG9Mb3dlckNhc2UoKV07CiAgICBp" +
        "ZiAoIXN1cHBvcnRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlICsgIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0iKTsKICAgIH0KfTsKCmV4cG9ydHMuTUFYX1ZBTFVFXzE2QklU" +
        "UyA9IDY1NTM1OwpleHBvcnRzLk1BWF9WQUxVRV8zMkJJVFMgPSAtMTsgLy8gd2VsbCwgIlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGIiBpcyBwYXJzZWQgYXMgLTEKCi8qKgogKiBQcmV0dGlmeSBh" +
        "IHN0cmluZyByZWFkIGFzIGJpbmFyeS4KICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHByZXR0aWZ5LgogKiBAcmV0dXJuIHtzdHJpbmd9IGEgcHJldHR5IHN0cmluZy4KICovCmV4cG9ydHMu" +
        "cHJldHR5ID0gZnVuY3Rpb24oc3RyKSB7CiAgICB2YXIgcmVzID0gJycsCiAgICAgICAgY29kZSwgaTsKICAgIGZvciAoaSA9IDA7IGkgPCAoc3RyIHx8ICIiKS5sZW5ndGg7IGkrKykgewogICAgICAgIGNvZGUg" +
        "PSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICByZXMgKz0gJ1xceCcgKyAoY29kZSA8IDE2ID8gIjAiIDogIiIpICsgY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgIH0KICAgIHJldHVybiBy" +
        "ZXM7Cn07CgovKioKICogRGVmZXIgdGhlIGNhbGwgb2YgYSBmdW5jdGlvbi4KICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuCiAqIEBwYXJh" +
        "bSB7QXJyYXl9IGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBjYWxsYmFjay4KICovCmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikgewogICAgc2V0SW1tZWRp" +
        "YXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pOwogICAgfSk7Cn07CgovKioKICogRXh0ZW5kcyBhIHByb3RvdHlwZSB3aXRoIGFuIG90aGVy" +
        "LCB3aXRob3V0IGNhbGxpbmcgYSBjb25zdHJ1Y3RvciB3aXRoCiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0b3IgdGhl" +
        "IGNvbnN0cnVjdG9yIHRvIGF1Z21lbnQKICogQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJDdG9yIHRoZSBwYXJlbnQgY29uc3RydWN0b3IgdG8gdXNlCiAqLwpleHBvcnRzLmluaGVyaXRzID0gZnVuY3Rpb24gKGN0" +
        "b3IsIHN1cGVyQ3RvcikgewogICAgdmFyIE9iaiA9IGZ1bmN0aW9uKCkge307CiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgIGN0b3IucHJvdG90eXBlID0gbmV3IE9iaigpOwp9" +
        "OwoKLyoqCiAqIE1lcmdlIHRoZSBvYmplY3RzIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIGludG8gYSBuZXcgb25lLgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gey4uLk9iamVjdH0gdmFyX2FyZ3MgQWxsIG9iamVjdHMg" +
        "dG8gbWVyZ2UuCiAqIEByZXR1cm4ge09iamVjdH0gYSBuZXcgb2JqZWN0IHdpdGggdGhlIGRhdGEgb2YgdGhlIG90aGVycy4KICovCmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVzdWx0" +
        "ID0ge30sIGksIGF0dHI7CiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzCiAgICAgICAgZm9y" +
        "IChhdHRyIGluIGFyZ3VtZW50c1tpXSkgewogICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldLmhhc093blByb3BlcnR5KGF0dHIpICYmIHR5cGVvZiByZXN1bHRbYXR0cl0gPT09ICJ1bmRlZmluZWQiKSB7CiAg" +
        "ICAgICAgICAgICAgICByZXN1bHRbYXR0cl0gPSBhcmd1bWVudHNbaV1bYXR0cl07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9OwoKLyoqCiAqIFRyYW5zZm9ybSBh" +
        "cmJpdHJhcnkgY29udGVudCBpbnRvIGEgUHJvbWlzZS4KICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYSBuYW1lIGZvciB0aGUgY29udGVudCBiZWluZyBwcm9jZXNzZWQuCiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1" +
        "dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy4KICogQHBhcmFtIHtCb29sZWFufSBpc0JpbmFyeSB0cnVlIGlmIHRoZSBjb250ZW50IGlzIG5vdCBhbiB1bmljb2RlIHN0cmluZwogKiBAcGFyYW0ge0Jvb2xl" +
        "YW59IGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nIHRydWUgaWYgdGhlIHN0cmluZyBjb250ZW50IG9ubHkgaGFzIG9uZSBieXRlIHBlciBjaGFyYWN0ZXIuCiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1" +
        "ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC4KICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIGluIGEgZm9ybWF0IHVzYWJsZSBieSBKU1ppcC4KICovCmV4cG9ydHMu" +
        "cHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHsKCiAgICAvLyBpZiBpbnB1dERhdGEgaXMgYWxyZWFk" +
        "eSBhIHByb21pc2UsIHRoaXMgZmxhdHRlbiBpdC4KICAgIHZhciBwcm9taXNlID0gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKGlucHV0RGF0YSkudGhlbihmdW5jdGlvbihkYXRhKSB7CgoKICAgICAgICB2YXIg" +
        "aXNCbG9iID0gc3VwcG9ydC5ibG9iICYmIChkYXRhIGluc3RhbmNlb2YgQmxvYiB8fCBbJ1tvYmplY3QgRmlsZV0nLCAnW29iamVjdCBCbG9iXSddLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5j" +
        "YWxsKGRhdGEpKSAhPT0gLTEpOwoKICAgICAgICBpZiAoaXNCbG9iICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2Uo" +
        "ZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CgogICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUp" +
        "IHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAg" +
        "ICAgICAgICAgICAgICAgcmVqZWN0KGUudGFyZ2V0LmVycm9yKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZGF0YSk7CiAgICAgICAgICAgIH0p" +
        "OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHZhciBkYXRh" +
        "VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGRhdGEpOwoKICAgICAgICBpZiAoIWRhdGFUeXBlKSB7CiAgICAgICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdCgKICAgICAgICAgICAgICAgIG5l" +
        "dyBFcnJvcigiQ2FuJ3QgcmVhZCB0aGUgZGF0YSBvZiAnIiArIG5hbWUgKyAiJy4gSXMgaXQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGEgc3VwcG9ydGVkIEphdmFTY3JpcHQgdHlwZSAoU3Ry" +
        "aW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgZXRjKSA/IikKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFy" +
        "cmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlcgogICAgICAgIGlmIChkYXRhVHlwZSA9PT0gImFycmF5YnVmZmVyIikgewogICAgICAgICAgICBkYXRhID0gZXhwb3J0cy50cmFuc2Zvcm1UbygidWludDhhcnJheSIs" +
        "IGRhdGEpOwogICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkgewogICAgICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5kZWNvZGUoZGF0" +
        "YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkpIHsKICAgICAgICAgICAgICAgIC8vIG9wdGltaXplZEJpbmFyeVN0cmluZyA9PT0gdHJ1ZSBtZWFucyB0aGF0IHRoZSBmaWxl" +
        "IGhhcyBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgd2l0aCBhIDB4RkYgbWFzawogICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAg" +
        "Ly8gdGhpcyBpcyBhIHN0cmluZywgbm90IGluIGEgYmFzZTY0IGZvcm1hdC4KICAgICAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhpcyBpcyBhIGNvcnJlY3QgImJpbmFyeSBzdHJpbmciCiAgICAg" +
        "ICAgICAgICAgICAgICAgZGF0YSA9IHN0cmluZzJiaW5hcnkoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9KTsKfTsKCn0s" +
        "eyIuL2Jhc2U2NCI6MSwiLi9leHRlcm5hbCI6NiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3VwcG9ydCI6MzAsInNldC1pbW1lZGlhdGUtc2hpbSI6NTR9XSwzMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhw" +
        "b3J0cyl7Cid1c2Ugc3RyaWN0JzsKdmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7CnZhciBzaWcgPSByZXF1aXJlKCcu" +
        "L3NpZ25hdHVyZScpOwp2YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7CnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7CnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7Ci8v" +
        "ICBjbGFzcyBaaXBFbnRyaWVzIHt7ewovKioKICogQWxsIHRoZSBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS4KICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZv" +
        "ciBsb2FkaW5nIHRoZSBzdHJlYW0uCiAqLwpmdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7CiAgICB0aGlzLmZpbGVzID0gW107CiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7Cn0K" +
        "WmlwRW50cmllcy5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBl" +
        "Y3RlZFNpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLgogICAgICogQHRocm93cyB7RXJyb3J9IGlmIGl0IGlzIGFuIG90aGVyIHNpZ25hdHVyZS4KICAgICAqLwogICAgY2hlY2tTaWduYXR1cmU6IGZ1" +
        "bmN0aW9uKGV4cGVjdGVkU2lnbmF0dXJlKSB7CiAgICAgICAgaWYgKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoZXhwZWN0ZWRTaWduYXR1cmUpKSB7CiAgICAgICAgICAgIHRoaXMucmVhZGVy" +
        "LmluZGV4IC09IDQ7CiAgICAgICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpOwogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiB1" +
        "bmV4cGVjdGVkIHNpZ25hdHVyZSAiICsgIigiICsgdXRpbHMucHJldHR5KHNpZ25hdHVyZSkgKyAiLCBleHBlY3RlZCAiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArICIpIik7CiAgICAgICAg" +
        "fQogICAgfSwKICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXNrZWRJbmRleCB0aGUgaW5kZXgg" +
        "dG8gY2hlY2suCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSB0byBleHBlY3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1" +
        "cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICovCiAgICBpc1NpZ25hdHVyZTogZnVuY3Rpb24oYXNrZWRJbmRleCwgZXhwZWN0ZWRTaWduYXR1cmUpIHsKICAgICAgICB2YXIgY3VycmVudEluZGV4" +
        "ID0gdGhpcy5yZWFkZXIuaW5kZXg7CiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoYXNrZWRJbmRleCk7CiAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7CiAgICAg" +
        "ICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7CiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoY3VycmVudEluZGV4KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAg" +
        "fSwKICAgIC8qKgogICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4KICAgICAqLwogICAgcmVhZEJsb2NrRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmRp" +
        "c2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpOwogICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpOwogICAgICAgIHRoaXMuY2VudHJhbERp" +
        "clJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTsKICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTsKICAgICAgICB0aGlzLmNlbnRy" +
        "YWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTsKICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpOwoKICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5n" +
        "dGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpOwogICAgICAgIC8vIHdhcm5pbmcgOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZQogICAgICAgIC8vIE9uIGEgbGludXggbWFjaGlu" +
        "ZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuCiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2Nh" +
        "bGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuCiAgICAgICAgdmFyIHppcENvbW1lbnQgPSB0aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpOwogICAgICAgIHZhciBkZWNvZGVQYXJhbVR5" +
        "cGUgPSBzdXBwb3J0LnVpbnQ4YXJyYXkgPyAidWludDhhcnJheSIgOiAiYXJyYXkiOwogICAgICAgIC8vIFRvIGdldCBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggdGhlIGdlbmVyYXRpb24gcGFydCwgd2Ugd2ls" +
        "bCBhc3N1bWUgdGhhdAogICAgICAgIC8vIHRoaXMgaXMgdXRmOCBlbmNvZGVkIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLgogICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8o" +
        "ZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTsKICAgICAgICB0aGlzLnppcENvbW1lbnQgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGRlY29kZUNvbnRlbnQpOwogICAgfSwKICAgIC8qKgog" +
        "ICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkuCiAgICAgKiBOb3QgbWVyZ2VkIHdpdGggdGhlIG1ldGhvZCByZWFkRW5kT2ZDZW50cmFsIDoKICAgICAqIFRoZSBlbmQg" +
        "b2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLAogICAgICogSSBkb24ndCB3YW50IHRvIHJlYWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcyAhCiAgICAgKi8KICAgIHJlYWRC" +
        "bG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7CiAgICAgICAgdGhpcy5yZWFkZXIuc2tp" +
        "cCg0KTsKICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpOwogICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7" +
        "CiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTsKICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTsKICAgICAg" +
        "ICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7CiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7CiAg" +
        "ICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7CiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTsKCiAgICAgICAgdGhp" +
        "cy56aXA2NEV4dGVuc2libGVEYXRhID0ge307CiAgICAgICAgdmFyIGV4dHJhRGF0YVNpemUgPSB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSAtIDQ0LAogICAgICAgICAgICBpbmRleCA9IDAsCiAgICAgICAg" +
        "ICAgIGV4dHJhRmllbGRJZCwKICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCwKICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlOwogICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHsKICAg" +
        "ICAgICAgICAgZXh0cmFGaWVsZElkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTsKICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7CiAgICAgICAgICAgIGV4dHJh" +
        "RmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpOwogICAgICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbZXh0cmFGaWVsZElkXSA9IHsKICAgICAgICAgICAg" +
        "ICAgIGlkOiBleHRyYUZpZWxkSWQsCiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsCiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlCiAgICAgICAgICAgIH07CiAg" +
        "ICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci4KICAgICAqLwogICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRy" +
        "YWxMb2NhdG9yOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpOwogICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRF" +
        "bmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7CiAgICAgICAgdGhpcy5kaXNrc0NvdW50ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTsKICAgICAgICBpZiAodGhpcy5kaXNrc0Nv" +
        "dW50ID4gMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogUmVhZCB0aGUg" +
        "bG9jYWwgZmlsZXMsIGJhc2VkIG9uIHRoZSBvZmZzZXQgcmVhZCBpbiB0aGUgY2VudHJhbCBwYXJ0LgogICAgICovCiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGksIGZpbGU7" +
        "CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07CiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGZp" +
        "bGUubG9jYWxIZWFkZXJPZmZzZXQpOwogICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5MT0NBTF9GSUxFX0hFQURFUik7CiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRl" +
        "cik7CiAgICAgICAgICAgIGZpbGUuaGFuZGxlVVRGOCgpOwogICAgICAgICAgICBmaWxlLnByb2Nlc3NBdHRyaWJ1dGVzKCk7CiAgICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogUmVhZCB0aGUgY2VudHJh" +
        "bCBkaXJlY3RvcnkuCiAgICAgKi8KICAgIHJlYWRDZW50cmFsRGlyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZmlsZTsKCiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zm" +
        "c2V0KTsKICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkgewogICAgICAgICAgICBmaWxlID0gbmV3IFppcEVudHJ5KHsKICAg" +
        "ICAgICAgICAgICAgIHppcDY0OiB0aGlzLnppcDY0CiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpOwogICAgICAgICAgICBmaWxlLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlcik7CiAgICAgICAg" +
        "ICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSB0aGlzLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy5j" +
        "ZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS4K" +
        "ICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlw" +
        "IG9yIGJ1ZzogZXhwZWN0ZWQgIiArIHRoaXMuY2VudHJhbERpclJlY29yZHMgKyAiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAiICsgdGhpcy5maWxlcy5sZW5ndGgpOwogICAgICAgICAgICB9IGVsc2Ug" +
        "ewogICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLgogICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIGJ1dCB3ZSBnb3Qgc29tZXRoaW5nIGZvciB0" +
        "aGUgdXNlcjogbm8gZXJyb3IgaGVyZS4KICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybigiZXhwZWN0ZWQiLCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzLCAicmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290" +
        "IiwgdGhpcy5maWxlcy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogUmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5LgogICAgICovCiAgICByZWFk" +
        "RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7CiAgICAgICAgaWYg" +
        "KG9mZnNldCA8IDApIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgaXMgYSB0cnVuY2F0ZWQgemlwIG9yIGNvbXBsZXRlIGdhcmJhZ2UuCiAgICAgICAgICAgIC8vIEEgIkxPQ0FMX0ZJTEVf" +
        "SEVBREVSIiBpcyBub3QgcmVxdWlyZWQgYXQgdGhlIGJlZ2lubmluZyAoYXV0bwogICAgICAgICAgICAvLyBleHRyYWN0aWJsZSB6aXAgZm9yIGV4YW1wbGUpIGJ1dCBpdCBjYW4gZ2l2ZSBhIGdvb2QgaGludC4K" +
        "ICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc28KICAgICAgICAgICAgLy8gZ2V0IHVucmVhZGFibGUgZGF0YS4KICAgICAg" +
        "ICAgICAgdmFyIGlzR2FyYmFnZSA9ICF0aGlzLmlzU2lnbmF0dXJlKDAsIHNpZy5MT0NBTF9GSUxFX0hFQURFUik7CgogICAgICAgICAgICBpZiAoaXNHYXJiYWdlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBu" +
        "ZXcgRXJyb3IoIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklmIGl0IGlzLCBzZWUg" +
        "aHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWwiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi" +
        "Q29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTsKICAg" +
        "ICAgICB2YXIgZW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7CiAgICAgICAgdGhpcy5yZWFkQmxvY2tF" +
        "bmRPZkNlbnRyYWwoKTsKCgogICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOgogICAgICAgICAgICA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVj" +
        "dG9yeQogICAgICAgICAgICAgICAgcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9y" +
        "IDB4RkZGRkZGRkYpIGFuZCB0aGUKICAgICAgICAgICAgICAgIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuCiAgICAgICAgICAgIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5" +
        "IHJlY29yZCBhbmQgdGhlCiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdAogICAgICAgICAgICAgICAgcmVzaWRlIG9uIHRoZSBzYW1lIGRp" +
        "c2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmcKICAgICAgICAgICAgICAgIGFuIGFyY2hpdmUuCiAgICAgICAgICovCiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlciA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2" +
        "QklUUyB8fCB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID09PSB1dGlscy5NQVhfVkFMVUVf" +
        "MTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHMgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUyB8fCB0aGlzLmNl" +
        "bnRyYWxEaXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHsKICAgICAgICAgICAgdGhpcy56aXA2NCA9IHRydWU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBXYXJuaW5nIDogdGhlIHpp" +
        "cDY0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQsIGJ1dCBPTkxZIGlmIHRoZSA2NGJpdHMgaW50ZWdlciByZWFkIGZyb20KICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRl" +
        "Z2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhU2NyaXB0IHJlcHJlc2VudHMKICAgICAgICAgICAgYWxsIG51bWJlcnMgYXMgNjQtYml0IGRvdWJsZSBwcmVjaXNpb24gSUVFRSA3NTQgZmxvYXRpbmcg" +
        "cG9pbnQgbnVtYmVycy4KICAgICAgICAgICAgU28sIHdlIGhhdmUgNTNiaXRzIGZvciBpbnRlZ2VycyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgMzJiaXRzLgogICAgICAgICAg" +
        "ICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnMKICAgICAgICAgICAgYW5kIGh0dHA6Ly93" +
        "d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTI2Mi5wZGYgc2VjdGlvbiA4LjUKICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIHNob3VsZCBsb29r" +
        "IGZvciBhIHppcDY0IEVPQ0QgbG9jYXRvcgogICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7CiAg" +
        "ICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9y" +
        "eSBsb2NhdG9yIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTsKICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9E" +
        "SVJFQ1RPUllfTE9DQVRPUik7CiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yKCk7CgogICAgICAgICAgICAvLyBub3cgdGhlIHppcDY0IEVPQ0QgcmVjb3JkCiAgICAg" +
        "ICAgICAgIGlmICghdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsIHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7CiAgICAgICAgICAgICAg" +
        "ICAvLyBjb25zb2xlLndhcm4oIlpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBub3Qgd2hlcmUgZXhwZWN0ZWQuIik7CiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENl" +
        "bnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5k" +
        "T2ZaaXA2NENlbnRyYWxEaXIgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rv" +
        "cnkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpOwogICAgICAg" +
        "ICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpOwogICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsKCk7CiAgICAgICAgfQoKICAg" +
        "ICAgICB2YXIgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgKyB0aGlzLmNlbnRyYWxEaXJTaXplOwogICAgICAgIGlmICh0aGlzLnppcDY0KSB7CiAgICAgICAg" +
        "ICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvcgogICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAx" +
        "MiAvKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgMTIgYnl0ZXMgKi8gKyB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZTsKICAgICAgICB9CgogICAgICAgIHZhciBleHRyYUJ5dGVzID0gZW5kT2ZD" +
        "ZW50cmFsRGlyT2Zmc2V0IC0gZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQ7CgogICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkgewogICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oZXh0cmFCeXRlcywg" +
        "ImV4dHJhIGJ5dGVzIGF0IGJlZ2lubmluZyBvciB3aXRoaW4gemlwZmlsZSIpOwogICAgICAgICAgICBpZiAodGhpcy5pc1NpZ25hdHVyZShlbmRPZkNlbnRyYWxEaXJPZmZzZXQsIHNpZy5DRU5UUkFMX0ZJTEVf" +
        "SEVBREVSKSkgewogICAgICAgICAgICAgICAgLy8gVGhlIG9mZnNldHMgc2VlbSB3cm9uZywgYnV0IHdlIGhhdmUgc29tZXRoaW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAgICAgICAgICAgLy8g" +
        "U28mIHdlIGtlZXAgaXQuCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IGlzIHdyb25nLCB1cGRhdGUgdGhlICJ6ZXJvIiBvZiB0aGUgcmVhZGVyCiAgICAgICAgICAg" +
        "ICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgZGF0YSBoYXMgYmVlbiBwcmVwZW5kZWQgKGNyeCBmaWxlcyBmb3IgZXhhbXBsZSkKICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyLnplcm8gPSBleHRyYUJ5dGVzOwog" +
        "ICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzIDwgMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgIiArIE1hdGguYWJzKGV4dHJh" +
        "Qnl0ZXMpICsgIiBieXRlcy4iKTsKICAgICAgICB9CiAgICB9LAogICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyRm9yKGRhdGEpOwogICAgfSwK" +
        "ICAgIC8qKgogICAgICogUmVhZCBhIHppcCBmaWxlIGFuZCBjcmVhdGUgWmlwRW50cmllcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBiaW5h" +
        "cnkgc3RyaW5nIHJlcHJlc2VudGluZyBhIHppcCBmaWxlLgogICAgICovCiAgICBsb2FkOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgdGhpcy5wcmVwYXJlUmVhZGVyKGRhdGEpOwogICAgICAgIHRoaXMucmVh" +
        "ZEVuZE9mQ2VudHJhbCgpOwogICAgICAgIHRoaXMucmVhZENlbnRyYWxEaXIoKTsKICAgICAgICB0aGlzLnJlYWRMb2NhbEZpbGVzKCk7CiAgICB9Cn07Ci8vIH19fSBlbmQgb2YgWmlwRW50cmllcwptb2R1bGUu" +
        "ZXhwb3J0cyA9IFppcEVudHJpZXM7Cgp9LHsiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zaWduYXR1cmUiOjIzLCIuL3N1cHBvcnQiOjMwLCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyeSI6" +
        "MzR9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKdmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpOwp2YXIgdXRpbHMgPSByZXF1" +
        "aXJlKCcuL3V0aWxzJyk7CnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7CnZhciBjcmMzMmZuID0gcmVxdWlyZSgnLi9jcmMzMicpOwp2YXIgdXRmOCA9IHJlcXVp" +
        "cmUoJy4vdXRmOCcpOwp2YXIgY29tcHJlc3Npb25zID0gcmVxdWlyZSgnLi9jb21wcmVzc2lvbnMnKTsKdmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTsKCnZhciBNQURFX0JZX0RPUyA9IDB4MDA7" +
        "CnZhciBNQURFX0JZX1VOSVggPSAweDAzOwoKLyoqCiAqIEZpbmQgYSBjb21wcmVzc2lvbiByZWdpc3RlcmVkIGluIEpTWmlwLgogKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhv" +
        "ZCBtYWdpYyB0byBmaW5kLgogKiBAcmV0dXJuIHtPYmplY3R8bnVsbH0gdGhlIEpTWmlwIGNvbXByZXNzaW9uIG9iamVjdCwgbnVsbCBpZiBub25lIGZvdW5kLgogKi8KdmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1" +
        "bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7CiAgICBmb3IgKHZhciBtZXRob2QgaW4gY29tcHJlc3Npb25zKSB7CiAgICAgICAgaWYgKCFjb21wcmVzc2lvbnMuaGFzT3duUHJvcGVydHkobWV0aG9kKSkgewog" +
        "ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbXByZXNzaW9uc1ttZXRob2RdLm1hZ2ljID09PSBjb21wcmVzc2lvbk1ldGhvZCkgewogICAgICAgICAgICByZXR1cm4gY29tcHJl" +
        "c3Npb25zW21ldGhvZF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn07CgovLyBjbGFzcyBaaXBFbnRyeSB7e3sKLyoqCiAqIEFuIGVudHJ5IGluIHRoZSB6aXAgZmlsZS4KICogQGNvbnN0cnVj" +
        "dG9yCiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIGN1cnJlbnQgZmlsZS4KICogQHBhcmFtIHtPYmplY3R9IGxvYWRPcHRpb25zIE9wdGlvbnMgZm9yIGxvYWRpbmcgdGhlIHN0cmVh" +
        "bS4KICovCmZ1bmN0aW9uIFppcEVudHJ5KG9wdGlvbnMsIGxvYWRPcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zOwp9ClppcEVu" +
        "dHJ5LnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogc2F5IGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLCBm" +
        "YWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGlzRW5jcnlwdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBiaXQgMSBpcyBzZXQKICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09" +
        "IDB4MDAwMTsKICAgIH0sCiAgICAvKioKICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGVuYW1l" +
        "L2NvbW1lbnQgaXMgaW4gdXRmLTgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgdXNlVVRGODogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gYml0IDExIGlzIHNldAogICAgICAgIHJldHVybiAodGhpcy5i" +
        "aXRGbGFnICYgMHgwODAwKSA9PT0gMHgwODAwOwogICAgfSwKICAgIC8qKgogICAgICogUmVhZCB0aGUgbG9jYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuCiAg" +
        "ICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS4KICAgICAqLwogICAgcmVhZExvY2FsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7CiAgICAgICAgdmFyIGNvbXByZXNzaW9u" +
        "LCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoOwoKICAgICAgICAvLyB3ZSBhbHJlYWR5IGtub3cgZXZlcnl0aGluZyBmcm9tIHRoZSBjZW50cmFsIGRpciAhCiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRh" +
        "dGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLgogICAgICAgIC8vIE9uIHRoZSBicmlnaHQgc2lkZSwgdGhlIGxvY2FsIHBhcnQgaXMgc2NhcnkgIDogemlwNjQsIGRhdGEgZGVzY3JpcHRvcnMsIGJvdGgsIGV0" +
        "Yy4KICAgICAgICAvLyBUaGUgbGVzcyBkYXRhIHdlIGdldCBoZXJlLCB0aGUgbW9yZSByZWxpYWJsZSB0aGlzIHNob3VsZCBiZS4KICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRh" +
        "c2ggdG8gdGhlIGRhdGEgIQogICAgICAgIHJlYWRlci5za2lwKDIyKTsKICAgICAgICAvLyBpbiBzb21lIHppcCBjcmVhdGVkIG9uIHdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwg" +
        "ZGlyIGNvbnRhaW5zIFwgaW5zdGVhZCBvZiAvLgogICAgICAgIC8vIFN0cmFuZ2VseSwgdGhlIGZpbGVuYW1lIGhlcmUgaXMgT0suCiAgICAgICAgLy8gSSB3b3VsZCBsb3ZlIHRvIHRyZWF0IHRoZXNlIHppcCBm" +
        "aWxlcyBhcyBjb3JydXB0ZWQgKHNlZSBodHRwOi8vd3d3LmluZm8temlwLm9yZy9GQVEuaHRtbCNiYWNrc2xhc2hlcwogICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsICJBbGwgc2xhc2hlcyBNVVNUIGJl" +
        "IGZvcndhcmQgc2xhc2hlcyAnLyciKSBidXQgdGhlcmUgYXJlIGEgbG90IG9mIGJhZCB6aXAgZ2VuZXJhdG9ycy4uLgogICAgICAgIC8vIFNlYXJjaCAidW56aXAgbWlzbWF0Y2hpbmcgImxvY2FsIiBmaWxlbmFt" +
        "ZSBjb250aW51aW5nIHdpdGggImNlbnRyYWwiIGZpbGVuYW1lIHZlcnNpb24iIG9uCiAgICAgICAgLy8gdGhlIGludGVybmV0LgogICAgICAgIC8vCiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMg" +
        "aGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXkKICAgICAgICAvLyBjb250ZW50IGFuZCB0aGUgbG9jYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZmlsZXMu" +
        "IE1peGluZyAvIGFuZCBcCiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcIHRvIHdpbmRvd3MgdXNlcnMgYW5kIHVzZSAvIHdoZW4gZXh0cmFjdGluZyB0aGUgZmlsZXMuCiAgICAgICAgLy8gVW5m" +
        "b3J0dW5hdGVseSwgdGhpcyBsZWFkIGFsc28gdG8gc29tZSBpc3N1ZXMgOiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NAogICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGgg" +
        "PSByZWFkZXIucmVhZEludCgyKTsKICAgICAgICBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7IC8vIGNhbid0IGJlIHN1cmUgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBj" +
        "ZW50cmFsIGRpcgogICAgICAgIC8vIHRoZSBmaWxlTmFtZSBpcyBzdG9yZWQgYXMgYmluYXJ5IGRhdGEsIHRoZSBoYW5kbGVVVEY4IG1ldGhvZCB3aWxsIHRha2UgY2FyZSBvZiB0aGUgZW5jb2RpbmcuCiAgICAg" +
        "ICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTsKICAgICAgICByZWFkZXIuc2tpcChsb2NhbEV4dHJhRmllbGRzTGVuZ3RoKTsKCiAgICAgICAgaWYgKHRoaXMu" +
        "Y29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCdWcgb3IgY29ycnVwdGVkIHppcCA6IGRpZG4ndCBnZXQg" +
        "ZW5vdWdoIGluZm9ybWF0aW9uIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICIgKyAiKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTsKICAgICAgICB9CgogICAg" +
        "ICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpOwogICAgICAgIGlmIChjb21wcmVzc2lvbiA9PT0gbnVsbCkgeyAvLyBubyBjb21wcmVzc2lvbiBmb3VuZAog" +
        "ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiAiICsgdXRpbHMucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpICsgIiB1bmtub3duIChpbm5lciBmaWxl" +
        "IDogIiArIHV0aWxzLnRyYW5zZm9ybVRvKCJzdHJpbmciLCB0aGlzLmZpbGVOYW1lKSArICIpIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhp" +
        "cy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTsKICAgIH0sCgogICAgLyoq" +
        "CiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LgogICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRl" +
        "ciB0byB1c2UuCiAgICAgKi8KICAgIHJlYWRDZW50cmFsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uTWFkZUJ5ID0gcmVhZGVyLnJlYWRJbnQoMik7CiAgICAgICAgcmVhZGVy" +
        "LnNraXAoMik7CiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gcmVhZGVyLnJlYWRJbnQoMik7CiAgICAgICAgdGhpcy5iaXRGbGFnID0gcmVhZGVyLnJlYWRJbnQoMik7CiAgICAgICAgdGhpcy5jb21w" +
        "cmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpOwogICAgICAgIHRoaXMuZGF0ZSA9IHJlYWRlci5yZWFkRGF0ZSgpOwogICAgICAgIHRoaXMuY3JjMzIgPSByZWFkZXIucmVhZEludCg0KTsKICAg" +
        "ICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7CiAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7CiAgICAgICAgdmFyIGZpbGVOYW1lTGVu" +
        "Z3RoID0gcmVhZGVyLnJlYWRJbnQoMik7CiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOwogICAgICAgIHRoaXMuZmlsZUNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVh" +
        "ZEludCgyKTsKICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkSW50KDIpOwogICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpOwogICAg" +
        "ICAgIHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDQpOwogICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSByZWFkZXIucmVhZEludCg0KTsKCiAgICAgICAgaWYgKHRo" +
        "aXMuaXNFbmNyeXB0ZWQoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICB9CgogICAgICAgIC8vIHdpbGwgYmUgcmVhZCBp" +
        "biB0aGUgbG9jYWwgcGFydCwgc2VlIHRoZSBjb21tZW50cyB0aGVyZQogICAgICAgIHJlYWRlci5za2lwKGZpbGVOYW1lTGVuZ3RoKTsKICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpOwogICAg" +
        "ICAgIHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQocmVhZGVyKTsKICAgICAgICB0aGlzLmZpbGVDb21tZW50ID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpOwogICAgfSwKCiAgICAv" +
        "KioKICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuCiAgICAgKi8KICAgIHByb2Nlc3NBdHRyaWJ1dGVzOiBmdW5jdGlvbiAo" +
        "KSB7CiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsOwogICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBudWxsOwogICAgICAgIHZhciBtYWRlQnkgPSB0aGlzLnZlcnNpb25NYWRlQnkgPj4g" +
        "ODsKCiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgRE9TIGRpcmVjdG9yeSBmbGFnIHNldC4KICAgICAgICAvLyBXZSBsb29rIGZvciBpdCBpbiB0aGUgRE9TIGFuZCBVTklYIHBlcm1pc3Npb25zCiAg" +
        "ICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuCiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMg" +
        "JiAweDAwMTAgPyB0cnVlIDogZmFsc2U7CgogICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHsKICAgICAgICAgICAgLy8gZmlyc3QgNiBiaXRzICgwIHRvIDUpCiAgICAgICAgICAgIHRoaXMuZG9z" +
        "UGVybWlzc2lvbnMgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDNGOwogICAgICAgIH0KCiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX1VOSVgpIHsKICAgICAgICAgICAgdGhpcy51bml4" +
        "UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjsKICAgICAgICAgICAgLy8gdGhlIG9jdGFsIHBlcm1pc3Npb25zIGFyZSBpbiAodGhpcy51bml4UGVybWlz" +
        "c2lvbnMgJiAweDAxRkYpLnRvU3RyaW5nKDgpOwogICAgICAgIH0KCiAgICAgICAgLy8gZmFpbCBzYWZlIDogaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgLyBpdCBwcm9iYWJseSBtZWFucyBhIGZvbGRlcgogICAg" +
        "ICAgIGlmICghdGhpcy5kaXIgJiYgdGhpcy5maWxlTmFtZVN0ci5zbGljZSgtMSkgPT09ICcvJykgewogICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAq" +
        "IFBhcnNlIHRoZSBaSVA2NCBleHRyYSBmaWVsZCBhbmQgbWVyZ2UgdGhlIGluZm8gaW4gdGhlIGN1cnJlbnQgWmlwRW50cnkuCiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRv" +
        "IHVzZS4KICAgICAqLwogICAgcGFyc2VaSVA2NEV4dHJhRmllbGQ6IGZ1bmN0aW9uKHJlYWRlcikgewoKICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXSkgewogICAgICAgICAgICByZXR1cm47" +
        "CiAgICAgICAgfQoKICAgICAgICAvLyBzaG91bGQgYmUgc29tZXRoaW5nLCBwcmVwYXJpbmcgdGhlIGV4dHJhIHJlYWRlcgogICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmll" +
        "bGRzWzB4MDAwMV0udmFsdWUpOwoKICAgICAgICAvLyBJIHJlYWxseSBob3BlIHRoYXQgdGhlc2UgNjRiaXRzIGludGVnZXIgY2FuIGZpdCBpbiAzMiBiaXRzIGludGVnZXIsIGJlY2F1c2UganMKICAgICAgICAv" +
        "LyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLgogICAgICAgIGlmICh0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHsKICAgICAgICAgICAgdGhpcy51bmNvbXByZXNzZWRT" +
        "aXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHsKICAgICAgICAgICAgdGhpcy5j" +
        "b21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7CiAgICAg" +
        "ICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8z" +
        "MkJJVFMpIHsKICAgICAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSBleHRyYVJlYWRlci5yZWFkSW50KDQpOwogICAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFy" +
        "dCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS4KICAgICAqLwogICAgcmVhZEV4" +
        "dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHsKICAgICAgICB2YXIgZW5kID0gcmVhZGVyLmluZGV4ICsgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCwKICAgICAgICAgICAgZXh0cmFGaWVsZElkLAogICAgICAg" +
        "ICAgICBleHRyYUZpZWxkTGVuZ3RoLAogICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7CgogICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykgewogICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzID0ge307" +
        "CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAocmVhZGVyLmluZGV4ICsgNCA8IGVuZCkgewogICAgICAgICAgICBleHRyYUZpZWxkSWQgPSByZWFkZXIucmVhZEludCgyKTsKICAgICAgICAgICAgZXh0cmFGaWVs" +
        "ZExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOwogICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7CgogICAgICAgICAgICB0aGlzLmV4dHJhRmll" +
        "bGRzW2V4dHJhRmllbGRJZF0gPSB7CiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLAogICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLAogICAgICAgICAgICAgICAgdmFsdWU6" +
        "IGV4dHJhRmllbGRWYWx1ZQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmVhZGVyLnNldEluZGV4KGVuZCk7CiAgICB9LAogICAgLyoqCiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0" +
        "aW9uIGlmIG5lZWRlZC4KICAgICAqLwogICAgaGFuZGxlVVRGODogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/ICJ1aW50OGFycmF5IiA6ICJh" +
        "cnJheSI7CiAgICAgICAgaWYgKHRoaXMudXNlVVRGOCgpKSB7CiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7CiAgICAgICAgICAgIHRoaXMuZmls" +
        "ZUNvbW1lbnRTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRo" +
        "KCk7CiAgICAgICAgICAgIGlmICh1cGF0aCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHVwYXRoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8g" +
        "QVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2UKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZUJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmls" +
        "ZU5hbWUpOwogICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAg" +
        "ICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTsKICAgICAgICAgICAgaWYgKHVjb21tZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21t" +
        "ZW50U3RyID0gdWNvbW1lbnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZQogICAgICAgICAgICAgICAgdmFyIGNvbW1l" +
        "bnRCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVDb21tZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRp" +
        "b25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0" +
        "aGUgZXh0cmEgZmllbGQsIGlmIGFueS4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgcGF0aCwgbnVsbCBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6" +
        "IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB1cGF0aEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDcwNzVdOwogICAgICAgIGlmICh1cGF0aEZpZWxkKSB7CiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9" +
        "IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTsKCiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb24KICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHsKICAgICAgICAgICAg" +
        "ICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLgogICAgICAgICAgICBp" +
        "ZiAoY3JjMzJmbih0aGlzLmZpbGVOYW1lKSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1" +
        "dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIEZpbmQg" +
        "dGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgY29tbWVudCwgbnVsbCBvdGhlcndpc2UuCiAg" +
        "ICAgKi8KICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB1Y29tbWVudEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDYzNzVdOwogICAgICAgIGlmICh1" +
        "Y29tbWVudEZpZWxkKSB7CiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTsKCiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb24KICAgICAgICAgICAg" +
        "aWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBjb21tZW50IGNo" +
        "YW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuCiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZUNvbW1lbnQpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7CiAgICAgICAgICAgICAg" +
        "ICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTsKICAgICAg" +
        "ICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn07Cm1vZHVsZS5leHBvcnRzID0gWmlwRW50cnk7Cgp9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2NvbXByZXNzaW9ucyI6MywiLi9jcmMzMiI6NCwi" +
        "Li9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zdXBwb3J0IjozMCwiLi91dGY4IjozMSwiLi91dGlscyI6MzJ9XSwzNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCnZh" +
        "ciBTdHJlYW1IZWxwZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9TdHJlYW1IZWxwZXInKTsKdmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7CnZhciB1dGY4ID0gcmVxdWlyZSgn" +
        "Li91dGY4Jyk7CnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7CnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpOwoK" +
        "LyoqCiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS4KICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxl" +
        "CiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhCiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlCiAqLwp2" +
        "YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuZGlyID0gb3B0aW9ucy5kaXI7CiAgICB0aGlzLmRhdGUgPSBvcHRpb25z" +
        "LmRhdGU7CiAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7CiAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG9wdGlvbnMudW5peFBlcm1pc3Npb25zOwogICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9" +
        "IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7CgogICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7CiAgICAvLyBrZWVwIG9ubHkgdGhlIGNvbXByZXNzaW9u" +
        "CiAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLAogICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25z" +
        "CiAgICB9Owp9OwoKWmlwT2JqZWN0LnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGludGVybmFsIHN0cmVhbSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhpcyBvYmplY3QuCiAgICAgKiBAcGFy" +
        "YW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLgogICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS4KICAgICAqLwogICAgaW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uICh0" +
        "eXBlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IG51bGwsIG91dHB1dFR5cGUgPSAic3RyaW5nIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIXR5cGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5l" +
        "dyBFcnJvcigiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHZhciBhc2tVbmlj" +
        "b2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gInN0cmluZyIgfHwgb3V0cHV0VHlwZSA9PT0gInRleHQiOwogICAgICAgICAgICBpZiAob3V0cHV0VHlwZSA9PT0gImJpbmFyeXN0cmluZyIgfHwgb3V0cHV0VHlw" +
        "ZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlID0gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpOwoKICAg" +
        "ICAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5OwoKICAgICAgICAgICAgaWYgKGlzVW5pY29kZVN0cmluZyAmJiAhYXNrVW5pY29kZVN0cmluZykgewogICAgICAgICAgICAg" +
        "ICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzVW5pY29kZVN0cmluZyAmJiBhc2tVbmljb2RlU3RyaW5n" +
        "KSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RGVjb2RlV29ya2VyKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBy" +
        "ZXN1bHQgPSBuZXcgR2VuZXJpY1dvcmtlcigiZXJyb3IiKTsKICAgICAgICAgICAgcmVzdWx0LmVycm9yKGUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIocmVzdWx0LCBvdXRw" +
        "dXRUeXBlLCAiIik7CiAgICB9LAoKICAgIC8qKgogICAgICogUHJlcGFyZSB0aGUgY29udGVudCBpbiB0aGUgYXNrZWQgdHlwZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBy" +
        "ZXN1bHQuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuCiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2Ug" +
        "b2YgdGhlIHJlc3VsdC4KICAgICAqLwogICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkgewogICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUpLmFjY3VtdWxhdGUob25VcGRh" +
        "dGUpOwogICAgfSwKCiAgICAvKioKICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgYXMgYSBub2RlanMgc3RyZWFtLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay4K" +
        "ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS4KICAgICAqIEByZXR1cm4gU3RyZWFtIHRoZSBzdHJlYW0uCiAgICAgKi8K" +
        "ICAgIG5vZGVTdHJlYW06IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkgewogICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUgfHwgIm5vZGVidWZmZXIiKS50b05vZGVqc1N0cmVhbShvblVw" +
        "ZGF0ZSk7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgY29tcHJlc3NlZCBjb250ZW50LgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVz" +
        "c2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHRvIHVzZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuCiAgICAg" +
        "KiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLgogICAgICovCiAgICBfY29tcHJlc3NXb3JrZXI6IGZ1bmN0aW9uIChjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7CiAgICAgICAgaWYgKAogICAg" +
        "ICAgICAgICB0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCAmJgogICAgICAgICAgICB0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljID09PSBjb21wcmVzc2lvbi5tYWdpYwogICAgICAg" +
        "ICkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3Jr" +
        "ZXIoKTsKICAgICAgICAgICAgaWYoIXRoaXMuX2RhdGFCaW5hcnkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7CiAgICAgICAgICAg" +
        "IH0KICAgICAgICAgICAgcmV0dXJuIENvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbShyZXN1bHQsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpOwogICAgICAgIH0KICAgIH0sCiAgICAv" +
        "KioKICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGRlY29tcHJlc3NlZCBjb250ZW50LgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuCiAgICAgKi8KICAgIF9k" +
        "ZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRD" +
        "b250ZW50V29ya2VyKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICB9IGVsc2Ug" +
        "ewogICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7CiAgICAgICAgfQogICAgfQp9OwoKdmFyIHJlbW92ZWRNZXRob2RzID0gWyJhc1RleHQiLCAiYXNCaW5hcnkiLCAiYXNOb2Rl" +
        "QnVmZmVyIiwgImFzVWludDhBcnJheSIsICJhc0FycmF5QnVmZmVyIl07CnZhciByZW1vdmVkRm4gPSBmdW5jdGlvbiAoKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92" +
        "ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7Cn07Cgpmb3IodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKICAgIFppcE9iamVjdC5w" +
        "cm90b3R5cGVbcmVtb3ZlZE1ldGhvZHNbaV1dID0gcmVtb3ZlZEZuOwp9Cm1vZHVsZS5leHBvcnRzID0gWmlwT2JqZWN0OwoKfSx7Ii4vY29tcHJlc3NlZE9iamVjdCI6MiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6" +
        "MjcsIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiOjI5LCIuL3V0ZjgiOjMxfV0sMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24g" +
        "KGdsb2JhbCl7Cid1c2Ugc3RyaWN0JzsKdmFyIE11dGF0aW9uID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7Cgp2YXIgc2NoZWR1bGVEcmFpbjsKCnsK" +
        "ICBpZiAoTXV0YXRpb24pIHsKICAgIHZhciBjYWxsZWQgPSAwOwogICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uKG5leHRUaWNrKTsKICAgIHZhciBlbGVtZW50ID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0" +
        "ZVRleHROb2RlKCcnKTsKICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgewogICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlCiAgICB9KTsKICAgIHNjaGVkdWxlRHJhaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAg" +
        "IGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpOwogICAgfTsKICB9IGVsc2UgaWYgKCFnbG9iYWwuc2V0SW1tZWRpYXRlICYmIHR5cGVvZiBnbG9iYWwuTWVzc2FnZUNoYW5uZWwgIT09ICd1" +
        "bmRlZmluZWQnKSB7CiAgICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTsKICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbmV4dFRpY2s7CiAgICBzY2hlZHVsZURyYWluID0g" +
        "ZnVuY3Rpb24gKCkgewogICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApOwogICAgfTsKICB9IGVsc2UgaWYgKCdkb2N1bWVudCcgaW4gZ2xvYmFsICYmICdvbnJlYWR5c3RhdGVjaGFuZ2UnIGluIGds" +
        "b2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkgewogICAgc2NoZWR1bGVEcmFpbiA9IGZ1bmN0aW9uICgpIHsKCiAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFk" +
        "eXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZAogICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0" +
        "aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLgogICAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAg" +
        "IHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBuZXh0VGljaygpOwoKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwogICAgICAgIHNj" +
        "cmlwdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWwpOwogICAgICAgIHNjcmlwdEVsID0gbnVsbDsKICAgICAgfTsKICAgICAgZ2xvYmFsLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRD" +
        "aGlsZChzY3JpcHRFbCk7CiAgICB9OwogIH0gZWxzZSB7CiAgICBzY2hlZHVsZURyYWluID0gZnVuY3Rpb24gKCkgewogICAgICBzZXRUaW1lb3V0KG5leHRUaWNrLCAwKTsKICAgIH07CiAgfQp9Cgp2YXIgZHJh" +
        "aW5pbmc7CnZhciBxdWV1ZSA9IFtdOwovL25hbWVkIG5leHRUaWNrIGZvciBsZXNzIGNvbmZ1c2luZyBzdGFjayB0cmFjZXMKZnVuY3Rpb24gbmV4dFRpY2soKSB7CiAgZHJhaW5pbmcgPSB0cnVlOwogIHZhciBp" +
        "LCBvbGRRdWV1ZTsKICB2YXIgbGVuID0gcXVldWUubGVuZ3RoOwogIHdoaWxlIChsZW4pIHsKICAgIG9sZFF1ZXVlID0gcXVldWU7CiAgICBxdWV1ZSA9IFtdOwogICAgaSA9IC0xOwogICAgd2hpbGUgKCsraSA8" +
        "IGxlbikgewogICAgICBvbGRRdWV1ZVtpXSgpOwogICAgfQogICAgbGVuID0gcXVldWUubGVuZ3RoOwogIH0KICBkcmFpbmluZyA9IGZhbHNlOwp9Cgptb2R1bGUuZXhwb3J0cyA9IGltbWVkaWF0ZTsKZnVuY3Rp" +
        "b24gaW1tZWRpYXRlKHRhc2spIHsKICBpZiAocXVldWUucHVzaCh0YXNrKSA9PT0gMSAmJiAhZHJhaW5pbmcpIHsKICAgIHNjaGVkdWxlRHJhaW4oKTsKICB9Cn0KCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFs" +
        "ICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSwzNzpb" +
        "ZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKdmFyIGltbWVkaWF0ZSA9IHJlcXVpcmUoJ2ltbWVkaWF0ZScpOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rp" +
        "b24gSU5URVJOQUwoKSB7fQoKdmFyIGhhbmRsZXJzID0ge307Cgp2YXIgUkVKRUNURUQgPSBbJ1JFSkVDVEVEJ107CnZhciBGVUxGSUxMRUQgPSBbJ0ZVTEZJTExFRCddOwp2YXIgUEVORElORyA9IFsnUEVORElO" +
        "RyddOwoKbW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlOwoKZnVuY3Rpb24gUHJvbWlzZShyZXNvbHZlcikgewogIGlmICh0eXBlb2YgcmVzb2x2ZXIgIT09ICdmdW5jdGlvbicpIHsKICAgIHRocm93IG5ldyBUeXBl" +
        "RXJyb3IoJ3Jlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpOwogIH0KICB0aGlzLnN0YXRlID0gUEVORElORzsKICB0aGlzLnF1ZXVlID0gW107CiAgdGhpcy5vdXRjb21lID0gdm9pZCAwOwogIGlmIChyZXNv" +
        "bHZlciAhPT0gSU5URVJOQUwpIHsKICAgIHNhZmVseVJlc29sdmVUaGVuYWJsZSh0aGlzLCByZXNvbHZlcik7CiAgfQp9CgpQcm9taXNlLnByb3RvdHlwZVsiZmluYWxseSJdID0gZnVuY3Rpb24gKGNhbGxiYWNr" +
        "KSB7CiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgewogICAgcmV0dXJuIHRoaXM7CiAgfQogIHZhciBwID0gdGhpcy5jb25zdHJ1Y3RvcjsKICByZXR1cm4gdGhpcy50aGVuKHJlc29sdmUs" +
        "IHJlamVjdCk7CgogIGZ1bmN0aW9uIHJlc29sdmUodmFsdWUpIHsKICAgIGZ1bmN0aW9uIHllcyAoKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBwLnJlc29sdmUoY2FsbGJhY2soKSku" +
        "dGhlbih5ZXMpOwogIH0KICBmdW5jdGlvbiByZWplY3QocmVhc29uKSB7CiAgICBmdW5jdGlvbiBubyAoKSB7CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0KICAgIHJldHVybiBwLnJlc29sdmUoY2FsbGJhY2so" +
        "KSkudGhlbihubyk7CiAgfQp9OwpQcm9taXNlLnByb3RvdHlwZVsiY2F0Y2giXSA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7CiAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTsKfTsKUHJvbWlz" +
        "ZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgewogIGlmICh0eXBlb2Ygb25GdWxmaWxsZWQgIT09ICdmdW5jdGlvbicgJiYgdGhpcy5zdGF0ZSA9PT0gRlVMRklM" +
        "TEVEIHx8CiAgICB0eXBlb2Ygb25SZWplY3RlZCAhPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLnN0YXRlID09PSBSRUpFQ1RFRCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQogIHZhciBwcm9taXNlID0gbmV3IHRoaXMu" +
        "Y29uc3RydWN0b3IoSU5URVJOQUwpOwogIGlmICh0aGlzLnN0YXRlICE9PSBQRU5ESU5HKSB7CiAgICB2YXIgcmVzb2x2ZXIgPSB0aGlzLnN0YXRlID09PSBGVUxGSUxMRUQgPyBvbkZ1bGZpbGxlZCA6IG9uUmVq" +
        "ZWN0ZWQ7CiAgICB1bndyYXAocHJvbWlzZSwgcmVzb2x2ZXIsIHRoaXMub3V0Y29tZSk7CiAgfSBlbHNlIHsKICAgIHRoaXMucXVldWUucHVzaChuZXcgUXVldWVJdGVtKHByb21pc2UsIG9uRnVsZmlsbGVkLCBv" +
        "blJlamVjdGVkKSk7CiAgfQoKICByZXR1cm4gcHJvbWlzZTsKfTsKZnVuY3Rpb24gUXVldWVJdGVtKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTsK" +
        "ICBpZiAodHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICB0aGlzLm9uRnVsZmlsbGVkID0gb25GdWxmaWxsZWQ7CiAgICB0aGlzLmNhbGxGdWxmaWxsZWQgPSB0aGlzLm90aGVyQ2FsbEZ1" +
        "bGZpbGxlZDsKICB9CiAgaWYgKHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICB0aGlzLm9uUmVqZWN0ZWQgPSBvblJlamVjdGVkOwogICAgdGhpcy5jYWxsUmVqZWN0ZWQgPSB0aGlzLm90" +
        "aGVyQ2FsbFJlamVjdGVkOwogIH0KfQpRdWV1ZUl0ZW0ucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICBoYW5kbGVycy5yZXNvbHZlKHRoaXMucHJvbWlzZSwgdmFsdWUpOwp9" +
        "OwpRdWV1ZUl0ZW0ucHJvdG90eXBlLm90aGVyQ2FsbEZ1bGZpbGxlZCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogIHVud3JhcCh0aGlzLnByb21pc2UsIHRoaXMub25GdWxmaWxsZWQsIHZhbHVlKTsKfTsKUXVldWVJ" +
        "dGVtLnByb3RvdHlwZS5jYWxsUmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICBoYW5kbGVycy5yZWplY3QodGhpcy5wcm9taXNlLCB2YWx1ZSk7Cn07ClF1ZXVlSXRlbS5wcm90b3R5cGUub3RoZXJDYWxs" +
        "UmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICB1bndyYXAodGhpcy5wcm9taXNlLCB0aGlzLm9uUmVqZWN0ZWQsIHZhbHVlKTsKfTsKCmZ1bmN0aW9uIHVud3JhcChwcm9taXNlLCBmdW5jLCB2YWx1ZSkg" +
        "ewogIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICB2YXIgcmV0dXJuVmFsdWU7CiAgICB0cnkgewogICAgICByZXR1cm5WYWx1ZSA9IGZ1bmModmFsdWUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1" +
        "cm4gaGFuZGxlcnMucmVqZWN0KHByb21pc2UsIGUpOwogICAgfQogICAgaWYgKHJldHVyblZhbHVlID09PSBwcm9taXNlKSB7CiAgICAgIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCBuZXcgVHlwZUVycm9yKCdD" +
        "YW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmJykpOwogICAgfSBlbHNlIHsKICAgICAgaGFuZGxlcnMucmVzb2x2ZShwcm9taXNlLCByZXR1cm5WYWx1ZSk7CiAgICB9CiAgfSk7Cn0KCmhhbmRsZXJz" +
        "LnJlc29sdmUgPSBmdW5jdGlvbiAoc2VsZiwgdmFsdWUpIHsKICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2goZ2V0VGhlbiwgdmFsdWUpOwogIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZXJyb3InKSB7CiAgICByZXR1" +
        "cm4gaGFuZGxlcnMucmVqZWN0KHNlbGYsIHJlc3VsdC52YWx1ZSk7CiAgfQogIHZhciB0aGVuYWJsZSA9IHJlc3VsdC52YWx1ZTsKCiAgaWYgKHRoZW5hYmxlKSB7CiAgICBzYWZlbHlSZXNvbHZlVGhlbmFibGUo" +
        "c2VsZiwgdGhlbmFibGUpOwogIH0gZWxzZSB7CiAgICBzZWxmLnN0YXRlID0gRlVMRklMTEVEOwogICAgc2VsZi5vdXRjb21lID0gdmFsdWU7CiAgICB2YXIgaSA9IC0xOwogICAgdmFyIGxlbiA9IHNlbGYucXVl" +
        "dWUubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IGxlbikgewogICAgICBzZWxmLnF1ZXVlW2ldLmNhbGxGdWxmaWxsZWQodmFsdWUpOwogICAgfQogIH0KICByZXR1cm4gc2VsZjsKfTsKaGFuZGxlcnMucmVqZWN0" +
        "ID0gZnVuY3Rpb24gKHNlbGYsIGVycm9yKSB7CiAgc2VsZi5zdGF0ZSA9IFJFSkVDVEVEOwogIHNlbGYub3V0Y29tZSA9IGVycm9yOwogIHZhciBpID0gLTE7CiAgdmFyIGxlbiA9IHNlbGYucXVldWUubGVuZ3Ro" +
        "OwogIHdoaWxlICgrK2kgPCBsZW4pIHsKICAgIHNlbGYucXVldWVbaV0uY2FsbFJlamVjdGVkKGVycm9yKTsKICB9CiAgcmV0dXJuIHNlbGY7Cn07CgpmdW5jdGlvbiBnZXRUaGVuKG9iaikgewogIC8vIE1ha2Ug" +
        "c3VyZSB3ZSBvbmx5IGFjY2VzcyB0aGUgYWNjZXNzb3Igb25jZSBhcyByZXF1aXJlZCBieSB0aGUgc3BlYwogIHZhciB0aGVuID0gb2JqICYmIG9iai50aGVuOwogIGlmIChvYmogJiYgKHR5cGVvZiBvYmogPT09" +
        "ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpICYmIHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gYXBweVRoZW4oKSB7CiAgICAgIHRoZW4uYXBw" +
        "bHkob2JqLCBhcmd1bWVudHMpOwogICAgfTsKICB9Cn0KCmZ1bmN0aW9uIHNhZmVseVJlc29sdmVUaGVuYWJsZShzZWxmLCB0aGVuYWJsZSkgewogIC8vIEVpdGhlciBmdWxmaWxsLCByZWplY3Qgb3IgcmVqZWN0" +
        "IHdpdGggZXJyb3IKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgZnVuY3Rpb24gb25FcnJvcih2YWx1ZSkgewogICAgaWYgKGNhbGxlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjYWxsZWQgPSB0cnVlOwog" +
        "ICAgaGFuZGxlcnMucmVqZWN0KHNlbGYsIHZhbHVlKTsKICB9CgogIGZ1bmN0aW9uIG9uU3VjY2Vzcyh2YWx1ZSkgewogICAgaWYgKGNhbGxlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjYWxsZWQgPSB0" +
        "cnVlOwogICAgaGFuZGxlcnMucmVzb2x2ZShzZWxmLCB2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiB0cnlUb1Vud3JhcCgpIHsKICAgIHRoZW5hYmxlKG9uU3VjY2Vzcywgb25FcnJvcik7CiAgfQoKICB2YXIgcmVz" +
        "dWx0ID0gdHJ5Q2F0Y2godHJ5VG9VbndyYXApOwogIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZXJyb3InKSB7CiAgICBvbkVycm9yKHJlc3VsdC52YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiB0cnlDYXRjaChmdW5j" +
        "LCB2YWx1ZSkgewogIHZhciBvdXQgPSB7fTsKICB0cnkgewogICAgb3V0LnZhbHVlID0gZnVuYyh2YWx1ZSk7CiAgICBvdXQuc3RhdHVzID0gJ3N1Y2Nlc3MnOwogIH0gY2F0Y2ggKGUpIHsKICAgIG91dC5zdGF0" +
        "dXMgPSAnZXJyb3InOwogICAgb3V0LnZhbHVlID0gZTsKICB9CiAgcmV0dXJuIG91dDsKfQoKUHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTsKZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSkgewogIGlmICh2YWx1ZSBp" +
        "bnN0YW5jZW9mIHRoaXMpIHsKICAgIHJldHVybiB2YWx1ZTsKICB9CiAgcmV0dXJuIGhhbmRsZXJzLnJlc29sdmUobmV3IHRoaXMoSU5URVJOQUwpLCB2YWx1ZSk7Cn0KClByb21pc2UucmVqZWN0ID0gcmVqZWN0" +
        "OwpmdW5jdGlvbiByZWplY3QocmVhc29uKSB7CiAgdmFyIHByb21pc2UgPSBuZXcgdGhpcyhJTlRFUk5BTCk7CiAgcmV0dXJuIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCByZWFzb24pOwp9CgpQcm9taXNlLmFs" +
        "bCA9IGFsbDsKZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7CiAgdmFyIHNlbGYgPSB0aGlzOwogIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcmFibGUpICE9PSAnW29iamVjdCBBcnJheV0n" +
        "KSB7CiAgICByZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcignbXVzdCBiZSBhbiBhcnJheScpKTsKICB9CgogIHZhciBsZW4gPSBpdGVyYWJsZS5sZW5ndGg7CiAgdmFyIGNhbGxlZCA9IGZhbHNlOwog" +
        "IGlmICghbGVuKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTsKICB9CgogIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuKTsKICB2YXIgcmVzb2x2ZWQgPSAwOwogIHZhciBpID0gLTE7CiAgdmFyIHBy" +
        "b21pc2UgPSBuZXcgdGhpcyhJTlRFUk5BTCk7CgogIHdoaWxlICgrK2kgPCBsZW4pIHsKICAgIGFsbFJlc29sdmVyKGl0ZXJhYmxlW2ldLCBpKTsKICB9CiAgcmV0dXJuIHByb21pc2U7CiAgZnVuY3Rpb24gYWxs" +
        "UmVzb2x2ZXIodmFsdWUsIGkpIHsKICAgIHNlbGYucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlRnJvbUFsbCwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgIGlmICghY2FsbGVkKSB7CiAgICAgICAgY2FsbGVk" +
        "ID0gdHJ1ZTsKICAgICAgICBoYW5kbGVycy5yZWplY3QocHJvbWlzZSwgZXJyb3IpOwogICAgICB9CiAgICB9KTsKICAgIGZ1bmN0aW9uIHJlc29sdmVGcm9tQWxsKG91dFZhbHVlKSB7CiAgICAgIHZhbHVlc1tp" +
        "XSA9IG91dFZhbHVlOwogICAgICBpZiAoKytyZXNvbHZlZCA9PT0gbGVuICYmICFjYWxsZWQpIHsKICAgICAgICBjYWxsZWQgPSB0cnVlOwogICAgICAgIGhhbmRsZXJzLnJlc29sdmUocHJvbWlzZSwgdmFsdWVz" +
        "KTsKICAgICAgfQogICAgfQogIH0KfQoKUHJvbWlzZS5yYWNlID0gcmFjZTsKZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkgewogIHZhciBzZWxmID0gdGhpczsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu" +
        "Zy5jYWxsKGl0ZXJhYmxlKSAhPT0gJ1tvYmplY3QgQXJyYXldJykgewogICAgcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ211c3QgYmUgYW4gYXJyYXknKSk7CiAgfQoKICB2YXIgbGVuID0gaXRl" +
        "cmFibGUubGVuZ3RoOwogIHZhciBjYWxsZWQgPSBmYWxzZTsKICBpZiAoIWxlbikgewogICAgcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7CiAgfQoKICB2YXIgaSA9IC0xOwogIHZhciBwcm9taXNlID0gbmV3IHRo" +
        "aXMoSU5URVJOQUwpOwoKICB3aGlsZSAoKytpIDwgbGVuKSB7CiAgICByZXNvbHZlcihpdGVyYWJsZVtpXSk7CiAgfQogIHJldHVybiBwcm9taXNlOwogIGZ1bmN0aW9uIHJlc29sdmVyKHZhbHVlKSB7CiAgICBz" +
        "ZWxmLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgIGlmICghY2FsbGVkKSB7CiAgICAgICAgY2FsbGVkID0gdHJ1ZTsKICAgICAgICBoYW5kbGVycy5yZXNvbHZlKHByb21p" +
        "c2UsIHJlc3BvbnNlKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgIGlmICghY2FsbGVkKSB7CiAgICAgICAgY2FsbGVkID0gdHJ1ZTsKICAgICAgICBoYW5kbGVycy5yZWplY3QocHJv" +
        "bWlzZSwgZXJyb3IpOwogICAgICB9CiAgICB9KTsKICB9Cn0KCn0seyJpbW1lZGlhdGUiOjM2fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewovLyBUb3AgbGV2ZWwgZmlsZSBpcyBqdXN0" +
        "IGEgbWl4aW4gb2Ygc3VibW9kdWxlcyAmIGNvbnN0YW50cwondXNlIHN0cmljdCc7Cgp2YXIgYXNzaWduICAgID0gcmVxdWlyZSgnLi9saWIvdXRpbHMvY29tbW9uJykuYXNzaWduOwoKdmFyIGRlZmxhdGUgICA9" +
        "IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTsKdmFyIGluZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2luZmxhdGUnKTsKdmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7Cgp2" +
        "YXIgcGFrbyA9IHt9OwoKYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7Cgptb2R1bGUuZXhwb3J0cyA9IHBha287Cgp9LHsiLi9saWIvZGVmbGF0ZSI6MzksIi4vbGliL2luZmxhdGUi" +
        "OjQwLCIuL2xpYi91dGlscy9jb21tb24iOjQxLCIuL2xpYi96bGliL2NvbnN0YW50cyI6NDR9XSwzOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCgp2YXIgemxpYl9k" +
        "ZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTsKdmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7CnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0" +
        "cmluZ3MnKTsKdmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpOwp2YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTsKCnZhciB0b1N0cmluZyA9IE9i" +
        "amVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgovKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiA9PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7CnZhciBaX0ZJTklTSCAgICAgICAgPSA0OwoK" +
        "dmFyIFpfT0sgICAgICAgICAgICA9IDA7CnZhciBaX1NUUkVBTV9FTkQgICAgPSAxOwp2YXIgWl9TWU5DX0ZMVVNIICAgID0gMjsKCnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTsKCnZhciBaX0RFRkFV" +
        "TFRfU1RSQVRFR1kgICAgPSAwOwoKdmFyIFpfREVGTEFURUQgID0gODsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PSovCgoKLyoqCiAqIGNsYXNzIERlZmxhdGUKICoKICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZAogKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNl" +
        "IG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sCiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS4KICoqLwoKLyogaW50ZXJuYWwKICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXkKICoKICog" +
        "Q2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi4KICoqLwoKLyoqCiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXkKICoKICogQ29tcHJl" +
        "c3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXQogKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5r" +
        "CiAqIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSAgb3IgaWYgeW91CiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0" +
        "ZSNwdXNoXV0gd2l0aAogKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuCiAqKi8KCi8qKgogKiBEZWZsYXRlLmVyciAtPiBOdW1iZXIKICoKICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwICha" +
        "X09LKSBvbiBzdWNjZXNzLgogKiBZb3Ugd2lsbCBub3QgbmVlZCBpdCBpbiByZWFsIGxpZmUsIGJlY2F1c2UgZGVmbGF0ZSBlcnJvcnMKICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBi" +
        "YWQgYG9uRGF0YWAgLyBgb25FbmRgCiAqIGN1c3RvbSBoYW5kbGVycy4KICoqLwoKLyoqCiAqIERlZmxhdGUubXNnIC0+IFN0cmluZwogKgogKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0g" +
        "MAogKiovCgoKLyoqCiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpCiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuCiAqCiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdp" +
        "dGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvbgogKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczoKICoKICogLSBgbGV2ZWxgCiAqIC0gYHdpbmRvd0JpdHNgCiAqIC0gYG1lbUxl" +
        "dmVsYAogKiAtIGBzdHJhdGVneWAKICogLSBgZGljdGlvbmFyeWAKICoKICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2Vk" +
        "KQogKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS4KICoKICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6CiAqCiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRl" +
        "ZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpCiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGUKICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlcgogKiAtIGB0" +
        "b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSAiYmluYXJ5IHN0cmluZyIKICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKQogKiAtIGBoZWFkZXJgIChP" +
        "YmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcAogKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQKICogICAtIGB0aW1lYCAoTnVt" +
        "YmVyKSAtIG1vZGlmaWNhdGlvbiB0aW1lLCB1bml4IHRpbWVzdGFtcAogKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZQogKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2Yg" +
        "Ynl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpCiAqICAgLSBgbmFtZWAgKFN0cmluZykgLSBmaWxlIG5hbWUgKGJpbmFyeSBzdHJpbmcpCiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50" +
        "IChiaW5hcnkgc3RyaW5nKQogKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWQKICoKICogIyMjIyMgRXhhbXBsZToKICoKICogYGBgamF2YXNjcmlwdAog" +
        "KiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKQogKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKQogKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQs" +
        "MTUsMTYsMTcsMTgsMTldKTsKICoKICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTsKICoKICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpOwogKiBkZWZsYXRlLnB1c2go" +
        "Y2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVuawogKgogKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfQogKgogKiBjb25zb2xlLmxvZyhkZWZsYXRl" +
        "LnJlc3VsdCk7CiAqIGBgYAogKiovCmZ1bmN0aW9uIERlZmxhdGUob3B0aW9ucykgewogIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpOwoKICB0aGlz" +
        "Lm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oewogICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTiwKICAgIG1ldGhvZDogWl9ERUZMQVRFRCwKICAgIGNodW5rU2l6ZTogMTYzODQsCiAgICB3aW5kb3dCaXRz" +
        "OiAxNSwKICAgIG1lbUxldmVsOiA4LAogICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSwKICAgIHRvOiAnJwogIH0sIG9wdGlvbnMgfHwge30pOwoKICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zOwoKICBp" +
        "ZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkgewogICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7CiAgfQoKICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMg" +
        "PiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHsKICAgIG9wdC53aW5kb3dCaXRzICs9IDE2OwogIH0KCiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBa" +
        "X09LKQogIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlCiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxscwogIHRoaXMuY2h1" +
        "bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhCgogIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7CiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7CgogIHZhciBzdGF0dXMgPSB6bGli" +
        "X2RlZmxhdGUuZGVmbGF0ZUluaXQyKAogICAgdGhpcy5zdHJtLAogICAgb3B0LmxldmVsLAogICAgb3B0Lm1ldGhvZCwKICAgIG9wdC53aW5kb3dCaXRzLAogICAgb3B0Lm1lbUxldmVsLAogICAgb3B0LnN0cmF0" +
        "ZWd5CiAgKTsKCiAgaWYgKHN0YXR1cyAhPT0gWl9PSykgewogICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICB9CgogIGlmIChvcHQuaGVhZGVyKSB7CiAgICB6bGliX2RlZmxhdGUuZGVmbGF0ZVNl" +
        "dEhlYWRlcih0aGlzLnN0cm0sIG9wdC5oZWFkZXIpOwogIH0KCiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7CiAgICB2YXIgZGljdDsKICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWQKICAgIGlmICh0eXBlb2Yg" +
        "b3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7CiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguCiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmlu" +
        "ZzJidWYob3B0LmRpY3Rpb25hcnkpOwogICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykgewogICAgICBkaWN0ID0gbmV3IFVpbnQ4" +
        "QXJyYXkob3B0LmRpY3Rpb25hcnkpOwogICAgfSBlbHNlIHsKICAgICAgZGljdCA9IG9wdC5kaWN0aW9uYXJ5OwogICAgfQoKICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0" +
        "aGlzLnN0cm0sIGRpY3QpOwoKICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICAgIH0KCiAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7CiAgfQp9" +
        "CgovKioKICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhbgogKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YS4gU3RyaW5ncyB3aWxs" +
        "IGJlCiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS4KICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLgog" +
        "KiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnNoIFpfRklOSVNILgogKgogKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwg" +
        "Z2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aAogKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBo" +
        "YXZlCiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGwKICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4" +
        "cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdQogKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LgogKgogKiBPbiBm" +
        "YWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuCiAqCiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZv" +
        "ciBiZXN0IHNwZWVkIChvdXRwdXQKICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5cwogKiB1c2UgdGhlIHNhbWUg" +
        "dHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuCiAqCiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFy" +
        "ZSBbMC4uMjU1XS4KICoKICogIyMjIyMgRXhhbXBsZQogKgogKiBgYGBqYXZhc2NyaXB0CiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3MKICogLi4uCiAqIHB1c2goY2h1" +
        "bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rCiAqIGBgYAogKiovCkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkgewogIHZhciBzdHJtID0gdGhpcy5zdHJtOwogIHZh" +
        "ciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogIHZhciBzdGF0dXMsIF9tb2RlOwoKICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH0KCiAgX21vZGUgPSAobW9kZSA9PT0gfn5t" +
        "b2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTsKCiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZAogIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHsK" +
        "ICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguCiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpOwogIH0gZWxzZSBpZiAodG9T" +
        "dHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykgewogICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpOwogIH0gZWxzZSB7CiAgICBzdHJtLmlucHV0ID0gZGF0YTsK" +
        "ICB9CgogIHN0cm0ubmV4dF9pbiA9IDA7CiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoOwoKICBkbyB7CiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgc3RybS5vdXRwdXQg" +
        "PSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpOwogICAgICBzdHJtLm5leHRfb3V0ID0gMDsKICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7CiAgICB9CiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUu" +
        "ZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi8KCiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7CiAgICAgIHRoaXMub25F" +
        "bmQoc3RhdHVzKTsKICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAo" +
        "X21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkgewogICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykgewogICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3Mu" +
        "YnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0" +
        "cHV0LCBzdHJtLm5leHRfb3V0KSk7CiAgICAgIH0KICAgIH0KICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTsK" +
        "CiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuCiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkgewogICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTsKICAgIHRoaXMu" +
        "b25FbmQoc3RhdHVzKTsKICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSzsKICB9CgogIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guCiAg" +
        "aWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHsKICAgIHRoaXMub25FbmQoWl9PSyk7CiAgICBzdHJtLmF2YWlsX291dCA9IDA7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB0cnVlOwp9OwoKCi8q" +
        "KgogKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZAogKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kcwogKiAgIG9uIGpzIGVu" +
        "Z2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rCiAqICAgd2lsbCBiZSBzdHJpbmcuCiAqCiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1" +
        "bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlCiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuCiAqKi8KRGVmbGF0ZS5wcm90b3R5" +
        "cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7CiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7Cn07CgoKLyoqCiAqIERlZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkCiAqIC0gc3RhdHVzIChOdW1iZXIp" +
        "OiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcywKICogICBvdGhlciBpZiBub3QuCiAqCiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFt" +
        "IGlzCiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSCkKICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBj" +
        "aHVua3MsCiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuCiAqKi8KRGVmbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7CiAgLy8gT24g" +
        "c3VjY2VzcyAtIGpvaW4KICBpZiAoc3RhdHVzID09PSBaX09LKSB7CiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykgewogICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycp" +
        "OwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTsKICAgIH0KICB9CiAgdGhpcy5jaHVua3MgPSBbXTsKICB0aGlzLmVyciA9IHN0YXR1czsK" +
        "ICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7Cn07CgoKLyoqCiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZwogKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8" +
        "U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy4KICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy4KICoKICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0" +
        "aG0gYW5kIGBvcHRpb25zYC4KICoKICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOgogKgogKiAtIGxldmVsCiAqIC0gd2luZG93Qml0cwogKiAtIG1lbUxldmVsCiAqIC0gc3RyYXRlZ3kKICogLSBkaWN0aW9uYXJ5" +
        "CiAqCiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZCkKICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuCiAq" +
        "CiAqIFN1Z2FyIChvcHRpb25zKToKICoKICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeQogKiAgIG5lZ2F0" +
        "aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS4KICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgImJpbmFyeSBzdHJpbmciCiAqICAgIChlYWNoIGNo" +
        "YXIgY29kZSBbMC4uMjU1XSkKICoKICogIyMjIyMgRXhhbXBsZToKICoKICogYGBgamF2YXNjcmlwdAogKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKQogKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwz" +
        "LDQsNSw2LDcsOCw5XSk7CiAqCiAqIGNvbnNvbGUubG9nKHBha28uZGVmbGF0ZShkYXRhKSk7CiAqIGBgYAogKiovCmZ1bmN0aW9uIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHsKICB2YXIgZGVmbGF0b3IgPSBu" +
        "ZXcgRGVmbGF0ZShvcHRpb25zKTsKCiAgZGVmbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7CgogIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopCiAg" +
        "aWYgKGRlZmxhdG9yLmVycikgeyB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnW2RlZmxhdG9yLmVycl07IH0KCiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDsKfQoKCi8qKgogKiBkZWZsYXRlUmF3KGRhdGFbLCBv" +
        "cHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmcKICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuCiAqIC0gb3B0aW9ucyAoT2JqZWN0KTog" +
        "emxpYiBkZWZsYXRlIG9wdGlvbnMuCiAqCiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyCiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS4K" +
        "ICoqLwpmdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgb3B0aW9ucy5yYXcgPSB0cnVlOwogIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRp" +
        "b25zKTsKfQoKCi8qKgogKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmcKICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29t" +
        "cHJlc3MuCiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuCiAqCiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mCiAq" +
        "IGRlZmxhdGUgb25lLgogKiovCmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHsKICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICBvcHRpb25zLmd6aXAgPSB0cnVlOwogIHJldHVybiBkZWZsYXRlKGlu" +
        "cHV0LCBvcHRpb25zKTsKfQoKCmV4cG9ydHMuRGVmbGF0ZSA9IERlZmxhdGU7CmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7CmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7CmV4cG9ydHMuZ3ppcCA9" +
        "IGd6aXA7Cgp9LHsiLi91dGlscy9jb21tb24iOjQxLCIuL3V0aWxzL3N0cmluZ3MiOjQyLCIuL3psaWIvZGVmbGF0ZSI6NDYsIi4vemxpYi9tZXNzYWdlcyI6NTEsIi4vemxpYi96c3RyZWFtIjo1M31dLDQwOltm" +
        "dW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKCnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpOwp2YXIgdXRpbHMgICAgICAgID0gcmVxdWly" +
        "ZSgnLi91dGlscy9jb21tb24nKTsKdmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpOwp2YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpOwp2YXIg" +
        "bXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7CnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpOwp2YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96" +
        "bGliL2d6aGVhZGVyJyk7Cgp2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwoKLyoqCiAqIGNsYXNzIEluZmxhdGUKICoKICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGli" +
        "IGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZAogKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV0KICogYW5kIFtbaW5mbGF0ZVJhd11dLgogKiovCgov" +
        "KiBpbnRlcm5hbAogKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheQogKgogKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLgogKiovCgovKioKICogSW5m" +
        "bGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmcKICoKICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dCiAqIGFuZCBbW0luZmxh" +
        "dGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmsKICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlv" +
        "dQogKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGgKICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLgogKiovCgovKioKICogSW5mbGF0ZS5lcnIgLT4g" +
        "TnVtYmVyCiAqCiAqIEVycm9yIGNvZGUgYWZ0ZXIgaW5mbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy4KICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuCiAqKi8K" +
        "Ci8qKgogKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmcKICoKICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDAKICoqLwoKCi8qKgogKiBuZXcgSW5mbGF0ZShvcHRpb25zKQogKiAtIG9wdGlv" +
        "bnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLgogKgogKiBDcmVhdGVzIG5ldyBpbmZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb24KICogb24gYmFk" +
        "IHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6CiAqCiAqIC0gYHdpbmRvd0JpdHNgCiAqIC0gYGRpY3Rpb25hcnlgCiAqCiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96" +
        "bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZCkKICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuCiAqCiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOgogKgogKiAtIGBj" +
        "aHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KQogKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBpbmZsYXRlCiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlm" +
        "IGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZAogKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVz" +
        "dGVkLAogKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LgogKgogKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0" +
        "ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWEKICogd3JhcHBlciBoZWFkZXIuCiAqCiAqICMjIyMjIEV4YW1wbGU6CiAqCiAqIGBgYGphdmFzY3JpcHQKICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtv" +
        "JykKICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSkKICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7CiAqCiAqIHZh" +
        "ciBpbmZsYXRlID0gbmV3IHBha28uSW5mbGF0ZSh7IGxldmVsOiAzfSk7CiAqCiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTsKICogaW5mbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+" +
        "IGxhc3QgY2h1bmsKICoKICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH0KICoKICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpOwogKiBgYGAKICoqLwpmdW5j" +
        "dGlvbiBJbmZsYXRlKG9wdGlvbnMpIHsKICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTsKCiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHsK" +
        "ICAgIGNodW5rU2l6ZTogMTYzODQsCiAgICB3aW5kb3dCaXRzOiAwLAogICAgdG86ICcnCiAgfSwgb3B0aW9ucyB8fCB7fSk7CgogIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7CgogIC8vIEZvcmNlIHdpbmRvdyBz" +
        "aXplIGZvciBgcmF3YCBkYXRhLCBpZiBub3Qgc2V0IGRpcmVjdGx5LAogIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuCiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRz" +
        "ID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkgewogICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7CiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMg" +
        "PSAtMTU7IH0KICB9CgogIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGUKICBpZiAoKG9wdC53aW5k" +
        "b3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJgogICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkgewogICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7CiAgfQoKICAvLyBH" +
        "emlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHkKICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNl" +
        "IGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGUKICBpZiAoKG9wdC53aW5kb3dCaXRzID4gMTUpICYmIChvcHQud2luZG93Qml0cyA8IDQ4KSkgewogICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGEK" +
        "ICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGUKICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHsKICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7CiAgICB9CiAg" +
        "fQoKICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spCiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2UKICB0aGlzLmVuZGVkICA9" +
        "IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzCiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGEKCiAgdGhpcy5zdHJtICAgPSBu" +
        "ZXcgWlN0cmVhbSgpOwogIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwOwoKICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoCiAgICB0aGlzLnN0cm0sCiAgICBvcHQud2luZG93Qml0cwog" +
        "ICk7CgogIGlmIChzdGF0dXMgIT09IGMuWl9PSykgewogICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICB9CgogIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7CgogIHpsaWJfaW5mbGF0ZS5p" +
        "bmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpOwp9CgovKioKICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhbgogKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJy" +
        "YXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YQogKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuCiAqICAgU2VlIGNvbnN0" +
        "YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guCiAqCiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gaW5mbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtb" +
        "SW5mbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoCiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZQogKiBtb2RlIFpfRklO" +
        "SVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsCiAqIFtbSW5mbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3" +
        "aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3UKICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LgogKgogKiBPbiBmYWlsIGNhbGwgW1tJbmZs" +
        "YXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuCiAqCiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChv" +
        "dXRwdXQKICogZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5cwogKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJv" +
        "b2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuCiAqCiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS4KICoKICogIyMj" +
        "IyMgRXhhbXBsZQogKgogKiBgYGBqYXZhc2NyaXB0CiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3MKICogLi4uCiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBs" +
        "YXN0IGNodW5rCiAqIGBgYAogKiovCkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkgewogIHZhciBzdHJtID0gdGhpcy5zdHJtOwogIHZhciBjaHVua1NpemUgPSB0aGlzLm9w" +
        "dGlvbnMuY2h1bmtTaXplOwogIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7CiAgdmFyIHN0YXR1cywgX21vZGU7CiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7CiAg" +
        "dmFyIGRpY3Q7CgogIC8vIEZsYWcgdG8gcHJvcGVybHkgcHJvY2VzcyBaX0JVRl9FUlJPUiBvbiB0ZXN0aW5nIGluZmxhdGUgY2FsbAogIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2Fz" +
        "IGZsdXNoZWQuCiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTsKCiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUg" +
        "PT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7CgogIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWQKICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7CiAgICAvLyBPbmx5IGJpbmFy" +
        "eSBzdHJpbmdzIGNhbiBiZSBkZWNvbXByZXNzZWQgb24gcHJhY3RpY2UKICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7CiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEp" +
        "ID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7CiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgfSBlbHNlIHsKICAgIHN0cm0uaW5wdXQgPSBkYXRhOwogIH0KCiAgc3RybS5uZXh0" +
        "X2luID0gMDsKICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7CgogIGRvIHsKICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4" +
        "KGNodW5rU2l6ZSk7CiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwOwogICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTsKICAgIH0KCiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBj" +
        "LlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovCgogICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7CiAgICAgIC8vIENvbnZlcnQgZGF0YSBpZiBu" +
        "ZWVkZWQKICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykgewogICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7CiAgICAgIH0gZWxzZSBpZiAodG9TdHJp" +
        "bmcuY2FsbChkaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykgewogICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaWN0" +
        "ID0gZGljdGlvbmFyeTsKICAgICAgfQoKICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7CgogICAgfQoKICAgIGlmIChzdGF0dXMgPT09IGMu" +
        "Wl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkgewogICAgICBzdGF0dXMgPSBjLlpfT0s7CiAgICAgIGFsbG93QnVmRXJyb3IgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoc3RhdHVzICE9PSBj" +
        "LlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykgewogICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7CiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAg" +
        "aWYgKHN0cm0ubmV4dF9vdXQpIHsKICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBj" +
        "LlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7CgogICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmlu" +
        "Z3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7CgogICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4OwogICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3Mu" +
        "YnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7CgogICAgICAgICAgLy8gbW92ZSB0YWlsCiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDsKICAgICAgICAgIHN0cm0uYXZhaWxfb3V0" +
        "ID0gY2h1bmtTaXplIC0gdGFpbDsKICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH0KCiAgICAgICAg" +
        "ICB0aGlzLm9uRGF0YSh1dGY4c3RyKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpOwogICAgICAgIH0K" +
        "ICAgICAgfQogICAgfQoKICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnMKICAgIC8vIGFyZSBmbHVzaGVkLiBUaGUgb25s" +
        "eSB3YXkgdG8gZG8gaXQgd2hlbiBhdmFpbF9vdXQgPSAwIC0gcnVuIG9uZSBtb3JlCiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JV" +
        "Rl9FUlJPUi4KICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LgogICAgLy8KICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRo" +
        "aXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaAogICAgLy8gbG9naWMuCiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICBhbGxvd0J1ZkVycm9y" +
        "ID0gdHJ1ZTsKICAgIH0KCiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTsKCiAgaWYgKHN0YXR1cyA9PT0g" +
        "Yy5aX1NUUkVBTV9FTkQpIHsKICAgIF9tb2RlID0gYy5aX0ZJTklTSDsKICB9CgogIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLgogIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkgewogICAgc3RhdHVz" +
        "ID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTsKICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgcmV0dXJuIHN0YXR1cyA9PT0gYy5aX09LOwogIH0K" +
        "CiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC4KICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7CiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7CiAgICBzdHJtLmF2YWls" +
        "X291dCA9IDA7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB0cnVlOwp9OwoKCi8qKgogKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZAogKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0" +
        "cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kcwogKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rCiAqICAgd2lsbCBi" +
        "ZSBzdHJpbmcuCiAqCiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlCiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxl" +
        "ciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuCiAqKi8KSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7CiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7Cn07CgoKLyoq" +
        "CiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkCiAqIC0gc3RhdHVzIChOdW1iZXIpOiBpbmZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcywKICogICBvdGhlciBpZiBub3QuCiAqCiAqIENh" +
        "bGxlZCBlaXRoZXIgYWZ0ZXIgeW91IHRlbGwgaW5mbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXMKICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKQog" +
        "KiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcywKICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy4KICoq" +
        "LwpJbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAvLyBPbiBzdWNjZXNzIC0gam9pbgogIGlmIChzdGF0dXMgPT09IGMuWl9PSykgewogICAgaWYgKHRoaXMub3B0aW9ucy50" +
        "byA9PT0gJ3N0cmluZycpIHsKICAgICAgLy8gR2x1ZSAmIGNvbnZlcnQgaGVyZSwgdW50aWwgd2UgdGVhY2ggcGFrbyB0byBzZW5kCiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGEKICAg" +
        "ICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7CiAgICB9CiAgfQogIHRo" +
        "aXMuY2h1bmtzID0gW107CiAgdGhpcy5lcnIgPSBzdGF0dXM7CiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnOwp9OwoKCi8qKgogKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJh" +
        "eXxTdHJpbmcKICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy4KICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy4KICoK" +
        "ICogRGVjb21wcmVzcyBgZGF0YWAgd2l0aCBpbmZsYXRlL3VuZ3ppcCBhbmQgYG9wdGlvbnNgLiBBdXRvZGV0ZWN0CiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3" +
        "ZSBkb24ndCBwcm92aWRlCiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC4KICoKICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOgogKgogKiAtIHdpbmRvd0JpdHMKICoKICogW2h0dHA6Ly96bGliLm5ldC9tYW51" +
        "YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKQogKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogU3VnYXIgKG9wdGlvbnMpOgogKgogKiAtIGByYXdgIChC" +
        "b29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5CiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LgogKiAtIGB0b2Ag" +
        "KFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWQKICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcg" +
        "b3V0cHV0IHJlcXVlc3RlZCwKICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC4KICoKICoKICogIyMjIyMgRXhhbXBsZToKICoKICogYGBg" +
        "amF2YXNjcmlwdAogKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKQogKiAgICwgaW5wdXQgPSBwYWtvLmRlZmxhdGUoWzEsMiwzLDQsNSw2LDcsOCw5XSkKICogICAsIG91dHB1dDsKICoKICogdHJ5IHsKICog" +
        "ICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpOwogKiB9IGNhdGNoIChlcnIpCiAqICAgY29uc29sZS5sb2coZXJyKTsKICogfQogKiBgYGAKICoqLwpmdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25z" +
        "KSB7CiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7CgogIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpOwoKICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNo" +
        "ZWF0IHdpdGggb3B0aW9ucyA6KQogIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1zZ1tpbmZsYXRvci5lcnJdOyB9CgogIHJldHVybiBpbmZsYXRvci5yZXN1bHQ7Cn0KCgovKioK" +
        "ICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nCiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3Mu" +
        "CiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuCiAqCiAqIFRoZSBzYW1lIGFzIFtbaW5mbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyCiAqICho" +
        "ZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS4KICoqLwpmdW5jdGlvbiBpbmZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgb3B0aW9ucy5yYXcgPSB0cnVlOwogIHJl" +
        "dHVybiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKTsKfQoKCi8qKgogKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZwogKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8" +
        "U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLgogKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLgogKgogKiBKdXN0IHNob3J0Y3V0IHRvIFtbaW5mbGF0ZV1dLCBiZWNh" +
        "dXNlIGl0IGF1dG9kZXRlY3RzIGZvcm1hdAogKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuCiAqKi8KCgpleHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlOwpleHBvcnRzLmluZmxhdGUg" +
        "PSBpbmZsYXRlOwpleHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3OwpleHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlOwoKfSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96" +
        "bGliL2NvbnN0YW50cyI6NDQsIi4vemxpYi9nemhlYWRlciI6NDcsIi4vemxpYi9pbmZsYXRlIjo0OSwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDE6W2Z1bmN0aW9uKHJlcXVp" +
        "cmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CgoKdmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmCiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQx" +
        "NkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYKICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpOwoKCmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20x" +
        "LCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7CiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkgewogICAgdmFyIHNv" +
        "dXJjZSA9IHNvdXJjZXMuc2hpZnQoKTsKICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9CgogICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Io" +
        "c291cmNlICsgJ211c3QgYmUgbm9uLW9iamVjdCcpOwogICAgfQoKICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7CiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICBvYmpbcF0g" +
        "PSBzb3VyY2VbcF07CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBvYmo7Cn07CgoKLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weQpleHBvcnRzLnNocmlua0J1ZiA9IGZ1bmN0aW9u" +
        "IChidWYsIHNpemUpIHsKICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9CiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9CiAgYnVmLmxl" +
        "bmd0aCA9IHNpemU7CiAgcmV0dXJuIGJ1ZjsKfTsKCgp2YXIgZm5UeXBlZCA9IHsKICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7CiAgICBpZiAoc3Jj" +
        "LnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHsKICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAg" +
        "IC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTsKICAgIH0K" +
        "ICB9LAogIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS4KICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7CiAgICB2YXIgaSwgbCwgbGVuLCBwb3MsIGNodW5rLCByZXN1" +
        "bHQ7CgogICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoCiAgICBsZW4gPSAwOwogICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgbGVuICs9IGNodW5rc1tpXS5s" +
        "ZW5ndGg7CiAgICB9CgogICAgLy8gam9pbiBjaHVua3MKICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7CiAgICBwb3MgPSAwOwogICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBs" +
        "OyBpKyspIHsKICAgICAgY2h1bmsgPSBjaHVua3NbaV07CiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7CiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9" +
        "Cn07Cgp2YXIgZm5VbnR5cGVkID0gewogIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK" +
        "ICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldOwogICAgfQogIH0sCiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LgogIGZsYXR0ZW5DaHVua3M6IGZ1" +
        "bmN0aW9uIChjaHVua3MpIHsKICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7CiAgfQp9OwoKCi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nCi8vCmV4" +
        "cG9ydHMuc2V0VHlwZWQgPSBmdW5jdGlvbiAob24pIHsKICBpZiAob24pIHsKICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5OwogICAgZXhwb3J0cy5CdWYxNiA9IFVpbnQxNkFycmF5OwogICAgZXhwb3J0" +
        "cy5CdWYzMiA9IEludDMyQXJyYXk7CiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTsKICB9IGVsc2UgewogICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5OwogICAgZXhwb3J0cy5CdWYxNiA9IEFy" +
        "cmF5OwogICAgZXhwb3J0cy5CdWYzMiA9IEFycmF5OwogICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTsKICB9Cn07CgpleHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTsKCn0se31dLDQyOltm" +
        "dW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVycwondXNlIHN0cmljdCc7CgoKdmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTsKCgovLyBR" +
        "dWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uCi8vCi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yCi8vIC0gYXBwbHkoVWlu" +
        "dDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnkKLy8KdmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7CnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTsKCnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUu" +
        "YXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfQp0cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBj" +
        "YXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9CgoKLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSkKLy8gTm90ZSwgdGhh" +
        "dCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsCi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZgp2" +
        "YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpOwpmb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7CiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAy" +
        "NDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7Cn0KX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0CgoKLy8gY29udmVydCBz" +
        "dHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKQpleHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7CiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxl" +
        "bmd0aCwgYnVmX2xlbiA9IDA7CgogIC8vIGNvdW50IGJpbmFyeSBzaXplCiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykgewogICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTsK" +
        "ICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHsKICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICBpZiAoKGMyICYgMHhmYzAw" +
        "KSA9PT0gMHhkYzAwKSB7CiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7CiAgICAgICAgbV9wb3MrKzsKICAgICAgfQogICAgfQogICAgYnVmX2xlbiAr" +
        "PSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDsKICB9CgogIC8vIGFsbG9jYXRlIGJ1ZmZlcgogIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pOwoKICAvLyBj" +
        "b252ZXJ0CiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykgewogICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTsKICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAm" +
        "JiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHsKICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7CiAgICAgICAgYyA9IDB4MTAw" +
        "MDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7CiAgICAgICAgbV9wb3MrKzsKICAgICAgfQogICAgfQogICAgaWYgKGMgPCAweDgwKSB7CiAgICAgIC8qIG9uZSBieXRlICovCiAgICAg" +
        "IGJ1ZltpKytdID0gYzsKICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7CiAgICAgIC8qIHR3byBieXRlcyAqLwogICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7CiAgICAgIGJ1ZltpKytdID0gMHg4" +
        "MCB8IChjICYgMHgzZik7CiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7CiAgICAgIC8qIHRocmVlIGJ5dGVzICovCiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7CiAgICAgIGJ1ZltpKytd" +
        "ID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7CiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7CiAgICB9IGVsc2UgewogICAgICAvKiBmb3VyIGJ5dGVzICovCiAgICAgIGJ1ZltpKytdID0gMHhm" +
        "MCB8IChjID4+PiAxOCk7CiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpOwogICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpOwogICAgICBidWZbaSsrXSA9IDB4" +
        "ODAgfCAoYyAmIDB4M2YpOwogICAgfQogIH0KCiAgcmV0dXJuIGJ1ZjsKfTsKCi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcykKZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikgewogIC8vIHVzZSBm" +
        "YWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvdwogIGlmIChsZW4gPCA2NTUzNykgewogICAgaWYgKChidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX1VJQV9PSykgfHwgKCFidWYu" +
        "c3ViYXJyYXkgJiYgU1RSX0FQUExZX09LKSkgewogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTsKICAgIH0KICB9CgogIHZhciBy" +
        "ZXN1bHQgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CgoKLy8gQ29u" +
        "dmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmcKZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZikgewogIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7Cn07CgoK" +
        "Ly8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSkKZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikgewogIHZhciBidWYgPSBuZXcgdXRpbHMuQnVmOChzdHIu" +
        "bGVuZ3RoKTsKICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTsKICB9CiAgcmV0dXJuIGJ1ZjsKfTsKCgovLyBj" +
        "b252ZXJ0IGFycmF5IHRvIHN0cmluZwpleHBvcnRzLmJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHsKICB2YXIgaSwgb3V0LCBjLCBjX2xlbjsKICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7" +
        "CgogIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcikKICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3IKICAv" +
        "LyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LgogIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTsKCiAgZm9yIChvdXQgPSAwLCBpID0gMDsgaSA8IGxlbjsp" +
        "IHsKICAgIGMgPSBidWZbaSsrXTsKICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWkKICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfQoKICAgIGNfbGVuID0gX3V0Zjhs" +
        "ZW5bY107CiAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXMKICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH0KCiAgICAvLyBh" +
        "cHBseSBtYXNrIG9uIGZpcnN0IGJ5dGUKICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNzsKICAgIC8vIGpvaW4gdGhlIHJlc3QKICAgIHdoaWxlIChjX2xlbiA+" +
        "IDEgJiYgaSA8IGxlbikgewogICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTsKICAgICAgY19sZW4tLTsKICAgIH0KCiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/CiAgICBp" +
        "ZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgY29udGludWU7IH0KCiAgICBpZiAoYyA8IDB4MTAwMDApIHsKICAgICAgdXRmMTZidWZbb3V0KytdID0gYzsKICAgIH0gZWxzZSB7CiAg" +
        "ICAgIGMgLT0gMHgxMDAwMDsKICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTsKICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7CiAg" +
        "ICB9CiAgfQoKICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTsKfTsKCgovLyBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHBvc2l0aW9uIGluIHV0ZjggYnVmZmVyLAovLyB0aGF0IHdpbGwgbm90" +
        "IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlCi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuCi8vCi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheQov" +
        "LyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTsKZXhwb3J0cy51dGY4Ym9yZGVyID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7CiAgdmFyIHBvczsKCiAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7CiAg" +
        "aWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfQoKICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmQKICBwb3MgPSBtYXgg" +
        "LSAxOwogIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfQoKICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsCiAgLy8gcmV0" +
        "dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuCiAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfQoKICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAt" +
        "IHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCwKICAvLyByZXR1cm4gbWF4IHRvby4KICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH0KCiAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9z" +
        "XV0gPiBtYXgpID8gcG9zIDogbWF4Owp9OwoKfSx7Ii4vY29tbW9uIjo0MX1dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKLy8gTm90ZTogYWRsZXIzMiB0YWtl" +
        "cyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LgovLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLgovLyBTbWFsbCBzaXpl" +
        "IGlzIHByZWZlcmFibGUuCgovLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8K" +
        "Ly8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBs" +
        "aWFibGUgZm9yIGFueSBkYW1hZ2VzCi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vCi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdh" +
        "cmUgZm9yIGFueSBwdXJwb3NlLAovLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUg" +
        "Zm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLy8KLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlv" +
        "dSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlv" +
        "biB3b3VsZCBiZQovLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qg" +
        "bm90IGJlCi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3Vy" +
        "Y2UgZGlzdHJpYnV0aW9uLgoKZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykgewogIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsCiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYg" +
        "MHhmZmZmKSB8MCwKICAgICAgbiA9IDA7CgogIHdoaWxlIChsZW4gIT09IDApIHsKICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwCiAgICAvLyBzMiBpbiAzMS1iaXRzLCBi" +
        "ZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLgogICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuCiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47CiAgICBsZW4gLT0gbjsKCiAgICBkbyB7" +
        "CiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7CiAgICAgIHMyID0gKHMyICsgczEpIHwwOwogICAgfSB3aGlsZSAoLS1uKTsKCiAgICBzMSAlPSA2NTUyMTsKICAgIHMyICU9IDY1NTIxOwogIH0KCiAg" +
        "cmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwOwp9CgoKbW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyOwoKfSx7fV0sNDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7Cgov" +
        "LyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBp" +
        "cyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1h" +
        "Z2VzCi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vCi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3Nl" +
        "LAovLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0" +
        "aW9uczoKLy8KLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2lu" +
        "YWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQovLyAgIGFw" +
        "cHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi8vICAgbWlzcmVw" +
        "cmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoK" +
        "bW9kdWxlLmV4cG9ydHMgPSB7CgogIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KICBaX05PX0ZMVVNIOiAgICAgICAgIDAs" +
        "CiAgWl9QQVJUSUFMX0ZMVVNIOiAgICAxLAogIFpfU1lOQ19GTFVTSDogICAgICAgMiwKICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsCiAgWl9GSU5JU0g6ICAgICAgICAgICA0LAogIFpfQkxPQ0s6ICAgICAgICAg" +
        "ICAgNSwKICBaX1RSRUVTOiAgICAgICAgICAgIDYsCgogIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKICAqIGFyZSBl" +
        "cnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KICAqLwogIFpfT0s6ICAgICAgICAgICAgICAgMCwKICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsCiAg" +
        "Wl9ORUVEX0RJQ1Q6ICAgICAgICAyLAogIFpfRVJSTk86ICAgICAgICAgICAtMSwKICBaX1NUUkVBTV9FUlJPUjogICAgLTIsCiAgWl9EQVRBX0VSUk9SOiAgICAgIC0zLAogIC8vWl9NRU1fRVJST1I6ICAgICAt" +
        "NCwKICBaX0JVRl9FUlJPUjogICAgICAgLTUsCiAgLy9aX1ZFUlNJT05fRVJST1I6IC02LAoKICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KICBaX05PX0NPTVBSRVNTSU9OOiAgICAgICAgIDAsCiAgWl9CRVNU" +
        "X1NQRUVEOiAgICAgICAgICAgICAxLAogIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSwKICBaX0RFRkFVTFRfQ09NUFJFU1NJT046ICAgLTEsCgoKICBaX0ZJTFRFUkVEOiAgICAgICAgICAgICAgIDEsCiAg" +
        "Wl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLAogIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMywKICBaX0ZJWEVEOiAgICAgICAgICAgICAgICAgIDQsCiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAw" +
        "LAoKICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLAogIFpfVEVYVDogICAgICAg" +
        "ICAgICAgICAgICAgMSwKICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKQogIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMiwKCiAgLyogVGhlIGRlZmxhdGUg" +
        "Y29tcHJlc3Npb24gbWV0aG9kICovCiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4CiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5n" +
        "IG9uIHZhciB0eXBlCn07Cgp9LHt9XSw0NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29z" +
        "dCBoZXJlLgovLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzCi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuCgovLyAoQykgMTk5NS0yMDEzIEpl" +
        "YW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMn" +
        "LCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi8vIGFyaXNpbmcgZnJv" +
        "bSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vCi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAovLyBpbmNsdWRpbmcgY29t" +
        "bWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLy8KLy8gMS4gVGhl" +
        "IG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlv" +
        "dSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQovLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBu" +
        "b3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcg" +
        "dGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKLy8gVXNlIG9yZGluYXJ5IGFy" +
        "cmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmUKZnVuY3Rpb24gbWFrZVRhYmxlKCkgewogIHZhciBjLCB0YWJsZSA9IFtdOwoKICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7CiAg" +
        "ICBjID0gbjsKICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7CiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7CiAgICB9CiAgICB0YWJsZVtu" +
        "XSA9IGM7CiAgfQoKICByZXR1cm4gdGFibGU7Cn0KCi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uCnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgp" +
        "OwoKCmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykgewogIHZhciB0ID0gY3JjVGFibGUsCiAgICAgIGVuZCA9IHBvcyArIGxlbjsKCiAgY3JjIF49IC0xOwoKICBmb3IgKHZhciBpID0gcG9zOyBp" +
        "IDwgZW5kOyBpKyspIHsKICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdOwogIH0KCiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7Cn0KCgptb2R1bGUuZXhwb3J0" +
        "cyA9IGNyYzMyOwoKfSx7fV0sNDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CgovLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIK" +
        "Ly8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxp" +
        "ZWQKLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8v" +
        "Ci8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAovLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBh" +
        "bHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLy8KLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qg" +
        "bm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEg" +
        "cHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQovLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291" +
        "cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBU" +
        "aGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKdmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTsKdmFyIHRy" +
        "ZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7CnZhciBhZGxlcjMyID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7CnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpOwp2YXIgbXNnICAgICA9IHJlcXVpcmUo" +
        "Jy4vbWVzc2FnZXMnKTsKCi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qID09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBm" +
        "b3IgZGV0YWlscyAqLwp2YXIgWl9OT19GTFVTSCAgICAgID0gMDsKdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7Ci8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7CnZhciBaX0ZVTExfRkxVU0ggICAgPSAzOwp2YXIg" +
        "Wl9GSU5JU0ggICAgICAgID0gNDsKdmFyIFpfQkxPQ0sgICAgICAgICA9IDU7Ci8vdmFyIFpfVFJFRVMgICAgICAgICA9IDY7CgoKLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVz" +
        "c2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlcwogKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCiAqLwp2YXIgWl9PSyAgICAg" +
        "ICAgICAgID0gMDsKdmFyIFpfU1RSRUFNX0VORCAgICA9IDE7Ci8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7Ci8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xOwp2YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7CnZh" +
        "ciBaX0RBVEFfRVJST1IgICAgPSAtMzsKLy92YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7CnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTsKLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7CgoKLyogY29tcHJlc3Np" +
        "b24gbGV2ZWxzICovCi8vdmFyIFpfTk9fQ09NUFJFU1NJT04gICAgICA9IDA7Ci8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7Ci8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7CnZhciBaX0RF" +
        "RkFVTFRfQ09NUFJFU1NJT04gPSAtMTsKCgp2YXIgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTsKdmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7CnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzOwp2" +
        "YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDsKdmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7CgovKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZs" +
        "YXRlKCkpICovCi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7Ci8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7Ci8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhU" +
        "CnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyOwoKCi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqLwp2YXIgWl9ERUZMQVRFRCAgPSA4OwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgp2YXIgTUFYX01FTV9MRVZFTCA9IDk7Ci8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJ" +
        "bml0MiAqLwp2YXIgTUFYX1dCSVRTID0gMTU7Ci8qIDMySyBMWjc3IHdpbmRvdyAqLwp2YXIgREVGX01FTV9MRVZFTCA9IDg7CgoKdmFyIExFTkdUSF9DT0RFUyAgPSAyOTsKLyogbnVtYmVyIG9mIGxlbmd0aCBj" +
        "b2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCnZhciBMSVRFUkFMUyAgICAgID0gMjU2OwovKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi8KdmFyIExfQ09E" +
        "RVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7Ci8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwp2YXIgRF9DT0RF" +
        "UyAgICAgICA9IDMwOwovKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KdmFyIEJMX0NPREVTICAgICAgPSAxOTsKLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhz" +
        "ICovCnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxOwovKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLwp2YXIgTUFYX0JJVFMgID0gMTU7Ci8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJ" +
        "VFMgYml0cyAqLwoKdmFyIE1JTl9NQVRDSCA9IDM7CnZhciBNQVhfTUFUQ0ggPSAyNTg7CnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpOwoKdmFyIFBSRVNFVF9ESUNUID0g" +
        "MHgyMDsKCnZhciBJTklUX1NUQVRFID0gNDI7CnZhciBFWFRSQV9TVEFURSA9IDY5Owp2YXIgTkFNRV9TVEFURSA9IDczOwp2YXIgQ09NTUVOVF9TVEFURSA9IDkxOwp2YXIgSENSQ19TVEFURSA9IDEwMzsKdmFy" +
        "IEJVU1lfU1RBVEUgPSAxMTM7CnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7Cgp2YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBv" +
        "dXRwdXQgKi8KdmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovCnZhciBCU19GSU5JU0hfU1RBUlRFRCA9IDM7IC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkg" +
        "bW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovCnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi8KCnZhciBPU19DT0RF" +
        "ID0gMHgwMzsgLy8gVW5peCA6KSAuIERvbid0IGRldGVjdCwgdXNlIHRoaXMgZGVmYXVsdC4KCmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHsKICBzdHJtLm1zZyA9IG1zZ1tlcnJvckNvZGVdOwogIHJl" +
        "dHVybiBlcnJvckNvZGU7Cn0KCmZ1bmN0aW9uIHJhbmsoZikgewogIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7Cn0KCmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVu" +
        "Z3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT0KICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lcwogKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMg" +
        "bWF5IHdpc2ggdG8gbW9kaWZ5IGl0CiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCiAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4K" +
        "ICovCmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkgewogIHZhciBzID0gc3RybS5zdGF0ZTsKCiAgLy9fdHJfZmx1c2hfYml0cyhzKTsKICB2YXIgbGVuID0gcy5wZW5kaW5nOwogIGlmIChsZW4gPiBzdHJt" +
        "LmF2YWlsX291dCkgewogICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7CiAgfQogIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9CgogIHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzLnBlbmRpbmdfYnVmLCBz" +
        "LnBlbmRpbmdfb3V0LCBsZW4sIHN0cm0ubmV4dF9vdXQpOwogIHN0cm0ubmV4dF9vdXQgKz0gbGVuOwogIHMucGVuZGluZ19vdXQgKz0gbGVuOwogIHN0cm0udG90YWxfb3V0ICs9IGxlbjsKICBzdHJtLmF2YWls" +
        "X291dCAtPSBsZW47CiAgcy5wZW5kaW5nIC09IGxlbjsKICBpZiAocy5wZW5kaW5nID09PSAwKSB7CiAgICBzLnBlbmRpbmdfb3V0ID0gMDsKICB9Cn0KCgpmdW5jdGlvbiBmbHVzaF9ibG9ja19vbmx5KHMsIGxh" +
        "c3QpIHsKICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTsKICBzLmJsb2Nr" +
        "X3N0YXJ0ID0gcy5zdHJzdGFydDsKICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7Cn0KCgpmdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7CiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiOwp9CgoKLyogPT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQg" +
        "dmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci4KICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCiAqIHBlbmRpbmdfYnVmLgogKi8K" +
        "ZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikgewovLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpOwovLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7CiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRp" +
        "bmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmOwogIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYiAmIDB4ZmY7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgogKiBhbmQgdG90YWwgbnVtYmVy" +
        "IG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAogKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZAog" +
        "KiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuCiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgogKi8KZnVuY3Rpb24gcmVhZF9idWYoc3RybSwg" +
        "YnVmLCBzdGFydCwgc2l6ZSkgewogIHZhciBsZW4gPSBzdHJtLmF2YWlsX2luOwoKICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9CiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gMDsgfQoKICBzdHJt" +
        "LmF2YWlsX2luIC09IGxlbjsKCiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7CiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpOwog" +
        "IGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHsKICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7CiAgfQoKICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09" +
        "IDIpIHsKICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpOwogIH0KCiAgc3RybS5uZXh0X2luICs9IGxlbjsKICBzdHJtLnRvdGFsX2luICs9IGxlbjsKCiAgcmV0dXJu" +
        "IGxlbjsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdl" +
        "c3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLAog" +
        "KiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCiAqIGdhcmJhZ2UuCiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVh" +
        "ZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnQKICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQogKiBPVVQg" +
        "YXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLgogKi8KZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHsKICB2YXIgY2hhaW5fbGVu" +
        "Z3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqLwogIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KICB2YXIgbWF0Y2g7ICAg" +
        "ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLwogIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KICB2YXIgYmVzdF9s" +
        "ZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovCiAgdmFyIG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYg" +
        "bWF0Y2ggbG9uZyBlbm91Z2ggKi8KICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/CiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FI" +
        "RUFEKSA6IDAvKk5JTCovOwoKICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dAoKICB2YXIgd21hc2sgPSBzLndfbWFzazsKICB2YXIgcHJldiAgPSBzLnByZXY7CgogIC8qIFN0b3Agd2hlbiBjdXJf" +
        "bWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsCiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4KICAgKi8KCiAgdmFyIHN0" +
        "cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdOwogIHZhciBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dOwoK" +
        "ICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6" +
        "YXRpb24gaWYgbmVjZXNzYXJ5LgogICAqLwogIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CgogIC8qIERvIG5vdCB3YXN0ZSB0b28g" +
        "bXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovCiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7CiAgICBjaGFpbl9sZW5ndGggPj49IDI7CiAgfQogIC8qIERv" +
        "IG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnkKICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy4KICAgKi8KICBpZiAobmlj" +
        "ZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfQoKICAvLyBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVl" +
        "ZCBsb29rYWhlYWQiKTsKCiAgZG8gewogICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CiAgICBtYXRjaCA9IGN1cl9tYXRjaDsKCiAgICAvKiBTa2lwIHRvIG5leHQg" +
        "bWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvdwogICAg" +
        "ICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlCiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdp" +
        "bGwgYmUgYWNjZXNzZWQsIGFuZAogICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy4KICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUg" +
        "bWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzbwogICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCiAgICAgKi8K" +
        "CiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fAogICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHwKICAgICAgICBfd2luW21h" +
        "dGNoXSAgICAgICAgICAgICAgICAhPT0gX3dpbltzY2FuXSB8fAogICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkgewogICAgICBjb250aW51ZTsKICAgIH0KCiAg" +
        "ICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQogICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEg" +
        "d2luLikKICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVz" +
        "IG1hdGNoLCBnaXZlbiB0aGF0CiAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KICAgICAqLwogICAgc2NhbiArPSAyOwogICAgbWF0Y2grKzsKICAgIC8vIEFz" +
        "c2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKCiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOwogICAgICogdGhlIDI1" +
        "NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCiAgICAgKi8KICAgIGRvIHsKICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovCiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93" +
        "aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmCiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysr" +
        "bWF0Y2hdICYmCiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmCiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09" +
        "IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmCiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKCiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2ln" +
        "bmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwoKICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTsKICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CgogICAgaWYgKGxl" +
        "biA+IGJlc3RfbGVuKSB7CiAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CiAgICAgIGJlc3RfbGVuID0gbGVuOwogICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHsKICAgICAgICBicmVhazsKICAg" +
        "ICAgfQogICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTsKICAgICAgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTsKICAgIH0KICB9IHdoaWxlICgoY3VyX21hdGNo" +
        "ID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApOwoKICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHsKICAgIHJldHVybiBiZXN0X2xlbjsKICB9" +
        "CiAgcmV0dXJuIHMubG9va2FoZWFkOwp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEZpbGwgdGhlIHdp" +
        "bmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC4KICoKICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9P" +
        "S0FIRUFECiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFECiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7" +
        "IHJlYWRzIGFyZQogKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbAogKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJl" +
        "KS4KICovCmZ1bmN0aW9uIGZpbGxfd2luZG93KHMpIHsKICB2YXIgX3dfc2l6ZSA9IHMud19zaXplOwogIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7CgogIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09L" +
        "QUhFQUQsICJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWQiKTsKCiAgZG8gewogICAgbW9yZSA9IHMud2luZG93X3NpemUgLSBzLmxvb2thaGVhZCAtIHMuc3Ryc3RhcnQ7CgogICAgLy8gSlMgaW50cyBoYXZlIDMy" +
        "IGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZAogICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi8KICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHsKICAgIC8vICAgIGlmIChtb3JlID09IDAg" +
        "JiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkgewogICAgLy8gICAgICAgIG1vcmUgPSB3c2l6ZTsKICAgIC8vCiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEp" +
        "KSB7CiAgICAvLyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmCiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAo" +
        "aW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSkKICAgIC8vICAgICAgICAgKi8KICAgIC8vICAgICAgICBtb3JlLS07CiAgICAvLyAgICB9CiAgICAvL30KCgogICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3Qg" +
        "ZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCiAg" +
        "ICAgKi8KICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7CgogICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93" +
        "X3NpemUsIDApOwogICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7CiAgICAgIHMuc3Ryc3RhcnQgLT0gX3dfc2l6ZTsKICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi8KICAg" +
        "ICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplOwoKICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzCiAgICAgICBhdCB0aGUgZXhwZW5zZSBv" +
        "ZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMAogICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMAog" +
        "ICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2Fs" +
        "IGNhc2UuKQogICAgICAgKi8KCiAgICAgIG4gPSBzLmhhc2hfc2l6ZTsKICAgICAgcCA9IG47CiAgICAgIGRvIHsKICAgICAgICBtID0gcy5oZWFkWy0tcF07CiAgICAgICAgcy5oZWFkW3BdID0gKG0gPj0gX3df" +
        "c2l6ZSA/IG0gLSBfd19zaXplIDogMCk7CiAgICAgIH0gd2hpbGUgKC0tbik7CgogICAgICBuID0gX3dfc2l6ZTsKICAgICAgcCA9IG47CiAgICAgIGRvIHsKICAgICAgICBtID0gcy5wcmV2Wy0tcF07CiAgICAg" +
        "ICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7CiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKICAgICAg" +
        "ICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgogICAgICAgICAqLwogICAgICB9IHdoaWxlICgtLW4pOwoKICAgICAgbW9yZSArPSBfd19zaXplOwogICAgfQogICAgaWYgKHMuc3RybS5hdmFpbF9p" +
        "biA9PT0gMCkgewogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1J" +
        "Tl9MT09LQUhFQUQgLSAxICYmCiAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0x" +
        "ICsgV1NJWkUgKyBNQVhfRElTVC0xKQogICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyCiAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVk" +
        "KSwKICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmCiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5f" +
        "TE9PS0FIRUFELgogICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwg" +
        "Y2FzZXMsIG1vcmUgPj0gMi4KICAgICAqLwogICAgLy9Bc3NlcnQobW9yZSA+PSAyLCAibW9yZSA8IDIiKTsKICAgIG4gPSByZWFkX2J1ZihzLnN0cm0sIHMud2luZG93LCBzLnN0cnN0YXJ0ICsgcy5sb29rYWhl" +
        "YWQsIG1vcmUpOwogICAgcy5sb29rYWhlYWQgKz0gbjsKCiAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi8KICAgIGlmIChzLmxvb2thaGVhZCAr" +
        "IHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkgewogICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7CiAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdOwoKICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+" +
        "aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovCiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIDFdKSAmIHMuaGFzaF9tYXNrOwovLyNpZiBNSU5f" +
        "TUFUQ0ggIT0gMwovLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKLy8jZW5kaWYKICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7CiAgICAgICAgLyogVVBEQVRFX0hBU0go" +
        "cywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqLwogICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAt" +
        "IDFdKSAmIHMuaGFzaF9tYXNrOwoKICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjsKICAgICAgICBzdHIrKzsKICAg" +
        "ICAgICBzLmluc2VydC0tOwogICAgICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0IDwgTUlOX01BVENIKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qIElmIHRo" +
        "ZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVz" +
        "IHdpbGwgYmUgZW1pdHRlZC4KICAgICAqLwoKICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTsKCiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVz" +
        "IGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW4KICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJl" +
        "cG9ydHMgb2YKICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnkKICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVw" +
        "ZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dAogICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaAogICAq" +
        "IHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuCiAgICovCi8vICBpZiAocy5oaWdoX3dhdGVyIDwgcy53aW5kb3dfc2l6ZSkgewovLyAg" +
        "ICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDsKLy8gICAgdmFyIGluaXQgPSAwOwovLwovLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3VycikgewovLyAgICAgIC8qIFByZXZpb3VzIGhpZ2gg" +
        "d2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVAovLyAgICAgICAqIGJ5dGVzIG9yIHVwIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLgovLyAgICAgICAqLwov" +
        "LyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3VycjsKLy8gICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKQovLyAgICAgICAgaW5pdCA9IFdJTl9JTklUOwovLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyAr" +
        "IGN1cnIsICh1bnNpZ25lZClpbml0KTsKLy8gICAgICBzLT5oaWdoX3dhdGVyID0gY3VyciArIGluaXQ7Ci8vICAgIH0KLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklU" +
        "KSB7Ci8vICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YQovLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8g" +
        "Y3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwCi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuCi8vICAgICAgICovCi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciAr" +
        "IFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjsKLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcikKLy8gICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hf" +
        "d2F0ZXI7Ci8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpOwovLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDsKLy8gICAgfQovLyAgfQovLwovLyAg" +
        "QXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUgLSBNSU5fTE9PS0FIRUFELAovLyAgICAibm90IGVub3VnaCByb29tIGZvciBzZWFyY2giKTsKfQoKLyogPT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0" +
        "IHN0cmVhbSwgcmV0dXJuCiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgogKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQogKiB1bmNv" +
        "bXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAogKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCiAqIE5PVEU6IHRoaXMg" +
        "ZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KICogd2luZG93IHRvIHBlbmRpbmdfYnVmLgogKi8KZnVuY3Rpb24gZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gp" +
        "IHsKICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZAogICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9j" +
        "ayBoYXMgYSA1IGJ5dGUgaGVhZGVyOgogICAqLwogIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjsKCiAgaWYgKG1heF9ibG9ja19zaXplID4gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNSkgewogICAgbWF4X2Js" +
        "b2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1OwogIH0KCiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLwogIGZvciAoOzspIHsKICAgIC8qIEZpbGwg" +
        "dGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqLwogICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHsKCiAgICAgIC8vQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8CiAg" +
        "ICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOwovLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09L" +
        "QUhFQUQpIHx8Ci8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkgewovLyAgICAgICAgdGhyb3cgIG5ldyBFcnJvcigic2xpZGUgdG9vIGxhdGUiKTsKLy8gICAgICB9CgogICAgICBmaWxsX3dp" +
        "bmRvdyhzKTsKICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQoKICAgICAgaWYgKHMubG9va2Fo" +
        "ZWFkID09PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgIH0KICAgIC8vQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCAiYmxvY2sg" +
        "Z29uZSIpOwovLyAgICBpZiAocy5ibG9ja19zdGFydCA8IDApIHRocm93IG5ldyBFcnJvcigiYmxvY2sgZ29uZSIpOwoKICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7CiAgICBzLmxvb2thaGVhZCA9IDA7" +
        "CgogICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOwoKICAgIGlm" +
        "IChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICov" +
        "CiAgICAgIHMubG9va2FoZWFkID0gcy5zdHJzdGFydCAtIG1heF9zdGFydDsKICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDsKICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqLwogICAgICBmbHVz" +
        "aF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICAgIC8qKiovCgoKICAgIH0KICAg" +
        "IC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZQogICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKICAgICAqLwog" +
        "ICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7CiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi8KICAgICAgZmx1c2hfYmxvY2tf" +
        "b25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgICAvKioqLwogICAgfQogIH0KCiAgcy5pbnNl" +
        "cnQgPSAwOwoKICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7CiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovCiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgaWYgKHMuc3RybS5hdmFp" +
        "bF9vdXQgPT09IDApIHsKICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEOwogICAgfQogICAgLyoqKi8KICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTsKICB9CgogIGlmIChzLnN0cnN0YXJ0ID4gcy5ibG9j" +
        "a19zdGFydCkgewogICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqLwogICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICByZXR1" +
        "cm4gQlNfTkVFRF9NT1JFOwogICAgfQogICAgLyoqKi8KICB9CgogIHJldHVybiBCU19ORUVEX01PUkU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PQogKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50CiAqIGJsb2NrIHN0YXRlLgogKiBUaGlz" +
        "IGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0" +
        "cmluZ3Mgb3IgZm9yIHNob3J0CiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KICovCmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkgewog" +
        "IHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCiAgdmFyIGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwoK" +
        "ICBmb3IgKDs7KSB7CiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQg" +
        "TUFYX01BVENIIGJ5dGVzCiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCiAg" +
        "ICAgKi8KICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpf" +
        "Tk9fRkxVU0gpIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9j" +
        "ayAqLwogICAgICB9CiAgICB9CgogICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQogICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQg" +
        "dG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CiAgICAgKi8KICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovOwogICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkgewogICAgICAvKioqIElOU0VSVF9T" +
        "VFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqLwogICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0p" +
        "ICYgcy5oYXNoX21hc2s7CiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0Owog" +
        "ICAgICAvKioqLwogICAgfQoKICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1h" +
        "dGNoX2xlbmd0aCA8IE1JTl9NQVRDSAogICAgICovCiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiAoKHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQpIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQp" +
        "KSkgewogICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZwogICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZl" +
        "IHRvIGF2b2lkIGEgbWF0Y2gKICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgogICAgICAgKi8KICAgICAgcy5tYXRjaF9sZW5ndGggPSBs" +
        "b25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7CiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCiAgICB9CiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CiAg" +
        "ICAgIC8vIGNoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoKTsgLy8gZm9yIGRlYnVnIG9ubHkKCiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJz" +
        "dGFydCAtIHMubWF0Y2hfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovCiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBz" +
        "LnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpOwoKICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CgogICAgICAvKiBJbnNlcnQgbmV3IHN0cmlu" +
        "Z3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCiAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCiAgICAg" +
        "ICAqLwogICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgICBzLm1hdGNoX2xl" +
        "bmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqLwogICAgICAgIGRvIHsKICAgICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBz" +
        "LnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovCiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5o" +
        "YXNoX21hc2s7CiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7" +
        "CiAgICAgICAgICAvKioqLwogICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZQogICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBh" +
        "aGVhZC4KICAgICAgICAgICAqLwogICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApOwogICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgfSBlbHNlCiAgICAgIHsKICAgICAgICBzLnN0cnN0" +
        "YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoOwogICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDsKICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07CiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5p" +
        "bnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovCiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNr" +
        "OwoKLy8jaWYgTUlOX01BVENIICE9IDMKLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKLy8jZW5kaWYKICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBN" +
        "SU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAogICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCiAgICAgICAg" +
        "ICovCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy53aW5kb3dbcy5zdHJzdGFydF0p" +
        "KTsKICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovCiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0" +
        "YXJ0XSk7CgogICAgICBzLmxvb2thaGVhZC0tOwogICAgICBzLnN0cnN0YXJ0Kys7CiAgICB9CiAgICBpZiAoYmZsdXNoKSB7CiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi8KICAgICAgZmx1c2hf" +
        "YmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgICAvKioqLwogICAgfQogIH0KICBz" +
        "Lmluc2VydCA9ICgocy5zdHJzdGFydCA8IChNSU5fTUFUQ0ggLSAxKSkgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMSk7CiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkgewogICAgLyoqKiBGTFVTSF9CTE9D" +
        "SyhzLCAxKTsgKioqLwogICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgIH0KICAg" +
        "IC8qKiovCiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgfQogIGlmIChzLmxhc3RfbGl0KSB7CiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovCiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNl" +
        "KTsKICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICB9CiAgICAvKioqLwogIH0KICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKfQoKLyogPT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24u" +
        "IFdlIHVzZSBhIGxhenkKICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpcwogKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2lu" +
        "ZG93IHBvc2l0aW9uLgogKi8KZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7CiAgdmFyIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCiAgdmFyIGJmbHVzaDsgICAg" +
        "ICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwoKICB2YXIgbWF4X2luc2VydDsKCiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCiAgZm9yICg7Oykgewog" +
        "ICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRl" +
        "cwogICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgogICAgICovCiAgICBpZiAo" +
        "cy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7CiAg" +
        "ICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgIH0KCiAgICAvKiBJ" +
        "bnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFp" +
        "bjoKICAgICAqLwogICAgaGFzaF9oZWFkID0gMC8qTklMKi87CiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hl" +
        "YWQpOyAqKiovCiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgaGFzaF9o" +
        "ZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7CiAgICAgIC8qKiovCiAgICB9CgogICAgLyogRmlu" +
        "ZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KICAgICAqLwogICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoOwogICAgcy5wcmV2X21hdGNoID0gcy5t" +
        "YXRjaF9zdGFydDsKICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKCiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJgog" +
        "ICAgICAgIHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkvKk1BWF9ESVNUKHMpKi8pIHsKICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQg" +
        "bWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBp" +
        "dHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KICAgICAgICovCiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpOwogICAgICAvKiBsb25nZXN0X21h" +
        "dGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLwoKICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiYKICAgICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfRklMVEVSRUQgfHwgKHMubWF0Y2hfbGVuZ3RoID09PSBN" +
        "SU5fTUFUQ0ggJiYgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQgPiA0MDk2LypUT09fRkFSKi8pKSkgewoKICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBp" +
        "cyBnYXJiYWdlCiAgICAgICAgICogYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS4KICAgICAgICAgKi8KICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAg" +
        "ICAgIH0KICAgIH0KICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAogICAgICogbWF0Y2ggaXMgbm90IGJldHRlciwgb3V0cHV0IHRoZSBwcmV2" +
        "aW91cyBtYXRjaDoKICAgICAqLwogICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHsKICAgICAgbWF4X2luc2VydCA9IHMuc3Ryc3Rh" +
        "cnQgKyBzLmxvb2thaGVhZCAtIE1JTl9NQVRDSDsKICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCgogICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ry" +
        "c3RhcnQtMSwgcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoKTsKCiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwKICAgICAgICAgICAgICAgICAgICAg" +
        "cy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsqKiovCiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAt" +
        "IE1JTl9NQVRDSCk7CiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgogICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUg" +
        "YWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90CiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW4KICAgICAgICogdGhlIGhhc2gg" +
        "dGFibGUuCiAgICAgICAqLwogICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTsKICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyOwogICAgICBkbyB7CiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8" +
        "PSBtYXhfaW5zZXJ0KSB7CiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqLwogICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hp" +
        "ZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRb" +
        "cy5pbnNfaF07CiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICAgICAgLyoqKi8KICAgICAgICB9CiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7CiAgICAg" +
        "IHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOwogICAgICBzLnN0cnN0YXJ0Kys7CgogICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgLyoqKiBGTFVT" +
        "SF9CTE9DSyhzLCAwKTsgKioqLwogICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9N" +
        "T1JFOwogICAgICAgIH0KICAgICAgICAvKioqLwogICAgICB9CgogICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkgewogICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3Vz" +
        "IHBvc2l0aW9uLCBvdXRwdXQgYQogICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoCiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhl" +
        "IHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuCiAgICAgICAqLwogICAgICAvL1RyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTsKICAgICAgLyoqKiBfdHJf" +
        "dGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi8KICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7CgogICAg" +
        "ICBpZiAoYmZsdXNoKSB7CiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi8KICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICAvKioqLwogICAgICB9CiAgICAg" +
        "IHMuc3Ryc3RhcnQrKzsKICAgICAgcy5sb29rYWhlYWQtLTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICB9IGVsc2Ug" +
        "ewogICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yCiAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgogICAgICAgKi8KICAgICAgcy5tYXRj" +
        "aF9hdmFpbGFibGUgPSAxOwogICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgIHMubG9va2FoZWFkLS07CiAgICB9CiAgfQogIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCAibm8gZmx1c2g/Iik7CiAgaWYg" +
        "KHMubWF0Y2hfYXZhaWxhYmxlKSB7CiAgICAvL1RyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTsKICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0" +
        "YXJ0LTFdLCBiZmx1c2gpOyAqKiovCiAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTsKCiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgfQogIHMu" +
        "aW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTsKICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7CiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEp" +
        "OyAqKiovCiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEOwogICAgfQogICAgLyoqKi8K" +
        "ICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTsKICB9CiAgaWYgKHMubGFzdF9saXQpIHsKICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi8KICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAg" +
        "aWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgIH0KICAgIC8qKiovCiAgfQoKICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKfQoKCi8qID09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBt" +
        "YXRjaGVzIG9ubHkgb2YgZGlzdGFuY2UKICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCiAqIGRlZmxhdGUgc3dpdGNo" +
        "ZXMgYXdheSBmcm9tIFpfUkxFLikKICovCmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7CiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNo" +
        "ZWQgKi8KICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZv" +
        "ciBsZW5ndGggb2YgcnVuICovCgogIHZhciBfd2luID0gcy53aW5kb3c7CgogIGZvciAoOzspIHsKICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAog" +
        "ICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKICAgICAqIGZvciB0aGUgbG9uZ2VzdCBydW4sIHBsdXMgb25lIGZvciB0aGUgdW5yb2xsZWQgbG9vcC4K" +
        "ICAgICAqLwogICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkgewogICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19G" +
        "TFVTSCkgewogICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgIH0KICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCiAgICB9" +
        "CgogICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi8KICAgIHMubWF0Y2hfbGVuZ3RoID0gMDsKICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5z" +
        "dHJzdGFydCA+IDApIHsKICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxOwogICAgICBwcmV2ID0gX3dpbltzY2FuXTsKICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysr" +
        "c2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7CiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDsKICAgICAgICBkbyB7CiAgICAgICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNl" +
        "Ki8KICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmCiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09" +
        "IF93aW5bKytzY2FuXSAmJgogICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYKICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nh" +
        "bl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmCiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7CiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7CiAg" +
        "ICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHsKICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vQXNzZXJ0KHNjYW4g" +
        "PD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwogICAgfQoKICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBl" +
        "bWl0IGxpdGVyYWwgKi8KICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLnN0cnN0YXJ0IC0gMSwgcy5tYXRjaF9sZW5ndGgp" +
        "OwoKICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqLwogICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMSwgcy5tYXRj" +
        "aF9sZW5ndGggLSBNSU5fTUFUQ0gpOwoKICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CiAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7CiAgICAgIHMubWF0Y2hfbGVuZ3RoID0g" +
        "MDsKICAgIH0gZWxzZSB7CiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOwogICAg" +
        "ICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi8KICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTsK" +
        "CiAgICAgIHMubG9va2FoZWFkLS07CiAgICAgIHMuc3Ryc3RhcnQrKzsKICAgIH0KICAgIGlmIChiZmx1c2gpIHsKICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqLwogICAgICBmbHVzaF9ibG9ja19v" +
        "bmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICAgIC8qKiovCiAgICB9CiAgfQogIHMuaW5zZXJ0" +
        "ID0gMDsKICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7CiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovCiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgaWYgKHMuc3RybS5hdmFpbF9v" +
        "dXQgPT09IDApIHsKICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEOwogICAgfQogICAgLyoqKi8KICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTsKICB9CiAgaWYgKHMubGFzdF9saXQpIHsKICAgIC8qKiog" +
        "RkxVU0hfQkxPQ0socywgMCk7ICoqKi8KICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAg" +
        "IH0KICAgIC8qKiovCiAgfQogIHJldHVybiBCU19CTE9DS19ET05FOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT0KICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuCiAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVu" +
        "IG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKQogKi8KZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7CiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJl" +
        "bnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCgogIGZvciAoOzspIHsKICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqLwogICAgaWYgKHMubG9va2FoZWFkID09PSAw" +
        "KSB7CiAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01P" +
        "UkU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCiAgICAgIH0KICAgIH0KCiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgIHMubWF0" +
        "Y2hfbGVuZ3RoID0gMDsKICAgIC8vVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZs" +
        "dXNoKTsgKioqLwogICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTsKICAgIHMubG9va2FoZWFkLS07CiAgICBzLnN0cnN0YXJ0Kys7CiAgICBpZiAoYmZsdXNo" +
        "KSB7CiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi8KICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0" +
        "dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgICAvKioqLwogICAgfQogIH0KICBzLmluc2VydCA9IDA7CiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkgewogICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsg" +
        "KioqLwogICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgIH0KICAgIC8qKiovCiAg" +
        "ICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgfQogIGlmIChzLmxhc3RfbGl0KSB7CiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovCiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgIGlm" +
        "IChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICB9CiAgICAvKioqLwogIH0KICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKfQoKLyogVmFsdWVzIGZvciBtYXhf" +
        "bGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCiAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUg" +
        "YmVlbiB0dW5lZCB0bwogKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVz" +
        "LgogKi8KZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykgewogIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDsKICB0aGlzLm1h" +
        "eF9sYXp5ID0gbWF4X2xhenk7CiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoOwogIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluOwogIHRoaXMuZnVuYyA9IGZ1bmM7Cn0KCnZhciBjb25maWd1cmF0" +
        "aW9uX3RhYmxlOwoKY29uZmlndXJhdGlvbl90YWJsZSA9IFsKICAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAg" +
        "IC8qIDAgc3RvcmUgb25seSAqLwogIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCiAgbmV3IENvbmZpZyg0" +
        "LCA1LCAxNiwgOCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgIC8qIDIgKi8KICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqLwoKICBuZXcgQ29uZmlnKDQs" +
        "IDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAgLyogNCBsYXp5IG1hdGNoZXMgKi8KICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqLwogIG5l" +
        "dyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovCiAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDcgKi8KICBuZXcg" +
        "Q29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqLwogIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVz" +
        "c2lvbiAqLwpdOwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBt" +
        "YXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtCiAqLwpmdW5jdGlvbiBsbV9pbml0KHMpIHsKICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplOwoKICAvKioqIENMRUFSX0hBU0gocyk7ICoq" +
        "Ki8KICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7CgogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6CiAgICovCiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNv" +
        "bmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7CiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDsKICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1" +
        "cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoOwogIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluOwoKICBzLnN0cnN0YXJ0ID0gMDsKICBz" +
        "LmJsb2NrX3N0YXJ0ID0gMDsKICBzLmxvb2thaGVhZCA9IDA7CiAgcy5pbnNlcnQgPSAwOwogIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgcy5tYXRjaF9hdmFpbGFi" +
        "bGUgPSAwOwogIHMuaW5zX2ggPSAwOwp9CgoKZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkgewogIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0g" +
        "Ki8KICB0aGlzLnN0YXR1cyA9IDA7ICAgICAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLwogIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCiAg" +
        "dGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi8KICB0aGlzLnBlbmRpbmdfb3V0ID0gMDsgICAgICAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRo" +
        "ZSBzdHJlYW0gKi8KICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAw" +
        "IHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi8KICB0aGlzLmd6aGVhZCA9IG51bGw7ICAgICAgICAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi8KICB0aGlzLmd6aW5k" +
        "ZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi8KICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovCiAgdGhpcy5s" +
        "YXN0X2ZsdXNoID0gLTE7ICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLwoKICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkg" +
        "ZGVmYXVsdCkgKi8KICB0aGlzLndfYml0cyA9IDA7ICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi8KICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovCgogIHRoaXMud2luZG93ID0gbnVsbDsK" +
        "ICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBr" +
        "ZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQogICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKICAgKiB3U2l6ZS1N" +
        "QVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KICAgKi8KCiAgdGhp" +
        "cy53aW5kb3dfc2l6ZSA9IDA7CiAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXIKICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRp" +
        "bmcgd2luZG93LgogICAqLwoKICB0aGlzLnByZXYgPSBudWxsOwogIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCiAgICogYXJy" +
        "YXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9k" +
        "dWxvIDMySy4KICAgKi8KCiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqLwoKICB0aGlzLmluc19oID0gMDsgICAgICAgLyogaGFzaCBpbmRleCBvZiBz" +
        "dHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMiho" +
        "YXNoX3NpemUpICovCiAgdGhpcy5oYXNoX21hc2sgPSAwOyAgIC8qIGhhc2hfc2l6ZS0xICovCgogIHRoaXMuaGFzaF9zaGlmdCA9IDA7CiAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBi" +
        "ZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXQKICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0" +
        "IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCiAgICovCgogIHRoaXMuYmxvY2tfc3RhcnQgPSAwOwogIC8qIFdpbmRvdyBwb3NpdGlv" +
        "biBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cwogICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCiAgICovCgogIHRoaXMubWF0" +
        "Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLwogIHRoaXMucHJldl9tYXRjaCA9IDA7ICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLwogIHRoaXMubWF0Y2hfYXZhaWxhYmxl" +
        "ID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KICB0aGlzLm1hdGNoX3N0" +
        "YXJ0ID0gMDsgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8K" +
        "CiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7CiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzCiAgICogYXJlIGRpc2NhcmRl" +
        "ZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCiAgICovCgogIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7CiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlu" +
        "cyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXMKICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlCiAgICogc3BlZWQuCiAg" +
        "ICovCgogIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwOwogIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKICAgKiBzbWFsbGVy" +
        "IHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbgogICAqIGxldmVscyA+PSA0LgogICAqLwogIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRj" +
        "aCwgZG9uJ3QgdXNlIGRpcmVjdGx5CiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDsKICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3Ro" +
        "IGlzIG5vdAogICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9y" +
        "IGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgogICAqLwoKICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLwogIHRoaXMuc3RyYXRlZ3kgPSAwOyAgLyogZmF2b3Igb3Ig" +
        "Zm9yY2UgSHVmZm1hbiBjb2RpbmcqLwoKICB0aGlzLmdvb2RfbWF0Y2ggPSAwOwogIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLwoK" +
        "ICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovCgogICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi8KCiAgLyog" +
        "RGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqLwoKICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVy" +
        "YWwgYW5kIGxlbmd0aCB0cmVlICovCiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIq" +
        "QkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCgogIC8vIFVzZSBmbGF0IGFycmF5IG9mIERPVUJMRSBzaXplLCB3aXRoIGludGVybGVhdmVkIGZhdGEsCiAgLy8gYmVjYXVz" +
        "ZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZQogIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTsKICB0aGlzLmR5bl9kdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYo" +
        "KDIgKiBEX0NPREVTICsgMSkgKiAyKTsKICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7CiAgemVybyh0aGlzLmR5bl9sdHJlZSk7CiAgemVybyh0aGlz" +
        "LmR5bl9kdHJlZSk7CiAgemVybyh0aGlzLmJsX3RyZWUpOwoKICB0aGlzLmxfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgbGl0ZXJhbCB0cmVlICovCiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7" +
        "ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovCgogIC8vdXNoIGJsX2NvdW50" +
        "W01BWF9CSVRTKzFdOwogIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTsKICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRy" +
        "ZWUgKi8KCiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCiAgdGhpcy5oZWFwID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NP" +
        "REVTICsgMSk7ICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KICB6ZXJvKHRoaXMuaGVhcCk7CgogIHRoaXMuaGVhcF9sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIG51bWJlciBv" +
        "ZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLwogIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KICAvKiBUaGUgc29ucyBvZiBoZWFwW25d" +
        "IGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgogICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCiAgICovCgogIHRoaXMu" +
        "ZGVwdGggPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdOwogIHplcm8odGhpcy5kZXB0aCk7CiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQg" +
        "YXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeQogICAqLwoKICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICov" +
        "CgogIHRoaXMubGl0X2J1ZnNpemUgPSAwOwogIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKICAgKiBsaW1pdGluZyBsaXRfYnVm" +
        "c2l6ZSB0byA2NEs6CiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycwogICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0" +
        "IGJsb2NrLCBhbGwgaW5wdXQKICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KICAgKiAgICAgd2hlbiBpbnB1dCBjb21l" +
        "cyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCiAgICogICAt" +
        "IGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9y" +
        "ZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCiAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRy" +
        "ZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAogICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCiAgICogICAg" +
        "IGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQogICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBi" +
        "dWZmZXIgc2l6ZXMgZ2l2ZQogICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5" +
        "LgogICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKICAgKi8KCiAgdGhpcy5sYXN0X2xpdCA9IDA7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLwoKICB0aGlzLmRfYnVmID0gMDsKICAvKiBC" +
        "dWZmZXIgaW5kZXggZm9yIGRpc3RhbmNlcy4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIGRfYnVmIGFuZCBsX2J1ZiBoYXZlCiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50" +
        "IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWcKICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuCiAgICovCgogIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3" +
        "aXRoIG9wdGltYWwgdHJlZXMgKi8KICB0aGlzLnN0YXRpY19sZW4gPSAwOyAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KICB0aGlzLm1hdGNoZXMgPSAwOyAg" +
        "ICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqLwogIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQg" +
        "Ki8KCgogIHRoaXMuYmlfYnVmID0gMDsKICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAogICAqIHNpZ25pZmljYW50IGJpdHMpLgogICAq" +
        "LwogIHRoaXMuYmlfdmFsaWQgPSAwOwogIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdAogICAqIGFyZSBhbHdheXMgemVyby4KICAg" +
        "Ki8KCiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlcwogIC8vIHNlbnNlIG9ubHkgZm9yIHBvaW50ZXJzIGFuZCBtZW1vcnkgY2hl" +
        "Y2sgdG9vbHMuCiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwOwogIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZQogICAqIHRoaXMg" +
        "YXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuCiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBU" +
        "aGlzIGlzIHRoZW4KICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLgogICAqLwp9CgoKZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7CiAgdmFyIHM7CgogIGlmICghc3RybSB8" +
        "fCAhc3RybS5zdGF0ZSkgewogICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CiAgfQoKICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwOwogIHN0cm0uZGF0YV90eXBlID0gWl9V" +
        "TktOT1dOOwoKICBzID0gc3RybS5zdGF0ZTsKICBzLnBlbmRpbmcgPSAwOwogIHMucGVuZGluZ19vdXQgPSAwOwoKICBpZiAocy53cmFwIDwgMCkgewogICAgcy53cmFwID0gLXMud3JhcDsKICAgIC8qIHdhcyBt" +
        "YWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovCiAgfQogIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTsKICBzdHJtLmFkbGVyID0gKHMud3JhcCA9" +
        "PT0gMikgPwogICAgMCAgLy8gY3JjMzIoMCwgWl9OVUxMLCAwKQogIDoKICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKQogIHMubGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7CiAgdHJlZXMuX3RyX2luaXQo" +
        "cyk7CiAgcmV0dXJuIFpfT0s7Cn0KCgpmdW5jdGlvbiBkZWZsYXRlUmVzZXQoc3RybSkgewogIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pOwogIGlmIChyZXQgPT09IFpfT0spIHsKICAgIGxtX2lu" +
        "aXQoc3RybS5zdGF0ZSk7CiAgfQogIHJldHVybiByZXQ7Cn0KCgpmdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHN0cm0sIGhlYWQpIHsKICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RS" +
        "RUFNX0VSUk9SOyB9CiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH0KICBzdHJtLnN0YXRlLmd6aGVhZCA9IGhlYWQ7CiAgcmV0dXJuIFpfT0s7Cn0KCgpmdW5j" +
        "dGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7CiAgaWYgKCFzdHJtKSB7IC8vID09PSBaX05VTEwKICAgIHJldHVybiBaX1NUUkVB" +
        "TV9FUlJPUjsKICB9CiAgdmFyIHdyYXAgPSAxOwoKICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgewogICAgbGV2ZWwgPSA2OwogIH0KCiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHN1" +
        "cHByZXNzIHpsaWIgd3JhcHBlciAqLwogICAgd3JhcCA9IDA7CiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgfQoKICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHsKICAgIHdyYXAgPSAyOyAgICAg" +
        "ICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi8KICAgIHdpbmRvd0JpdHMgLT0gMTY7CiAgfQoKCiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0" +
        "aG9kICE9PSBaX0RFRkxBVEVEIHx8CiAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fAogICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4g" +
        "Wl9GSVhFRCkgewogICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CiAgfQoKCiAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHsKICAgIHdpbmRvd0JpdHMgPSA5OwogIH0KICAvKiB1bnRpbCAyNTYt" +
        "Ynl0ZSB3aW5kb3cgYnVnIGZpeGVkICovCgogIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpOwoKICBzdHJtLnN0YXRlID0gczsKICBzLnN0cm0gPSBzdHJtOwoKICBzLndyYXAgPSB3cmFwOwogIHMuZ3poZWFk" +
        "ID0gbnVsbDsKICBzLndfYml0cyA9IHdpbmRvd0JpdHM7CiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzOwogIHMud19tYXNrID0gcy53X3NpemUgLSAxOwoKICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsK" +
        "ICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7CiAgcy5oYXNoX21hc2sgPSBzLmhhc2hfc2l6ZSAtIDE7CiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBN" +
        "SU5fTUFUQ0gpOwoKICBzLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplICogMik7CiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTsKICBzLnByZXYgPSBuZXcgdXRpbHMuQnVm" +
        "MTYocy53X3NpemUpOwoKICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy4KICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqLwoKICBz" +
        "LmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi8KCiAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7CgogIC8vb3Zlcmxh" +
        "eSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CiAgLy9zLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7CiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1" +
        "dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7CgogIC8vIEl0IGlzIG9mZnNldCBmcm9tIGBzLnBlbmRpbmdfYnVmYCAoc2l6ZSBpcyBgcy5saXRfYnVmc2l6ZSAqIDJgKQogIC8vcy0+ZF9idWYgPSBvdmVy" +
        "bGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplOwoKICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0" +
        "X2J1ZnNpemU7CiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplOwoKICBzLmxldmVsID0gbGV2ZWw7CiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwogIHMubWV0aG9kID0gbWV0aG9kOwoKICByZXR1" +
        "cm4gZGVmbGF0ZVJlc2V0KHN0cm0pOwp9CgpmdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgewogIHJldHVybiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywg" +
        "REVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKfQoKCmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHsKICB2YXIgb2xkX2ZsdXNoLCBzOwogIHZhciBiZWcsIHZhbDsgLy8gZm9yIGd6aXAg" +
        "aGVhZGVyIHdyaXRlIG9ubHkKCiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8CiAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7CiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVB" +
        "TV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjsKICB9CgogIHMgPSBzdHJtLnN0YXRlOwoKICBpZiAoIXN0cm0ub3V0cHV0IHx8CiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fAog" +
        "ICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7CiAgICByZXR1cm4gZXJyKHN0cm0sIChzdHJtLmF2YWlsX291dCA9PT0gMCkgPyBaX0JVRl9FUlJPUiA6IFpf" +
        "U1RSRUFNX0VSUk9SKTsKICB9CgogIHMuc3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqLwogIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDsKICBzLmxhc3RfZmx1c2ggPSBmbHVzaDsKCiAgLyogV3JpdGUg" +
        "dGhlIGhlYWRlciAqLwogIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkgewoKICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXIKICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBM" +
        "LCBaX05VTEwsIDApOwogICAgICBwdXRfYnl0ZShzLCAzMSk7CiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7CiAgICAgIHB1dF9ieXRlKHMsIDgpOwogICAgICBpZiAoIXMuZ3poZWFkKSB7IC8vIHMtPmd6aGVhZCA9" +
        "PSBaX05VTEwKICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICBwdXRfYnl0" +
        "ZShzLCAwKTsKICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6CiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPwogICAg" +
        "ICAgICAgICAgICAgICAgICA0IDogMCkpOwogICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpOwogICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBwdXRf" +
        "Ynl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArCiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgKwogICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuZXh0cmEgPyAw" +
        "IDogNCkgKwogICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArCiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KQogICAgICAgICAgICAgICAg" +
        "KTsKICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7CiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTsKICAgICAgICBwdXRfYnl0ZShzLCAocy5n" +
        "emhlYWQudGltZSA+PiAxNikgJiAweGZmKTsKICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTsKICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6CiAg" +
        "ICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPwogICAgICAgICAgICAgICAgICAgICA0IDogMCkpOwogICAgICAgIHB1dF9ieXRlKHMsIHMuZ3po" +
        "ZWFkLm9zICYgMHhmZik7CiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkgewogICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhm" +
        "Zik7CiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7CiAgICAgICAgfQogICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7CiAgICAgICAgICBzdHJtLmFk" +
        "bGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTsKICAgICAgICB9CiAgICAgICAgcy5nemluZGV4ID0gMDsKICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFOwog" +
        "ICAgICB9CiAgICB9CiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyCiAgICB7CiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODsKICAgICAgdmFyIGxl" +
        "dmVsX2ZsYWdzID0gLTE7CgogICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikgewogICAgICAgIGxldmVsX2ZsYWdzID0gMDsKICAgICAgfSBlbHNlIGlmIChzLmxl" +
        "dmVsIDwgNikgewogICAgICAgIGxldmVsX2ZsYWdzID0gMTsKICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7CiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyOwogICAgICB9IGVsc2UgewogICAgICAgIGxl" +
        "dmVsX2ZsYWdzID0gMzsKICAgICAgfQogICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpOwogICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH0KICAgICAg" +
        "aGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKCiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKCiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2Yg" +
        "dGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLwogICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTsKICAgICAgICBwdXRTaG9ydE1TQihz" +
        "LCBzdHJtLmFkbGVyICYgMHhmZmZmKTsKICAgICAgfQogICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKICAgIH0KICB9CgovLyNpZmRlZiBHWklQCiAgaWYgKHMuc3RhdHVz" +
        "ID09PSBFWFRSQV9TVEFURSkgewogICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHsKICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwoK" +
        "ICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7CiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICBp" +
        "ZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTsK" +
        "ICAgICAgICAgIH0KICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7CiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsK" +
        "ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTsKICAgICAgICBzLmd6aW5kZXgrKzsKICAg" +
        "ICAgfQogICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVn" +
        "LCBiZWcpOwogICAgICB9CiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkgewogICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFOwog" +
        "ICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFOwogICAgfQogIH0KICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHsKICAgIGlmIChzLmd6aGVhZC5uYW1lLyog" +
        "IT0gWl9OVUxMKi8pIHsKICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwogICAgICAvL2ludCB2YWw7CgogICAgICBkbyB7CiAgICAgICAgaWYgKHMucGVu" +
        "ZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRs" +
        "ZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTsKICAgICAgICAgIH0KICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7CiAgICAgICAg" +
        "ICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgdmFsID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEpTIHNw" +
        "ZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nCiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLm5hbWUubGVuZ3RoKSB7CiAgICAgICAgICB2" +
        "YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsID0gMDsKICAgICAgICB9CiAgICAgICAgcHV0X2J5dGUocywgdmFs" +
        "KTsKICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTsKCiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykgewogICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBl" +
        "bmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgIH0KICAgICAgaWYgKHZhbCA9PT0gMCkgewogICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRF" +
        "OwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFOwogICAgfQogIH0KICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHsKICAgIGlmIChzLmd6aGVh" +
        "ZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHsKICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwogICAgICAvL2ludCB2YWw7CgogICAgICBkbyB7CiAgICAg" +
        "ICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IGNy" +
        "YzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTsKICAgICAgICAgIH0KICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICBiZWcgPSBzLnBlbmRp" +
        "bmc7CiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgdmFsID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAg" +
        "ICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nCiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3Ro" +
        "KSB7CiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsID0gMDsKICAgICAgICB9CiAgICAg" +
        "ICAgcHV0X2J5dGUocywgdmFsKTsKICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTsKCiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykgewogICAgICAgIHN0cm0uYWRsZXIgPSBjcmMz" +
        "MihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgIH0KICAgICAgaWYgKHZhbCA9PT0gMCkgewogICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTsKICAgICAg" +
        "fQogICAgfQogICAgZWxzZSB7CiAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTsKICAgIH0KICB9CiAgaWYgKHMuc3RhdHVzID09PSBIQ1JDX1NUQVRFKSB7CiAgICBpZiAocy5nemhlYWQuaGNyYykgewogICAg" +
        "ICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgIH0KICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1" +
        "Zl9zaXplKSB7CiAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpOwogICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7CiAgICAgICAgc3RybS5hZGxlciA9IDA7" +
        "IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7CiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgfQogIH0K" +
        "Ly8jZW5kaWYKCiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqLwogIGlmIChzLnBlbmRpbmcgIT09IDApIHsKICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICBpZiAoc3Ry" +
        "bS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAogICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBv" +
        "c3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZAogICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFu" +
        "IGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOgogICAgICAgKi8KICAgICAgcy5sYXN0" +
        "X2ZsdXNoID0gLTE7CiAgICAgIHJldHVybiBaX09LOwogICAgfQoKICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQogICAgICog" +
        "Zmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXAKICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi4KICAg" +
        "ICAqLwogIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiYKICAgIGZsdXNoICE9PSBaX0ZJTklTSCkgewogICAgcmV0dXJuIGVycihzdHJt" +
        "LCBaX0JVRl9FUlJPUik7CiAgfQoKICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqLwogIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYm" +
        "IHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpOwogIH0KCiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLgogICAq" +
        "LwogIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8CiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHsKICAgIHZhciBi" +
        "c3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6CiAgICAgIChzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6" +
        "CiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7CgogICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9O" +
        "RSkgewogICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTsKICAgIH0KICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7CiAgICAgIGlmIChz" +
        "dHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLwogICAgICB9CiAgICAgIHJldHVy" +
        "biBaX09LOwogICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsCiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBw" +
        "YXJhbWV0ZXIgdG8gbWFrZSBzdXJlCiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhbgogICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlz" +
        "IHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzbwogICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKICAgICAgICogb25l" +
        "IGVtcHR5IGJsb2NrLgogICAgICAgKi8KICAgIH0KICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHsKICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHsKICAgICAgICB0cmVlcy5f" +
        "dHJfYWxpZ24ocyk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovCgogICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2so" +
        "cywgMCwgMCwgZmFsc2UpOwogICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkCiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZs" +
        "YXRlX3N5bmMoKS4KICAgICAgICAgKi8KICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkgewogICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBo" +
        "aXN0b3J5ICovCiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7CgogICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7CiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAw" +
        "OwogICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDsKICAgICAgICAgICAgcy5pbnNlcnQgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAg" +
        "ICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovCiAgICAgICAgcmV0dXJuIFpf" +
        "T0s7CiAgICAgIH0KICAgIH0KICB9CiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgImJ1ZzIiKTsKICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcigiYnVnMiIpO30K" +
        "CiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfQogIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9CgogIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovCiAgaWYg" +
        "KHMud3JhcCA9PT0gMikgewogICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpOwogICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTsKICAgIHB1dF9ieXRlKHMsIChzdHJtLmFk" +
        "bGVyID4+IDE2KSAmIDB4ZmYpOwogICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7CiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7CiAgICBwdXRfYnl0ZShzLCAo" +
        "c3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpOwogICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7CiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZm" +
        "KTsKICB9CiAgZWxzZQogIHsKICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTsKICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpOwogIH0KCiAgZmx1c2hfcGVuZGluZyhz" +
        "dHJtKTsKICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluCiAgICogdG8gZmx1c2ggdGhlIHJlc3QuCiAgICovCiAgaWYgKHMud3JhcCA+IDAp" +
        "IHsgcy53cmFwID0gLXMud3JhcDsgfQogIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi8KICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKfQoKZnVuY3Rpb24g" +
        "ZGVmbGF0ZUVuZChzdHJtKSB7CiAgdmFyIHN0YXR1czsKCiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHsKICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICB9" +
        "CgogIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzOwogIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiYKICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiYKICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAm" +
        "JgogICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmCiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiYKICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJgogICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUK" +
        "ICApIHsKICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpOwogIH0KCiAgc3RybS5zdGF0ZSA9IG51bGw7CgogIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRB" +
        "X0VSUk9SKSA6IFpfT0s7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEluaXRpYWxpemVzIHRoZSBjb21w" +
        "cmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUKICogc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LgogKi8KZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rp" +
        "b25hcnkoc3RybSwgZGljdGlvbmFyeSkgewogIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7CgogIHZhciBzOwogIHZhciBzdHIsIG47CiAgdmFyIHdyYXA7CiAgdmFyIGF2YWlsOwogIHZhciBu" +
        "ZXh0OwogIHZhciBpbnB1dDsKICB2YXIgdG1wRGljdDsKCiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHsKICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICB9" +
        "CgogIHMgPSBzdHJtLnN0YXRlOwogIHdyYXAgPSBzLndyYXA7CgogIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkgewogICAg" +
        "cmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogIH0KCiAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovCiAgaWYgKHdyYXAgPT09IDEp" +
        "IHsKICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqLwogICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwg" +
        "MCk7CiAgfQoKICBzLndyYXAgPSAwOyAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqLwoKICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2Ug" +
        "dGhlIGhpc3RvcnkgKi8KICBpZiAoZGljdExlbmd0aCA+PSBzLndfc2l6ZSkgewogICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqLwogICAgICAvKioq" +
        "IENMRUFSX0hBU0gocyk7ICoqKi8KICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApOwogICAgICBzLnN0cnN0YXJ0ID0gMDsKICAgICAgcy5ibG9ja19zdGFydCA9IDA7CiAgICAgIHMu" +
        "aW5zZXJ0ID0gMDsKICAgIH0KICAgIC8qIHVzZSB0aGUgdGFpbCAqLwogICAgLy8gZGljdGlvbmFyeSA9IGRpY3Rpb25hcnkuc2xpY2UoZGljdExlbmd0aCAtIHMud19zaXplKTsKICAgIHRtcERpY3QgPSBuZXcg" +
        "dXRpbHMuQnVmOChzLndfc2l6ZSk7CiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTsKICAgIGRpY3Rpb25hcnkgPSB0bXBE" +
        "aWN0OwogICAgZGljdExlbmd0aCA9IHMud19zaXplOwogIH0KICAvKiBpbnNlcnQgZGljdGlvbmFyeSBpbnRvIHdpbmRvdyBhbmQgaGFzaCAqLwogIGF2YWlsID0gc3RybS5hdmFpbF9pbjsKICBuZXh0ID0gc3Ry" +
        "bS5uZXh0X2luOwogIGlucHV0ID0gc3RybS5pbnB1dDsKICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDsKICBzdHJtLm5leHRfaW4gPSAwOwogIHN0cm0uaW5wdXQgPSBkaWN0aW9uYXJ5OwogIGZpbGxfd2lu" +
        "ZG93KHMpOwogIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgIHN0ciA9IHMuc3Ryc3RhcnQ7CiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7CiAgICBkbyB7CiAgICAg" +
        "IC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi8KICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3Ry" +
        "ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7CgogICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwoKICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyOwogICAgICBz" +
        "dHIrKzsKICAgIH0gd2hpbGUgKC0tbik7CiAgICBzLnN0cnN0YXJ0ID0gc3RyOwogICAgcy5sb29rYWhlYWQgPSBNSU5fTUFUQ0ggLSAxOwogICAgZmlsbF93aW5kb3cocyk7CiAgfQogIHMuc3Ryc3RhcnQgKz0g" +
        "cy5sb29rYWhlYWQ7CiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7CiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDsKICBzLmxvb2thaGVhZCA9IDA7CiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3Ro" +
        "ID0gTUlOX01BVENIIC0gMTsKICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgc3RybS5uZXh0X2luID0gbmV4dDsKICBzdHJtLmlucHV0ID0gaW5wdXQ7CiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsOwogIHMud3Jh" +
        "cCA9IHdyYXA7CiAgcmV0dXJuIFpfT0s7Cn0KCgpleHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7CmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyOwpleHBvcnRzLmRlZmxhdGVSZXNl" +
        "dCA9IGRlZmxhdGVSZXNldDsKZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDsKZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjsKZXhwb3J0cy5kZWZs" +
        "YXRlID0gZGVmbGF0ZTsKZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDsKZXhwb3J0cy5kZWZsYXRlU2V0RGljdGlvbmFyeSA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5OwpleHBvcnRzLmRlZmxhdGVJbmZv" +
        "ID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknOwoKLyogTm90IGltcGxlbWVudGVkCmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kOwpleHBvcnRzLmRlZmxhdGVDb3B5ID0g" +
        "ZGVmbGF0ZUNvcHk7CmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7CmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZzsKZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZs" +
        "YXRlUHJpbWU7CmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTsKKi8KCn0seyIuLi91dGlscy9jb21tb24iOjQxLCIuL2FkbGVyMzIiOjQzLCIuL2NyYzMyIjo0NSwiLi9tZXNzYWdlcyI6NTEsIi4v" +
        "dHJlZXMiOjUyfV0sNDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CgovLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLy8gKEMp" +
        "IDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLy8g" +
        "d2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vCi8vIFBl" +
        "cm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAovLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBp" +
        "dCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLy8KLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJl" +
        "IG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEgcHJvZHVj" +
        "dCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQovLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291cmNlIHZl" +
        "cnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBUaGlzIG5v" +
        "dGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKZnVuY3Rpb24gR1poZWFkZXIoKSB7CiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVs" +
        "aWV2ZWQgdG8gYmUgdGV4dCAqLwogIHRoaXMudGV4dCAgICAgICA9IDA7CiAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KICB0aGlzLnRpbWUgICAgICAgPSAwOwogIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3" +
        "aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCiAgdGhpcy54ZmxhZ3MgICAgID0gMDsKICAvKiBvcGVyYXRpbmcgc3lzdGVtICovCiAgdGhpcy5vcyAgICAgICAgID0gMDsKICAvKiBwb2ludGVyIHRvIGV4dHJh" +
        "IGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDsKICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KICB0aGlzLmV4dHJh" +
        "X2xlbiAgPSAwOyAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgbmVlZCBpdCBpbiBKUywKICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnMKCiAgLy8KICAv" +
        "LyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5CiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1" +
        "NTM2IGJ5dGVzCiAgLy8KCiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KICAvLyB0aGlzLmV4dHJhX21heCAgPSAwOwogIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5h" +
        "dGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KICB0aGlzLm5hbWUgICAgICAgPSAnJzsKICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCiAgLy8gdGhpcy5uYW1lX21heCAg" +
        "ID0gMDsKICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLwogIHRoaXMuY29tbWVudCAgICA9ICcnOwogIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFk" +
        "aW5nIGhlYWRlcikgKi8KICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwOwogIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovCiAgdGhpcy5oY3JjICAgICAgID0gMDsKICAvKiB0" +
        "cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCiAgdGhpcy5kb25lICAgICAgID0gZmFsc2U7Cn0KCm1vZHVsZS5leHBvcnRzID0g" +
        "R1poZWFkZXI7Cgp9LHt9XSw0ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgov" +
        "LyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpbgovLwovLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGll" +
        "ZAovLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLy8K" +
        "Ly8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFs" +
        "dGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgovLwovLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBu" +
        "b3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAovLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi8vICAgaW4gYSBw" +
        "cm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLy8gMi4gQWx0ZXJlZCBzb3Vy" +
        "Y2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi8vIDMuIFRo" +
        "aXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgovLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanMKdmFyIEJBRCA9IDMwOyAg" +
        "ICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1m" +
        "bGFnIGJpdCAqLwoKLyoKICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZwogICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRp" +
        "bCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMKICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KICAg" +
        "V2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgogICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1" +
        "dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlCiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgoKICAgRW50cnkgYXNzdW1wdGlvbnM6CgogICAgICAgIHN0YXRl" +
        "Lm1vZGUgPT09IExFTgogICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNgogICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OAogICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0CiAgICAgICAgc3RhdGUuYml0" +
        "cyA8IDgKCiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6CgogICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dAogICAg" +
        "ICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKCiAgIE5vdGVzOgoK" +
        "ICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlCiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGgg" +
        "ZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAogICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgogICAg" +
        "ICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAogICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5n" +
        "LgoKICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAogICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3Ro" +
        "IHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCiAgICAgIG91dHB1" +
        "dCBzcGFjZS4KICovCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7CiAgdmFyIHN0YXRlOwogIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBz" +
        "dHJtLmlucHV0ICovCiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqLwogIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2Nh" +
        "bCBzdHJtLm91dHB1dCAqLwogIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovCiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdo" +
        "aWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLwovLyNpZmRlZiBJTkZMQVRFX1NUUklDVAogIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20g" +
        "emxpYiBoZWFkZXIgKi8KLy8jZW5kaWYKICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCiAgdmFyIHdoYXZlOyAgICAgICAg" +
        "ICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5z" +
        "dGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHMKICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3" +
        "c2l6ZSAhPSAwICovCiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqLwogIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi8KICB2" +
        "YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovCiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi8KICB2YXIgbG1hc2s7" +
        "ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRp" +
        "c3RhbmNlIGNvZGVzICovCiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLwogIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9w" +
        "ZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KICB2YXIgbGVuOyAgICAgICAg" +
        "ICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KICB2YXIgZnJvbTsgICAgICAgICAgICAg" +
        "ICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCiAgdmFyIGZyb21fc291cmNlOwoKCiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRl" +
        "cnMKCiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi8KICBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgLy9oZXJlID0gc3RhdGUuaGVyZTsKICBfaW4gPSBzdHJtLm5leHRfaW47CiAgaW5wdXQgPSBz" +
        "dHJtLmlucHV0OwogIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpOwogIF9vdXQgPSBzdHJtLm5leHRfb3V0OwogIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBz" +
        "dHJtLmF2YWlsX291dCk7CiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7Ci8vI2lmZGVmIElORkxBVEVfU1RSSUNUCiAgZG1heCA9IHN0YXRlLmRtYXg7Ci8vI2VuZGlmCiAgd3NpemUgPSBz" +
        "dGF0ZS53c2l6ZTsKICB3aGF2ZSA9IHN0YXRlLndoYXZlOwogIHduZXh0ID0gc3RhdGUud25leHQ7CiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7CiAgaG9sZCA9IHN0YXRlLmhvbGQ7CiAgYml0cyA9IHN0YXRl" +
        "LmJpdHM7CiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlOwogIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7CiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7CiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0" +
        "Yml0cykgLSAxOwoKCiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoCiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2Ug" +
        "Ki8KCiAgdG9wOgogIGRvIHsKICAgIGlmIChiaXRzIDwgMTUpIHsKICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgYml0cyArPSA4OwogICAgICBob2xkICs9IGlucHV0W19pbisrXSA8" +
        "PCBiaXRzOwogICAgICBiaXRzICs9IDg7CiAgICB9CgogICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107CgogICAgZG9sZW46CiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uCiAgICAgIG9wID0g" +
        "aGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovOwogICAgICBob2xkID4+Pj0gb3A7CiAgICAgIGJpdHMgLT0gb3A7CiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLzsKICAgICAgaWYgKG9w" +
        "ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovCiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KICAgICAg" +
        "ICAvLyAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKICAgICAgICAvLyAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CiAgICAg" +
        "ICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqLwog" +
        "ICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87CiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KICAgICAgICBp" +
        "ZiAob3ApIHsKICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgfQogICAgICAg" +
        "ICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7CiAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgIH0KICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgImlu" +
        "ZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBsZW4pKTsKICAgICAgICBpZiAoYml0cyA8IDE1KSB7CiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4" +
        "OwogICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICB9CiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107CgogICAgICAgIGRv" +
        "ZGlzdDoKICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uCiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLzsKICAgICAgICAgIGhvbGQgPj4+PSBvcDsKICAgICAgICAgIGJp" +
        "dHMgLT0gb3A7CiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87CgogICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFz" +
        "ZSAqLwogICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLzsKICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAq" +
        "LwogICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgaWYgKGJp" +
        "dHMgPCBvcCkgewogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg" +
        "ICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpOwovLyNpZmRlZiBJTkZMQVRFX1NUUklDVAogICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdp" +
        "bnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICAgIH0KLy8jZW5kaWYKICAgICAgICAg" +
        "ICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIGRpc3QpKTsKICAgICAg" +
        "ICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovCiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlm" +
        "IGNvcHkgZnJvbSB3aW5kb3cgKi8KICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqLwogICAgICAgICAgICAgIGlmIChvcCA+IHdo" +
        "YXZlKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkgewogICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7CiAgICAgICAgICAgICAgICAg" +
        "IHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgIH0KCi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsCi8vIGRv" +
        "bid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkKLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0g" +
        "b3AgLSB3aGF2ZSkgewovLyAgICAgICAgICAgICAgICAgIGRvIHsKLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDsKLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7Ci8v" +
        "ICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wOwovLyAgICAgICAgICAgICAgICB9Ci8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlOwovLyAgICAgICAgICAgICAgICBkbyB7Ci8vICAgICAg" +
        "ICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwOwovLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOwovLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHsKLy8gICAgICAgICAg" +
        "ICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7Ci8vICAgICAgICAgICAgICAgICAgZG8gewovLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKLy8gICAgICAgICAg" +
        "ICAgICAgICB9IHdoaWxlICgtLWxlbik7Ci8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wOwovLyAgICAgICAgICAgICAgICB9Ci8vI2VuZGlmCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZy" +
        "b20gPSAwOyAvLyB3aW5kb3cgaW5kZXgKICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93OwogICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24g" +
        "Y2FzZSAqLwogICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOwogICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLwogICAgICAgICAgICAg" +
        "ICAgICBsZW4gLT0gb3A7CiAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgIH0gd2hpbGUg" +
        "KC0tb3ApOwogICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAg" +
        "ICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovCiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXpl" +
        "ICsgd25leHQgLSBvcDsKICAgICAgICAgICAgICAgIG9wIC09IHduZXh0OwogICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi8KICAgICAg" +
        "ICAgICAgICAgICAgbGVuIC09IG9wOwogICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdOwogICAgICAgICAgICAgICAgICB9" +
        "IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7CiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqLwogICAgICAg" +
        "ICAgICAgICAgICAgIG9wID0gd25leHQ7CiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0g" +
        "c193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAq" +
        "LwogICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgeyAg" +
        "ICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqLwogICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wOwogICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAg" +
        "ICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLwogICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CiAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2lu" +
        "ZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOwogICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCiAgICAgICAgICAg" +
        "ICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikgewogICAgICAgICAgICAgICAgb3V0cHV0W19v" +
        "dXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9t" +
        "X3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgbGVuIC09IDM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZW4pIHsKICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJv" +
        "bV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAg" +
        "IH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1" +
        "dCAqLwogICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqLwogICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJv" +
        "bSsrXTsKICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdOwogICAgICAgICAgICAgICAg" +
        "bGVuIC09IDM7CiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7CiAgICAgICAgICAgICAgaWYgKGxlbikgewogICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAg" +
        "ICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAg" +
        "ICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi8KICAgICAgICAgICAgaGVyZSA9IGRjb2Rl" +
        "WyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07CiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAg" +
        "ICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICB9CgogICAgICAgICAg" +
        "YnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSAiY29udGludWUiCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxl" +
        "dmVsIGxlbmd0aCBjb2RlICovCiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07CiAgICAgICAgY29udGludWUgZG9sZW47" +
        "CiAgICAgIH0KICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqLwogICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBl" +
        "bmQgb2YgYmxvY2tcbiIpKTsKICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgICBicmVhayB0b3A7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFs" +
        "L2xlbmd0aCBjb2RlJzsKICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgIGJyZWFrIHRvcDsKICAgICAgfQoKICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSAiY29udGludWUi" +
        "CiAgICB9CiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTsKCiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2sp" +
        "ICovCiAgbGVuID0gYml0cyA+PiAzOwogIF9pbiAtPSBsZW47CiAgYml0cyAtPSBsZW4gPDwgMzsKICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTsKCiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KICBz" +
        "dHJtLm5leHRfaW4gPSBfaW47CiAgc3RybS5uZXh0X291dCA9IF9vdXQ7CiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpOwogIHN0cm0u" +
        "YXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpOwogIHN0YXRlLmhvbGQgPSBob2xkOwogIHN0YXRlLmJpdHMgPSBiaXRzOwogIHJldHVybjsK" +
        "fTsKCn0se31dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnOwoKLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi8vIChDKSAy" +
        "MDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luCi8vCi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi8vIHdh" +
        "cnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwovLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgovLwovLyBQZXJt" +
        "aXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQg" +
        "YW5kIHJlZGlzdHJpYnV0ZSBpdAovLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci8vCi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBt" +
        "aXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLy8gICBpbiBhIHByb2R1Y3Qs" +
        "IGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgovLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJz" +
        "aW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQovLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLy8gMy4gVGhpcyBub3Rp" +
        "Y2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KCnZhciB1dGlscyAgICAgICAgID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7CnZhciBhZGxl" +
        "cjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7CnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpOwp2YXIgaW5mbGF0ZV9mYXN0ICA9IHJlcXVpcmUoJy4vaW5mZmFzdCcpOwp2YXIg" +
        "aW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTsKCnZhciBDT0RFUyA9IDA7CnZhciBMRU5TID0gMTsKdmFyIERJU1RTID0gMjsKCi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PSovCgoKLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLwovL3ZhciBaX05PX0ZMVVNIICAgICAgPSAwOwovL3ZhciBaX1BB" +
        "UlRJQUxfRkxVU0ggPSAxOwovL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyOwovL3ZhciBaX0ZVTExfRkxVU0ggICAgPSAzOwp2YXIgWl9GSU5JU0ggICAgICAgID0gNDsKdmFyIFpfQkxPQ0sgICAgICAgICA9IDU7" +
        "CnZhciBaX1RSRUVTICAgICAgICAgPSA2OwoKCi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKICogYXJlIGVycm9ycywg" +
        "cG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgogKi8KdmFyIFpfT0sgICAgICAgICAgICA9IDA7CnZhciBaX1NUUkVBTV9FTkQgICAgPSAxOwp2YXIgWl9ORUVE" +
        "X0RJQ1QgICAgID0gMjsKLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7CnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjsKdmFyIFpfREFUQV9FUlJPUiAgICA9IC0zOwp2YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7" +
        "CnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTsKLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7CgovKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi8KdmFyIFpfREVGTEFURUQgID0gODsKCgovKiBT" +
        "VEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCnZhciAgICBIRUFEID0gMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbWFnaWMgaGVhZGVyICovCnZhciAgICBGTEFHUyA9IDI7ICAgICAg" +
        "LyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi8KdmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi8KdmFyICAg" +
        "IE9TID0gNDsgICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi8KdmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBl" +
        "eHRyYSBsZW5ndGggKGd6aXApICovCnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovCnZhciAgICBOQU1FID0gNzsgICAgICAgLyogaTogd2FpdGlu" +
        "ZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi8KdmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi8KdmFyICAgIEhDUkMgPSA5OyAgICAg" +
        "ICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqLwp2YXIgICAgRElDVElEID0gMTA7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi8KdmFyICAgIERJQ1Qg" +
        "PSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi8KdmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRp" +
        "bmcgbGFzdC1mbGFnIGJpdCAqLwp2YXIgICAgICAgIFRZUEVETyA9IDEzOyAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovCnZhciAgICAgICAgU1RP" +
        "UkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovCnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJl" +
        "bG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovCnZhciAgICAgICAgQ09QWSA9IDE2OyAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovCnZh" +
        "ciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqLwp2YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBj" +
        "b2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KdmFyICAgICAgICBDT0RFTEVOUyA9IDE5OyAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCnZhciAgICAg" +
        "ICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqLwp2YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBm" +
        "b3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqLwp2YXIgICAgICAgICAgICBMRU5FWFQgPSAyMjsgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KdmFyICAgICAgICAgICAgRElTVCA9IDIz" +
        "OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KdmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KdmFyICAg" +
        "ICAgICAgICAgTUFUQ0ggPSAyNTsgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLwp2YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBm" +
        "b3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KdmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KdmFyICAgIExFTkdUSCA9IDI4OyAg" +
        "ICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLwp2YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICov" +
        "CnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLwp2YXIgICAgTUVNID0gMzE7ICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVt" +
        "b3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgp" +
        "ICovCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgp2YXIgRU5PVUdIX0xFTlMgPSA4NTI7CnZhciBFTk9V" +
        "R0hfRElTVFMgPSA1OTI7Ci8vdmFyIEVOT1VHSCA9ICAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTsKCnZhciBNQVhfV0JJVFMgPSAxNTsKLyogMzJLIExaNzcgd2luZG93ICovCnZhciBERUZfV0JJVFMgPSBN" +
        "QVhfV0JJVFM7CgoKZnVuY3Rpb24genN3YXAzMihxKSB7CiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArCiAgICAgICAgICAoKHEgPj4+IDgpICYgMHhmZjAwKSArCiAgICAgICAgICAoKHEgJiAweGZm" +
        "MDApIDw8IDgpICsKICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7Cn0KCgpmdW5jdGlvbiBJbmZsYXRlU3RhdGUoKSB7CiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRl" +
        "IG1vZGUgKi8KICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi8KICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBm" +
        "b3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLwogIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi8KICB0aGlzLmZsYWdzID0gMDsgICAgICAg" +
        "ICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqLwogIHRoaXMuZG1heCA9IDA7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVf" +
        "U1RSSUNUKSAqLwogIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqLwogIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQg" +
        "Y29weSBvZiBvdXRwdXQgY291bnQgKi8KICAvLyBUT0RPOiBtYXkgYmUge30KICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqLwoK" +
        "ICAvKiBzbGlkaW5nIHdpbmRvdyAqLwogIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqLwogIHRoaXMud3NpemUgPSAwOyAgICAgICAg" +
        "ICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KICB0aGlzLndoYXZlID0gMDsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqLwogIHRoaXMu" +
        "d25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8K" +
        "CiAgLyogYml0IGFjY3VtdWxhdG9yICovCiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwogIHRoaXMuYml0cyA9IDA7ICAgICAgICAgICAgICAvKiBudW1i" +
        "ZXIgb2YgYml0cyBpbiAiaW4iICovCgogIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovCiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9m" +
        "IGRhdGEgdG8gY29weSAqLwogIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi8KCiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5n" +
        "ICovCiAgdGhpcy5leHRyYSA9IDA7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovCgogIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovCiAgdGhpcy5sZW5jb2RlID0gbnVsbDsg" +
        "ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNv" +
        "ZGVzICovCiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi8KICB0aGlzLmRpc3RiaXRzID0gMDsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNv" +
        "ZGUgKi8KCiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLwogIHRoaXMubmNvZGUgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCiAgdGhpcy5ubGVu" +
        "ID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMg" +
        "Ki8KICB0aGlzLmhhdmUgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFi" +
        "bGUgc3BhY2UgaW4gY29kZXNbXSAqLwoKICB0aGlzLmxlbnMgPSBuZXcgdXRpbHMuQnVmMTYoMzIwKTsgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLwogIHRoaXMud29yayA9IG5ldyB1" +
        "dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KCiAgLyoKICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBh" +
        "bmQgZGlzdGNvZGUgZGlyZWN0bHkKICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzCiAgKi8KICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2Ug" +
        "Zm9yIGNvZGUgdGFibGVzICovCiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqLwogIHRoaXMu" +
        "ZGlzdGR5biA9IG51bGw7ICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzIChKUyBzcGVjaWZpYykgKi8KICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBp" +
        "ZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovCiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xp" +
        "dCAqLwogIHRoaXMud2FzID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovCn0KCmZ1bmN0aW9uIGluZmxhdGVSZXNldEtlZXAoc3RybSkgewogIHZhciBzdGF0ZTsK" +
        "CiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfQogIHN0YXRlID0gc3RybS5zdGF0ZTsKICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50" +
        "b3RhbCA9IDA7CiAgc3RybS5tc2cgPSAnJzsgLypaX05VTEwqLwogIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi8KICAgIHN0cm0u" +
        "YWRsZXIgPSBzdGF0ZS53cmFwICYgMTsKICB9CiAgc3RhdGUubW9kZSA9IEhFQUQ7CiAgc3RhdGUubGFzdCA9IDA7CiAgc3RhdGUuaGF2ZWRpY3QgPSAwOwogIHN0YXRlLmRtYXggPSAzMjc2ODsKICBzdGF0ZS5o" +
        "ZWFkID0gbnVsbC8qWl9OVUxMKi87CiAgc3RhdGUuaG9sZCA9IDA7CiAgc3RhdGUuYml0cyA9IDA7CiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7" +
        "CiAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5biA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0hfTEVOUyk7CiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VH" +
        "SF9ESVNUUyk7CgogIHN0YXRlLnNhbmUgPSAxOwogIHN0YXRlLmJhY2sgPSAtMTsKICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogcmVzZXRcbiIpKTsKICByZXR1cm4gWl9PSzsKfQoKZnVuY3Rpb24gaW5m" +
        "bGF0ZVJlc2V0KHN0cm0pIHsKICB2YXIgc3RhdGU7CgogIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH0KICBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgc3RhdGUud3Np" +
        "emUgPSAwOwogIHN0YXRlLndoYXZlID0gMDsKICBzdGF0ZS53bmV4dCA9IDA7CiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7Cgp9CgpmdW5jdGlvbiBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0Jp" +
        "dHMpIHsKICB2YXIgd3JhcDsKICB2YXIgc3RhdGU7CgogIC8qIGdldCB0aGUgc3RhdGUgKi8KICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9CiAgc3RhdGUgPSBz" +
        "dHJtLnN0YXRlOwoKICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovCiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CiAgICB3cmFwID0gMDsKICAgIHdpbmRvd0JpdHMg" +
        "PSAtd2luZG93Qml0czsKICB9CiAgZWxzZSB7CiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOwogICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkgewogICAgICB3aW5kb3dCaXRzICY9IDE1OwogICAgfQog" +
        "IH0KCiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovCiAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkp" +
        "IHsKICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICB9CiAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykgewogICAgc3RhdGUud2luZG93ID0gbnVsbDsK" +
        "ICB9CgogIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi8KICBzdGF0ZS53cmFwID0gd3JhcDsKICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7CiAgcmV0dXJuIGluZmxhdGVSZXNl" +
        "dChzdHJtKTsKfQoKZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHsKICB2YXIgcmV0OwogIHZhciBzdGF0ZTsKCiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfQog" +
        "IC8vc3RybS5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLwoKICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTsKCiAgLy9pZiAoc3RhdGUgPT09" +
        "IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwogIC8vVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKICBzdHJtLnN0YXRlID0gc3RhdGU7CiAgc3RhdGUud2luZG93ID0gbnVsbC8q" +
        "Wl9OVUxMKi87CiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKICBpZiAocmV0ICE9PSBaX09LKSB7CiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87CiAgfQogIHJldHVybiBy" +
        "ZXQ7Cn0KCmZ1bmN0aW9uIGluZmxhdGVJbml0KHN0cm0pIHsKICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7Cn0KCgovKgogUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5j" +
        "ZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bwogZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgogSWYg" +
        "QlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQogZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVz" +
        "IHRoZSBmaXJzdCB0aW1lIGFuZAogdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRp" +
        "b24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQogdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdp" +
        "bgogbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KICovCnZhciB2aXJnaW4gPSB0cnVlOwoKdmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2Vw" +
        "YXJhdGUKCmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7CiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KICBpZiAodmly" +
        "Z2luKSB7CiAgICB2YXIgc3ltOwoKICAgIGxlbmZpeCA9IG5ldyB1dGlscy5CdWYzMig1MTIpOwogICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7CgogICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUg" +
        "Ki8KICAgIHN5bSA9IDA7CiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfQogICAgd2hpbGUgKHN5bSA8IDI1NikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7IH0KICAgIHdo" +
        "aWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9CiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfQoKICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0" +
        "YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTsKCiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLwogICAgc3ltID0gMDsKICAgIHdoaWxlIChzeW0gPCAzMikgeyBz" +
        "dGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH0KCiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7CgogICAgLyogZG8g" +
        "dGhpcyBqdXN0IG9uY2UgKi8KICAgIHZpcmdpbiA9IGZhbHNlOwogIH0KCiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDsKICBzdGF0ZS5sZW5iaXRzID0gOTsKICBzdGF0ZS5kaXN0Y29kZSA9IGRpc3RmaXg7CiAg" +
        "c3RhdGUuZGlzdGJpdHMgPSA1Owp9CgoKLyoKIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmUKIHJldHVybmluZy4gIElmIHdp" +
        "bmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWQKIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0" +
        "ZW4gZHVyaW5nIHRoaXMKIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4KIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBh" +
        "IHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5CiBpcyBsb2FkZWQuCgogUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxk" +
        "IHByb3ZpZGUgYSBzcGVlZAogYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvdwogdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRl" +
        "KCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2YKIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5k" +
        "IGZhc3Rlci4KIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuCiAqLwpmdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3Jj" +
        "LCBlbmQsIGNvcHkpIHsKICB2YXIgZGlzdDsKICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlOwoKICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93" +
        "ICovCiAgaWYgKHN0YXRlLndpbmRvdyA9PT0gbnVsbCkgewogICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzOwogICAgc3RhdGUud25leHQgPSAwOwogICAgc3RhdGUud2hhdmUgPSAwOwoKICAgIHN0" +
        "YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTsKICB9CgogIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqLwog" +
        "IGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7CiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTsKICAgIHN0YXRlLnduZXh0ID0g" +
        "MDsKICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7CiAgfQogIGVsc2UgewogICAgZGlzdCA9IHN0YXRlLndzaXplIC0gc3RhdGUud25leHQ7CiAgICBpZiAoZGlzdCA+IGNvcHkpIHsKICAgICAgZGlzdCA9" +
        "IGNvcHk7CiAgICB9CiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7CiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0g" +
        "Y29weSwgZGlzdCwgc3RhdGUud25leHQpOwogICAgY29weSAtPSBkaXN0OwogICAgaWYgKGNvcHkpIHsKICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpOwogICAgICB1dGls" +
        "cy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgY29weSwgMCk7CiAgICAgIHN0YXRlLnduZXh0ID0gY29weTsKICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTsKICAgIH0KICAg" +
        "IGVsc2UgewogICAgICBzdGF0ZS53bmV4dCArPSBkaXN0OwogICAgICBpZiAoc3RhdGUud25leHQgPT09IHN0YXRlLndzaXplKSB7IHN0YXRlLnduZXh0ID0gMDsgfQogICAgICBpZiAoc3RhdGUud2hhdmUgPCBz" +
        "dGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9CiAgICB9CiAgfQogIHJldHVybiAwOwp9CgpmdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7CiAgdmFyIHN0YXRlOwogIHZhciBpbnB1dCwg" +
        "b3V0cHV0OyAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgYnVmZmVycwogIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovCiAgdmFyIHB1dDsgICAgICAgICAgICAgICAg" +
        "ICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovCiAgdmFyIGhhdmUsIGxlZnQ7ICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAg" +
        "IC8qIGJpdCBidWZmZXIgKi8KICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCiAgdmFyIF9pbiwgX291dDsgICAgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcg" +
        "YXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovCiAgdmFyIGZyb207ICAg" +
        "ICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLwogIHZhciBmcm9tX3NvdXJjZTsKICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGlu" +
        "ZyB0YWJsZSBlbnRyeSAqLwogIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCAiaGVyZSIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYykKICAvL3ZhciBsYXN0OyAgICAgICAgICAg" +
        "ICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KICB2YXIgbGFzdF9iaXRzLCBsYXN0X29wLCBsYXN0X3ZhbDsgLy8gcGFrZWQgImxhc3QiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpCiAgdmFyIGxl" +
        "bjsgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KICB2" +
        "YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqLwogIHZhciBvcHRzOwoKICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3Ig" +
        "TkVFRF9CSVRTCgogIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLwogICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwg" +
        "MTQsIDEsIDE1IF07CgoKICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8CiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSkgewogICAgcmV0dXJuIFpf" +
        "U1RSRUFNX0VSUk9SOwogIH0KCiAgc3RhdGUgPSBzdHJtLnN0YXRlOwogIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqLwoKCiAgLy8t" +
        "LS0gTE9BRCgpIC0tLQogIHB1dCA9IHN0cm0ubmV4dF9vdXQ7CiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7CiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0OwogIG5leHQgPSBzdHJtLm5leHRfaW47CiAgaW5wdXQgPSBz" +
        "dHJtLmlucHV0OwogIGhhdmUgPSBzdHJtLmF2YWlsX2luOwogIGhvbGQgPSBzdGF0ZS5ob2xkOwogIGJpdHMgPSBzdGF0ZS5iaXRzOwogIC8vLS0tCgogIF9pbiA9IGhhdmU7CiAgX291dCA9IGxlZnQ7CiAgcmV0" +
        "ID0gWl9PSzsKCiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvbgogIGZvciAoOzspIHsKICAgIHN3aXRjaCAoc3RhdGUubW9kZSkgewogICAgY2FzZSBIRUFEOgogICAgICBpZiAoc3RhdGUud3JhcCA9PT0g" +
        "MCkgewogICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy89PT0gTkVFREJJVFMoMTYpOwogICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgaWYg" +
        "KGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgaGF2ZS0tOwogICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgIGJpdHMgKz0gODsKICAgICAgfQogICAg" +
        "ICAvLz09PS8vCiAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi8KICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEws" +
        "IDApKi87CiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7CiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmOwogICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmOwogICAg" +
        "ICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgIC8vPT09Ly8KCiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTsKICAgICAgICBob2xkID0gMDsKICAgICAgICBi" +
        "aXRzID0gMDsKICAgICAgICAvLz09PS8vCiAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHN0YXRlLmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6" +
        "bGliIGhlYWRlciAqLwogICAgICBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNr" +
        "IGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7CiAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0" +
        "IGhlYWRlciBjaGVjayc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7CiAg" +
        "ICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnOwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy8tLS0gRFJPUEJJVFMoNCkg" +
        "LS0tLy8KICAgICAgaG9sZCA+Pj49IDQ7CiAgICAgIGJpdHMgLT0gNDsKICAgICAgLy8tLS0vLwogICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4OwogICAgICBpZiAoc3RhdGUud2JpdHMg" +
        "PT09IDApIHsKICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjsKICAgICAgfQogICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykgewogICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUn" +
        "OwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuOwogICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICB6bGli" +
        "IGhlYWRlciBva1xuIikpOwogICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87CiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQg" +
        "OiBUWVBFOwogICAgICAvLz09PSBJTklUQklUUygpOwogICAgICBob2xkID0gMDsKICAgICAgYml0cyA9IDA7CiAgICAgIC8vPT09Ly8KICAgICAgYnJlYWs7CiAgICBjYXNlIEZMQUdTOgogICAgICAvLz09PSBO" +
        "RUVEQklUUygxNik7ICovCiAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICBoYXZlLS07CiAgICAgICAgaG9sZCArPSBp" +
        "bnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgYml0cyArPSA4OwogICAgICB9CiAgICAgIC8vPT09Ly8KICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkOwogICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikg" +
        "IT09IFpfREVGTEFURUQpIHsKICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQogICAg" +
        "ICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHsKICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnOwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAg" +
        "ICAgIH0KICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHsKICAg" +
        "ICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTsKICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7CiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7CiAgICAgICAgc3RhdGUu" +
        "Y2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgLy89PT0vLwogICAgICB9CiAgICAgIC8vPT09IElOSVRCSVRTKCk7CiAgICAgIGhvbGQgPSAwOwogICAgICBiaXRzID0gMDsK" +
        "ICAgICAgLy89PT0vLwogICAgICBzdGF0ZS5tb2RlID0gVElNRTsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBUSU1FOgogICAgICAvLz09PSBORUVEQklUUygzMik7ICovCiAgICAgIHdoaWxl" +
        "IChiaXRzIDwgMzIpIHsKICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICBoYXZlLS07CiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAg" +
        "ICAgYml0cyArPSA4OwogICAgICB9CiAgICAgIC8vPT09Ly8KICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5mbGFn" +
        "cyAmIDB4MDIwMCkgewogICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpCiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmOwogICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZm" +
        "OwogICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjsKICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7CiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVj" +
        "aywgaGJ1ZiwgNCwgMCk7CiAgICAgICAgLy89PT0KICAgICAgfQogICAgICAvLz09PSBJTklUQklUUygpOwogICAgICBob2xkID0gMDsKICAgICAgYml0cyA9IDA7CiAgICAgIC8vPT09Ly8KICAgICAgc3RhdGUu" +
        "bW9kZSA9IE9TOwogICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICBjYXNlIE9TOgogICAgICAvLz09PSBORUVEQklUUygxNik7ICovCiAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICBpZiAoaGF2" +
        "ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICBoYXZlLS07CiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgYml0cyArPSA4OwogICAgICB9CiAgICAgIC8v" +
        "PT09Ly8KICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7CiAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpOwogICAgICB9CiAg" +
        "ICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkgewogICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpOwogICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjsKICAgICAgICBoYnVmWzFdID0g" +
        "KGhvbGQgPj4+IDgpICYgMHhmZjsKICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAvLz09PS8vCiAgICAgIH0KICAgICAgLy89PT0gSU5JVEJJVFMo" +
        "KTsKICAgICAgaG9sZCA9IDA7CiAgICAgIGJpdHMgPSAwOwogICAgICAvLz09PS8vCiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBFWExFTjoKICAg" +
        "ICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7CiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqLwogICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJy" +
        "ZWFrIGluZl9sZWF2ZTsgfQogICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgfQogICAgICAgIC8vPT09" +
        "Ly8KICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkOwogICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX2xlbiA9IGhvbGQ7CiAgICAgICAgfQogICAgICAgIGlmIChz" +
        "dGF0ZS5mbGFncyAmIDB4MDIwMCkgewogICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7CiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7CiAgICAgICAgICBoYnVmWzFdID0gKGhv" +
        "bGQgPj4+IDgpICYgMHhmZjsKICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgLy89PT0vLwogICAgICAgIH0KICAgICAgICAvLz09PSBJTklU" +
        "QklUUygpOwogICAgICAgIGhvbGQgPSAwOwogICAgICAgIGJpdHMgPSAwOwogICAgICAgIC8vPT09Ly8KICAgICAgfQogICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgc3RhdGUuaGVhZC5leHRy" +
        "YSA9IG51bGwvKlpfTlVMTCovOwogICAgICB9CiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBFWFRSQToKICAgICAgaWYgKHN0YXRlLmZsYWdzICYg" +
        "MHgwNDAwKSB7CiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDsKICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH0KICAgICAgICBpZiAoY29weSkgewogICAgICAgICAgaWYgKHN0YXRl" +
        "LmhlYWQpIHsKICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkgewogICAgICAgICAgICAgIC8vIFVz" +
        "ZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbmQgcHJvY2Vzc2luZyBsYXRlcgogICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pOwog" +
        "ICAgICAgICAgICB9CiAgICAgICAgICAgIHV0aWxzLmFycmF5U2V0KAogICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsCiAgICAgICAgICAgICAgaW5wdXQsCiAgICAgICAgICAgICAgbmV4dCwKICAgICAg" +
        "ICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzCiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2sKICAgICAgICAgICAgICBjb3B5" +
        "LAogICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovCiAgICAgICAgICAgICAgbGVuCiAgICAgICAgICAg" +
        "ICk7CiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LAogICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID8KICAgICAg" +
        "ICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHsKICAgICAgICAgICAgc3RhdGUu" +
        "Y2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgICAgfQogICAgICAgICAgaGF2ZSAtPSBjb3B5OwogICAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgICAgc3Rh" +
        "dGUubGVuZ3RoIC09IGNvcHk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgIH0KICAgICAgc3RhdGUubGVuZ3RoID0gMDsKICAgICAgc3RhdGUu" +
        "bW9kZSA9IE5BTUU7CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGNhc2UgTkFNRToKICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7CiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsg" +
        "aW5mX2xlYXZlOyB9CiAgICAgICAgY29weSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzPwogICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAg" +
        "ICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqLwogICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmCiAgICAgICAg" +
        "ICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkgewogICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pOwogICAgICAg" +
        "ICAgfQogICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CgogICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkgewogICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVj" +
        "aywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgIH0KICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAg" +
        "IH0KICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7CiAgICAgIH0KICAgICAgc3RhdGUubGVuZ3RoID0gMDsKICAgICAgc3RhdGUubW9kZSA9IENPTU1F" +
        "TlQ7CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGNhc2UgQ09NTUVOVDoKICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgxMDAwKSB7CiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xl" +
        "YXZlOyB9CiAgICAgICAgY29weSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBq" +
        "cyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqLwogICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmCiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVh" +
        "ZC5jb21tX21heCovKSkgewogICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwg" +
        "aGF2ZSk7CiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7CiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7CiAgICAgICAgfQogICAg" +
        "ICAgIGhhdmUgLT0gY29weTsKICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgfQogICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAg" +
        "ICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDsKICAgICAgfQogICAgICBzdGF0ZS5tb2RlID0gSENSQzsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBIQ1JDOgogICAgICBpZiAoc3RhdGUu" +
        "ZmxhZ3MgJiAweDAyMDApIHsKICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovCiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZl" +
        "OyB9CiAgICAgICAgICBoYXZlLS07CiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICB9CiAgICAgICAgLy89PT0vLwogICAgICAgIGlm" +
        "IChob2xkICE9PSAoc3RhdGUuY2hlY2sgJiAweGZmZmYpKSB7CiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJzsKICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICBi" +
        "cmVhazsKICAgICAgICB9CiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTsKICAgICAgICBob2xkID0gMDsKICAgICAgICBiaXRzID0gMDsKICAgICAgICAvLz09PS8vCiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmhl" +
        "YWQpIHsKICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7CiAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTsKICAgICAgfQogICAgICBzdHJtLmFkbGVyID0gc3Rh" +
        "dGUuY2hlY2sgPSAwOwogICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgYnJlYWs7CiAgICBjYXNlIERJQ1RJRDoKICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqLwogICAgICB3aGlsZSAoYml0cyA8IDMy" +
        "KSB7CiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgaGF2ZS0tOwogICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgIGJpdHMgKz0g" +
        "ODsKICAgICAgfQogICAgICAvLz09PS8vCiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7CiAgICAgIC8vPT09IElOSVRCSVRTKCk7CiAgICAgIGhvbGQgPSAwOwogICAgICBi" +
        "aXRzID0gMDsKICAgICAgLy89PT0vLwogICAgICBzdGF0ZS5tb2RlID0gRElDVDsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBESUNUOgogICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDAp" +
        "IHsKICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tCiAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsK" +
        "ICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICAvLy0tLQogICAgICAgIHJldHVybiBaX05FRURf" +
        "RElDVDsKICAgICAgfQogICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87CiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAvKiBmYWxscyB0aHJv" +
        "dWdoICovCiAgICBjYXNlIFRZUEU6CiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwog" +
        "ICAgY2FzZSBUWVBFRE86CiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7CiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLwogICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgICBiaXRzIC09IGJpdHMg" +
        "JiA3OwogICAgICAgIC8vLS0tLy8KICAgICAgICBzdGF0ZS5tb2RlID0gQ0hFQ0s7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy89PT0gTkVFREJJVFMoMyk7ICovCiAgICAgIHdoaWxlIChiaXRzIDwg" +
        "MykgewogICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQogICAgICAgIGhhdmUtLTsKICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICBiaXRzICs9" +
        "IDg7CiAgICAgIH0KICAgICAgLy89PT0vLwogICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovOwogICAgICAvLy0tLSBEUk9QQklUUygxKSAtLS0vLwogICAgICBob2xkID4+Pj0gMTsK" +
        "ICAgICAgYml0cyAtPSAxOwogICAgICAvLy0tLS8vCgogICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykgewogICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBz" +
        "dG9yZWQgYmxvY2sgKi8KICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAogICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gIiAobGFzdCkiIDogIiIp" +
        "KTsKICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLwogICAgICAgIGZpeGVk" +
        "dGFibGVzKHN0YXRlKTsKICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyAiIChsYXN0KSIg" +
        "OiAiIikpOwogICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsKICAgICAgICAgIC8vLS0tIERST1BC" +
        "SVRTKDIpIC0tLS8vCiAgICAgICAgICBob2xkID4+Pj0gMjsKICAgICAgICAgIGJpdHMgLT0gMjsKICAgICAgICAgIC8vLS0tLy8KICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICB9CiAgICAgICAg" +
        "YnJlYWs7CiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29k" +
        "ZXMgYmxvY2slc1xuIiwKICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CiAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6" +
        "CiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBibG9jayB0eXBlJzsKICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICB9CiAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vCiAgICAgIGhvbGQgPj4+" +
        "PSAyOwogICAgICBiaXRzIC09IDI7CiAgICAgIC8vLS0tLy8KICAgICAgYnJlYWs7CiAgICBjYXNlIFNUT1JFRDoKICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICov" +
        "CiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgYml0cyAtPSBiaXRzICYgNzsKICAgICAgLy8tLS0vLwogICAgICAvLz09PSBORUVEQklUUygzMik7ICovCiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHsK" +
        "ICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICBoYXZlLS07CiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgYml0cyArPSA4Owog" +
        "ICAgICB9CiAgICAgIC8vPT09Ly8KICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7CiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sg" +
        "bGVuZ3Rocyc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmOwogICAgICAvL1RyYWNldigoc3RkZXJyLCAi" +
        "aW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwKICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpOwogICAgICAvLz09PSBJTklUQklUUygpOwogICAgICBob2xkID0gMDsKICAgICAgYml0cyA9" +
        "IDA7CiAgICAgIC8vPT09Ly8KICAgICAgc3RhdGUubW9kZSA9IENPUFlfOwogICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8K" +
        "ICAgIGNhc2UgQ09QWV86CiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZOwogICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICBjYXNlIENPUFk6CiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7CiAgICAgIGlmIChj" +
        "b3B5KSB7CiAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9CiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9CiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJl" +
        "YWsgaW5mX2xlYXZlOyB9CiAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS0KICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpOwogICAg" +
        "ICAgIC8vLS0tLy8KICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgIGxlZnQgLT0gY29weTsKICAgICAgICBwdXQgKz0gY29weTsKICAgICAgICBzdGF0ZS5sZW5ndGgg" +
        "LT0gY29weTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOwogICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAg" +
        "YnJlYWs7CiAgICBjYXNlIFRBQkxFOgogICAgICAvLz09PSBORUVEQklUUygxNCk7ICovCiAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHsKICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7" +
        "IH0KICAgICAgICBoYXZlLS07CiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgYml0cyArPSA4OwogICAgICB9CiAgICAgIC8vPT09Ly8KICAgICAgc3RhdGUubmxlbiA9ICho" +
        "b2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NzsKICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy8KICAgICAgaG9sZCA+Pj49IDU7CiAgICAgIGJpdHMgLT0gNTsKICAgICAgLy8tLS0vLwogICAgICBzdGF0" +
        "ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7CiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vCiAgICAgIGhvbGQgPj4+PSA1OwogICAgICBiaXRzIC09IDU7CiAgICAgIC8vLS0tLy8K" +
        "ICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0OwogICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vLwogICAgICBob2xkID4+Pj0gNDsKICAgICAgYml0cyAtPSA0OwogICAg" +
        "ICAvLy0tLS8vCi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAogICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7CiAgICAgICAgc3RybS5tc2cgPSAndG9vIG1hbnkg" +
        "bGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMnOwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KLy8jZW5kaWYKICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6" +
        "ICAgICAgIHRhYmxlIHNpemVzIG9rXG4iKSk7CiAgICAgIHN0YXRlLmhhdmUgPSAwOwogICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUzsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBMRU5MRU5T" +
        "OgogICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7CiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7CiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7CiAgICAgICAgICBpZiAoaGF2ZSA9PT0g" +
        "MCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAg" +
        "ICAvLz09PS8vCiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpOwogICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vCiAgICAgICAgaG9s" +
        "ZCA+Pj49IDM7CiAgICAgICAgYml0cyAtPSAzOwogICAgICAgIC8vLS0tLy8KICAgICAgfQogICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7CiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZl" +
        "KytdXSA9IDA7CiAgICAgIH0KICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC4KICAgICAgLy9zdGF0ZS5uZXh0" +
        "ID0gc3RhdGUuY29kZXM7CiAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7CiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZQogICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVu" +
        "ZHluOwogICAgICBzdGF0ZS5sZW5iaXRzID0gNzsKCiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTsKICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTks" +
        "IHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpOwogICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzOwoKICAgICAgaWYgKHJldCkgewogICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29k" +
        "ZSBsZW5ndGhzIHNldCc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9r" +
        "XG4iKSk7CiAgICAgIHN0YXRlLmhhdmUgPSAwOwogICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGNhc2UgQ09ERUxFTlM6CiAgICAgIHdoaWxlIChzdGF0" +
        "ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEp" +
        "XTsvKkJJVFMoc3RhdGUubGVuYml0cykqLwogICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7CiAgICAgICAgICBoZXJlX3Zh" +
        "bCA9IGhlcmUgJiAweGZmZmY7CgogICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH0KICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy8KICAgICAgICAgIGlmIChoYXZlID09" +
        "PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQogICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAvLy0t" +
        "LS8vCiAgICAgICAgfQogICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7CiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vCiAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAg" +
        "ICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAvLy0tLS8vCiAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAg" +
        "ICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7CiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpOwogICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjsKICAgICAgICAgICAgd2hpbGUg" +
        "KGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsr" +
        "XSA8PCBiaXRzOwogICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLz09PS8vCiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy8KICAgICAg" +
        "ICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgIC8vLS0tLy8KICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHsKICAgICAg" +
        "ICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JzsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAg" +
        "ICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdOwogICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpOwogICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAt" +
        "LS0vLwogICAgICAgICAgICBob2xkID4+Pj0gMjsKICAgICAgICAgICAgYml0cyAtPSAyOwogICAgICAgICAgICAvLy0tLS8vCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcp" +
        "IHsKICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7CiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzOwogICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsKICAgICAgICAgICAg" +
        "ICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAg" +
        "Yml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vPT09Ly8KICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vLwogICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRz" +
        "OwogICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgLy8tLS0vLwogICAgICAgICAgICBsZW4gPSAwOwogICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMp" +
        "OwogICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vLwogICAgICAgICAgICBob2xkID4+Pj0gMzsKICAgICAgICAgICAgYml0cyAtPSAzOwogICAgICAgICAgICAvLy0tLS8vCiAgICAgICAgICB9CiAg" +
        "ICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7CiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3OwogICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsK" +
        "ICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAg" +
        "ICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vPT09Ly8KICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vLwogICAgICAgICAgICBob2xkID4+" +
        "Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgLy8tLS0vLwogICAgICAgICAgICBsZW4gPSAwOwogICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4" +
        "N2YpOy8vQklUUyg3KTsKICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy8KICAgICAgICAgICAgaG9sZCA+Pj49IDc7CiAgICAgICAgICAgIGJpdHMgLT0gNzsKICAgICAgICAgICAgLy8tLS0vLwog" +
        "ICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7CiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBl" +
        "YXQnOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHsKICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0" +
        "ZS5oYXZlKytdID0gbGVuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqLwogICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7" +
        "IGJyZWFrOyB9CgogICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkgewogICAgICAgIHN0cm0ubXNn" +
        "ID0gJ2ludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMg" +
        "LS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cwogICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5o" +
        "CiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi8KICAgICAgc3RhdGUubGVuYml0cyA9IDk7CgogICAgICBvcHRzID0geyBiaXRz" +
        "OiBzdGF0ZS5sZW5iaXRzIH07CiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7CiAgICAg" +
        "IC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuCiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2lu" +
        "ZGV4OwogICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzOwogICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDsKCiAgICAgIGlmIChyZXQpIHsKICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlk" +
        "IGxpdGVyYWwvbGVuZ3RocyBzZXQnOwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjsKICAgICAgLy9zdGF0ZS5kaXN0Y29k" +
        "ZS5jb3B5KHN0YXRlLmNvZGVzKTsKICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlCiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjsKICAgICAgb3B0cyA9IHsgYml0czogc3Rh" +
        "dGUuZGlzdGJpdHMgfTsKICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRz" +
        "KTsKICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC4KICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMu" +
        "dGFibGVfaW5kZXg7CiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzOwogICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7CgogICAgICBpZiAocmV0KSB7CiAgICAgICAgc3RybS5tc2cg" +
        "PSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JzsKICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2Rl" +
        "cyBva1xuJykpOwogICAgICBzdGF0ZS5tb2RlID0gTEVOXzsKICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQogICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICBjYXNl" +
        "IExFTl86CiAgICAgIHN0YXRlLm1vZGUgPSBMRU47CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGNhc2UgTEVOOgogICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CiAgICAgICAgLy8t" +
        "LS0gUkVTVE9SRSgpIC0tLQogICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7CiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0OwogICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7CiAgICAgICAgc3RybS5h" +
        "dmFpbF9pbiA9IGhhdmU7CiAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7CiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7CiAgICAgICAgLy8tLS0KICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7CiAg" +
        "ICAgICAgLy8tLS0gTE9BRCgpIC0tLQogICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7CiAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7CiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0OwogICAgICAg" +
        "IG5leHQgPSBzdHJtLm5leHRfaW47CiAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luOwogICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkOwogICAgICAgIGJpdHMg" +
        "PSBzdGF0ZS5iaXRzOwogICAgICAgIC8vLS0tCgogICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7CiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAg" +
        "ICB9CiAgICAgIHN0YXRlLmJhY2sgPSAwOwogICAgICBmb3IgKDs7KSB7CiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0" +
        "ZS5sZW5iaXRzKSovCiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmOwogICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjsK" +
        "CiAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7IGJyZWFrOyB9CiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vLwogICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQog" +
        "ICAgICAgIGhhdmUtLTsKICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgLy8tLS0vLwogICAgICB9CiAgICAgIGlmIChoZXJlX29wICYmICho" +
        "ZXJlX29wICYgMHhmMCkgPT09IDApIHsKICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7CiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7CiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDsKICAgICAgICBm" +
        "b3IgKDs7KSB7CiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArCiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRT" +
        "KGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07CiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjsKICAg" +
        "ICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjsKCiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfQogICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAt" +
        "LS0vLwogICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgICBoYXZlLS07CiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAg" +
        "IGJpdHMgKz0gODsKICAgICAgICAgIC8vLS0tLy8KICAgICAgICB9CiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vLwogICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7CiAgICAgICAgYml0" +
        "cyAtPSBsYXN0X2JpdHM7CiAgICAgICAgLy8tLS0vLwogICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzOwogICAgICB9CiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy8KICAgICAgaG9s" +
        "ZCA+Pj49IGhlcmVfYml0czsKICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgIC8vLS0tLy8KICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7CiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsOwog" +
        "ICAgICBpZiAoaGVyZV9vcCA9PT0gMCkgewogICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CiAgICAgICAgLy8gICAgICAgICJpbmZsYXRlOiAg" +
        "ICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CiAgICAgICAgLy8gICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOwogICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7CiAg" +
        "ICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGhlcmVfb3AgJiAzMikgewogICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKICAgICAgICBz" +
        "dGF0ZS5iYWNrID0gLTE7CiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGhlcmVfb3AgJiA2NCkgewogICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQg" +
        "bGl0ZXJhbC9sZW5ndGggY29kZSc7CiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTsKICAgICAgc3RhdGUubW9k" +
        "ZSA9IExFTkVYVDsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBMRU5FWFQ6CiAgICAgIGlmIChzdGF0ZS5leHRyYSkgewogICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTsKICAg" +
        "ICAgICBuID0gc3RhdGUuZXh0cmE7CiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICAgIGhhdmUtLTsKICAgICAg" +
        "ICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICAvLz09PS8vCiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwg" +
        "c3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87CiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vCiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhOwogICAgICAg" +
        "IGJpdHMgLT0gc3RhdGUuZXh0cmE7CiAgICAgICAgLy8tLS0vLwogICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7CiAgICAgIH0KICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAg" +
        "ICAgIGxlbmd0aCAldVxuIiwgc3RhdGUubGVuZ3RoKSk7CiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDsKICAgICAgc3RhdGUubW9kZSA9IERJU1Q7CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAg" +
        "IGNhc2UgRElTVDoKICAgICAgZm9yICg7OykgewogICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUuZGlzdGJpdHMpKi8K" +
        "ICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7CiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmOwoKICAgICAgICBpZiAo" +
        "KGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfQogICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy8KICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH0KICAgICAgICBoYXZl" +
        "LS07CiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgYml0cyArPSA4OwogICAgICAgIC8vLS0tLy8KICAgICAgfQogICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkg" +
        "ewogICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0czsKICAgICAgICBsYXN0X29wID0gaGVyZV9vcDsKICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgIGhl" +
        "cmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArCiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3Ap" +
        "Ki8gPj4gbGFzdF9iaXRzKV07CiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjsKICAgICAgICAgIGhlcmVfdmFsID0gaGVy" +
        "ZSAmIDB4ZmZmZjsKCiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfQogICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vLwogICAgICAgICAgaWYgKGhh" +
        "dmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgICBoYXZlLS07CiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAg" +
        "IC8vLS0tLy8KICAgICAgICB9CiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vLwogICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7CiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7CiAgICAg" +
        "ICAgLy8tLS0vLwogICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzOwogICAgICB9CiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy8KICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAg" +
        "ICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgIC8vLS0tLy8KICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7CiAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlk" +
        "IGRpc3RhbmNlIGNvZGUnOwogICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7CiAgICAgIHN0YXRlLmV4dHJhID0gKGhl" +
        "cmVfb3ApICYgMTU7CiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUOwogICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICBjYXNlIERJU1RFWFQ6CiAgICAgIGlmIChzdGF0ZS5leHRyYSkgewogICAgICAgIC8v" +
        "PT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTsKICAgICAgICBuID0gc3RhdGUuZXh0cmE7CiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVh" +
        "dmU7IH0KICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICAvLz09PS8vCiAgICAgICAg" +
        "c3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87CiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vCiAgICAgICAg" +
        "aG9sZCA+Pj49IHN0YXRlLmV4dHJhOwogICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7CiAgICAgICAgLy8tLS0vLwogICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7CiAgICAgIH0KLy8jaWZkZWYg" +
        "SU5GTEFURV9TVFJJQ1QKICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHsKICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7CiAgICAgICAgc3RhdGUu" +
        "bW9kZSA9IEJBRDsKICAgICAgICBicmVhazsKICAgICAgfQovLyNlbmRpZgogICAgICAvL1RyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLm9mZnNldCkpOwog" +
        "ICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGNhc2UgTUFUQ0g6CiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQogICAgICBjb3B5" +
        "ID0gX291dCAtIGxlZnQ7CiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqLwogICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5OwogICAg" +
        "ICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHsKICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7CiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJzsKICAgICAg" +
        "ICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9Ci8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsCi8vIGRvbid0IGVuYWJsZSBp" +
        "dCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkKLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlLmMgdG9v" +
        "IGZhclxuIikpOwovLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlOwovLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9Ci8vICAgICAgICAgIGlm" +
        "IChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfQovLyAgICAgICAgICBsZWZ0IC09IGNvcHk7Ci8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5OwovLyAgICAgICAgICBkbyB7Ci8vICAgICAgICAg" +
        "ICAgb3V0cHV0W3B1dCsrXSA9IDA7Ci8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7Ci8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfQovLyAgICAgICAg" +
        "ICBicmVhazsKLy8jZW5kaWYKICAgICAgICB9CiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkgewogICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDsKICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6" +
        "ZSAtIGNvcHk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29w" +
        "eSA9IHN0YXRlLmxlbmd0aDsgfQogICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93OwogICAgICB9CiAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBv" +
        "dXRwdXQgKi8KICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDsKICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0OwogICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYg" +
        "KGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9CiAgICAgIGxlZnQgLT0gY29weTsKICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7CiAgICAgIGRvIHsKICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9z" +
        "b3VyY2VbZnJvbSsrXTsKICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBMSVQ6CiAg" +
        "ICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfQogICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoOwogICAgICBsZWZ0LS07CiAgICAgIHN0YXRlLm1vZGUgPSBMRU47CiAgICAg" +
        "IGJyZWFrOwogICAgY2FzZSBDSEVDSzoKICAgICAgaWYgKHN0YXRlLndyYXApIHsKICAgICAgICAvLz09PSBORUVEQklUUygzMik7CiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgaWYgKGhh" +
        "dmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWQK" +
        "ICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICAvLz09PS8vCiAgICAgICAgX291dCAtPSBsZWZ0OwogICAgICAgIHN0" +
        "cm0udG90YWxfb3V0ICs9IF9vdXQ7CiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDsKICAgICAgICBpZiAoX291dCkgewogICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0KICAgICAgICAgICAg" +
        "ICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki8KICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6" +
        "IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpOwoKICAgICAgICB9CiAgICAgICAgX291dCA9IGxlZnQ7CiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQg" +
        "MzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b28KICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykgewogICAgICAgICAgc3Ry" +
        "bS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snOwogICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLz09PSBJTklUQklUUygpOwogICAgICAg" +
        "IGhvbGQgPSAwOwogICAgICAgIGJpdHMgPSAwOwogICAgICAgIC8vPT09Ly8KICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKICAgICAgfQog" +
        "ICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIOwogICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICBjYXNlIExFTkdUSDoKICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHsKICAgICAgICAvLz09" +
        "PSBORUVEQklUUygzMik7CiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9CiAgICAgICAgICBoYXZlLS07CiAgICAgICAgICBo" +
        "b2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICB9CiAgICAgICAgLy89PT0vLwogICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZm" +
        "ZmZmKSkgewogICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7CiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8v" +
        "PT09IElOSVRCSVRTKCk7CiAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgYml0cyA9IDA7CiAgICAgICAgLy89PT0vLwogICAgICAgIC8vVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVz" +
        "IHRyYWlsZXJcbiIpKTsKICAgICAgfQogICAgICBzdGF0ZS5tb2RlID0gRE9ORTsKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgY2FzZSBET05FOgogICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CiAgICAg" +
        "IGJyZWFrIGluZl9sZWF2ZTsKICAgIGNhc2UgQkFEOgogICAgICByZXQgPSBaX0RBVEFfRVJST1I7CiAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgIGNhc2UgTUVNOgogICAgICByZXR1cm4gWl9NRU1fRVJST1I7" +
        "CiAgICBjYXNlIFNZTkM6CiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICB9CgogIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlz" +
        "IHJlYWwgcGxhY2UgZm9yICJnb3RvIGluZl9sZWF2ZSIsIGVtdWxhdGVkIHZpYSAiYnJlYWsgaW5mX2xlYXZlIgoKICAvKgogICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNv" +
        "dW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgogICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKICAgICBlcnJvci4gIENhbGwgdXBk" +
        "YXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuCiAgICov" +
        "CgogIC8vLS0tIFJFU1RPUkUoKSAtLS0KICBzdHJtLm5leHRfb3V0ID0gcHV0OwogIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDsKICBzdHJtLm5leHRfaW4gPSBuZXh0OwogIHN0cm0uYXZhaWxfaW4gPSBoYXZlOwog" +
        "IHN0YXRlLmhvbGQgPSBob2xkOwogIHN0YXRlLmJpdHMgPSBiaXRzOwogIC8vLS0tCgogIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJgog" +
        "ICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkgewogICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291" +
        "dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkgewogICAgICBzdGF0ZS5tb2RlID0gTUVNOwogICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICB9CiAgfQogIF9pbiAtPSBzdHJtLmF2YWlsX2luOwogIF9vdXQg" +
        "LT0gc3RybS5hdmFpbF9vdXQ7CiAgc3RybS50b3RhbF9pbiArPSBfaW47CiAgc3RybS50b3RhbF9vdXQgKz0gX291dDsKICBzdGF0ZS50b3RhbCArPSBfb3V0OwogIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHsK" +
        "ICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki8KICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hl" +
        "Y2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpOwogIH0KICBzdHJtLmRhdGFfdHlw" +
        "ZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgKwogICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgKwogICAgICAgICAgICAgICAgICAgIChzdGF0" +
        "ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7CiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBa" +
        "X09LKSB7CiAgICByZXQgPSBaX0JVRl9FUlJPUjsKICB9CiAgcmV0dXJuIHJldDsKfQoKZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7CgogIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpm" +
        "cmVlID09IChmcmVlX2Z1bmMpMCovKSB7CiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgfQoKICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlOwogIGlmIChzdGF0ZS53aW5kb3cpIHsKICAgIHN0YXRlLndpbmRv" +
        "dyA9IG51bGw7CiAgfQogIHN0cm0uc3RhdGUgPSBudWxsOwogIHJldHVybiBaX09LOwp9CgpmdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHsKICB2YXIgc3RhdGU7CgogIC8qIGNoZWNrIHN0" +
        "YXRlICovCiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfQogIHN0YXRlID0gc3RybS5zdGF0ZTsKICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1" +
        "cm4gWl9TVFJFQU1fRVJST1I7IH0KCiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovCiAgc3RhdGUuaGVhZCA9IGhlYWQ7CiAgaGVhZC5kb25lID0gZmFsc2U7CiAgcmV0dXJuIFpfT0s7Cn0KCmZ1bmN0aW9u" +
        "IGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHsKICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoOwoKICB2YXIgc3RhdGU7CiAgdmFyIGRpY3RpZDsKICB2YXIgcmV0OwoK" +
        "ICAvKiBjaGVjayBzdGF0ZSAqLwogIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfQogIHN0YXRlID0gc3Ry" +
        "bS5zdGF0ZTsKCiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkgewogICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogIH0KCiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlv" +
        "bmFyeSBpZGVudGlmaWVyICovCiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHsKICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqLwogICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQs" +
        "IGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqLwogICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHsK" +
        "ICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKICAgIH0KICB9CiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGUKICAgZXhpc3Rp" +
        "bmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqLwogIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTsKICBpZiAocmV0KSB7CiAgICBzdGF0ZS5t" +
        "b2RlID0gTUVNOwogICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogIH0KICBzdGF0ZS5oYXZlZGljdCA9IDE7CiAgLy8gVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XG4iKSk7CiAgcmV0" +
        "dXJuIFpfT0s7Cn0KCmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0OwpleHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyOwpleHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZs" +
        "YXRlUmVzZXRLZWVwOwpleHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7CmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyOwpleHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlOwpleHBvcnRz" +
        "LmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kOwpleHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyOwpleHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25h" +
        "cnk7CmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7CgovKiBOb3QgaW1wbGVtZW50ZWQKZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5Owpl" +
        "eHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7CmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyazsKZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJp" +
        "bWU7CmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYzsKZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDsKZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVu" +
        "ZGVybWluZTsKKi8KCn0seyIuLi91dGlscy9jb21tb24iOjQxLCIuL2FkbGVyMzIiOjQzLCIuL2NyYzMyIjo0NSwiLi9pbmZmYXN0Ijo0OCwiLi9pbmZ0cmVlcyI6NTB9XSw1MDpbZnVuY3Rpb24ocmVxdWlyZSxt" +
        "b2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgovLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJl" +
        "eSBUdXBpdHNpbgovLwovLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAovLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0" +
        "aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLy8KLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1" +
        "c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLy8gZnJlZWx5LCBz" +
        "dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgovLwovLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAovLyAg" +
        "IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVj" +
        "dCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBz" +
        "dWNoLCBhbmQgbXVzdCBub3QgYmUKLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVk" +
        "IGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTsKCnZhciBNQVhCSVRTID0gMTU7CnZhciBFTk9VR0hfTEVOUyA9IDg1MjsKdmFyIEVO" +
        "T1VHSF9ESVNUUyA9IDU5MjsKLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7Cgp2YXIgQ09ERVMgPSAwOwp2YXIgTEVOUyA9IDE7CnZhciBESVNUUyA9IDI7Cgp2YXIgbGJhc2UgPSBb" +
        "IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5" +
        "OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMApdOwoKdmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAx" +
        "NiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LAogIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzgKXTsKCnZhciBkYmFzZSA9IFsgLyogRGlz" +
        "dGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLwogIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1Mzcs" +
        "IDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMApdOwoKdmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovCiAgMTYsIDE2LCAx" +
        "NiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsCiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2" +
        "NApdOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpCnsKICB2YXIgYml0" +
        "cyA9IG9wdHMuYml0czsKICAgICAgLy9oZXJlID0gb3B0cy5oZXJlOyAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KCiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVu" +
        "Z3RoIGluIGJpdHMgKi8KICB2YXIgc3ltID0gMDsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQg" +
        "bWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLwogIHZhciBjdXJyID0gMDsgICAgICAgICAg" +
        "ICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovCiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLwogIHZh" +
        "ciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi8KICB2YXIgdXNlZCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFi" +
        "bGUgdXNlZCAqLwogIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLwogIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLwog" +
        "IHZhciBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkg" +
        "Ki8KICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KICB2YXIgbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KICB2" +
        "YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLwogIHZhciBiYXNlX2luZGV4ID0gMDsKLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2Ug" +
        "Ki8KICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi8KICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAv" +
        "L1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KICB2YXIgb2ZmcyA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBv" +
        "ZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLwogIHZhciBleHRyYSA9IG51bGw7CiAgdmFyIGV4dHJhX2luZGV4ID0gMDsKCiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7CgogIC8q" +
        "CiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGUKICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBs" +
        "ZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlCiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCiAgIHN5bWJvbHMgYnkgbGVuZ3Ro" +
        "IGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyCiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJv" +
        "IGJpdHMKICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVy" +
        "b3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGgKICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkcwogICBmcm9tIHRoZWlyIG1vcmUg" +
        "bmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNv" +
        "ZGVzCiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuCgogICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpbgogICBsZW5zW10gYXJl" +
        "IGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgogICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRo" +
        "YXQgdGhhdAogICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLgoKICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLAog" +
        "ICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBp" +
        "biBvcmRlciBpbiB0aGUgc29ydGVkCiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieQogICB0aGUgY2FsbGVyLgoKICAgVGhlIGxl" +
        "bmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZwogICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRo" +
        "ZXJlIGFyZSBhbnkKICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWQKICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3Vi" +
        "LXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCiAgIGRlY29kaW5nIHRhYmxlcy4KICAgKi8KCiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1B" +
        "WEJJVFMpICovCiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKICAgIGNvdW50W2xlbl0gPSAwOwogIH0KICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykgewogICAgY291" +
        "bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKzsKICB9CgogIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovCiAgcm9vdCA9IGJpdHM7CiAgZm9y" +
        "IChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHsKICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9CiAgfQogIGlmIChyb290ID4gbWF4KSB7CiAgICByb290ID0gbWF4OwogIH0KICBp" +
        "ZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLwogICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0g" +
        "KHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7CiAgICAvL3Rh" +
        "YmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwOwogICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDsKCgog" +
        "ICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OwogICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsKICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOwog" +
        "ICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDsKCiAgICBvcHRzLmJpdHMgPSAxOwogICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3Ig" +
        "ZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovCiAgfQogIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykgewogICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH0KICB9CiAgaWYgKHJvb3Qg" +
        "PCBtaW4pIHsKICAgIHJvb3QgPSBtaW47CiAgfQoKICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KICBsZWZ0ID0gMTsKICBmb3IgKGxlbiA9" +
        "IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgewogICAgbGVmdCA8PD0gMTsKICAgIGxlZnQgLT0gY291bnRbbGVuXTsKICAgIGlmIChsZWZ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9ICAgICAgICAv" +
        "KiBvdmVyLXN1YnNjcmliZWQgKi8KICB9CiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7CiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29t" +
        "cGxldGUgc2V0ICovCiAgfQoKICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLwogIG9mZnNbMV0gPSAwOwogIGZvciAobGVuID0gMTsg" +
        "bGVuIDwgTUFYQklUUzsgbGVuKyspIHsKICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOwogIH0KCiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdp" +
        "dGhpbiBlYWNoIGxlbmd0aCAqLwogIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7CiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkgewogICAgICB3b3JrW29mZnNbbGVuc1ts" +
        "ZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07CiAgICB9CiAgfQoKICAvKgogICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmcKICAgZmls" +
        "bGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBp" +
        "bmRleCBieSBkcm9wcGluZyBkcm9wCiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VyciwKICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJy" +
        "IC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bwogICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KCiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBp" +
        "bmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHMKICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5k" +
        "ZXgKICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3Ag" +
        "aXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzCiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC4KCiAgIFdoZW4gYSBuZXcgc3ViLXRh" +
        "YmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlCiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVu" +
        "Z3RoCiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlCiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy4KCiAgIHVzZWQga2VlcHMgdHJh" +
        "Y2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlCiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFi" +
        "bGVzIGFnYWluc3QKICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpbgogICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29u" +
        "c3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRl" +
        "cm1pbmF0ZXMgd2hlbgogICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVz" +
        "LCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHMKICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgogICAqLwoKICAvKiBzZXQg" +
        "dXAgZm9yIGNvZGUgdHlwZSAqLwogIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLAogIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjgKICBpZiAodHlw" +
        "ZSA9PT0gQ09ERVMpIHsKICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqLwogICAgZW5kID0gMTk7CgogIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykgewogICAg" +
        "YmFzZSA9IGxiYXNlOwogICAgYmFzZV9pbmRleCAtPSAyNTc7CiAgICBleHRyYSA9IGxleHQ7CiAgICBleHRyYV9pbmRleCAtPSAyNTc7CiAgICBlbmQgPSAyNTY7CgogIH0gZWxzZSB7ICAgICAgICAgICAgICAg" +
        "ICAgICAvKiBESVNUUyAqLwogICAgYmFzZSA9IGRiYXNlOwogICAgZXh0cmEgPSBkZXh0OwogICAgZW5kID0gLTE7CiAgfQoKICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi8KICBodWZmID0gMDsgICAg" +
        "ICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqLwogIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqLwogIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAg" +
        "ICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqLwogIG5leHQgPSB0YWJsZV9pbmRleDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLwogIGN1cnIgPSByb290OyAgICAgICAgICAg" +
        "ICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLwogIGxvdyA9" +
        "IC0xOyAgICAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmll" +
        "cyAqLwogIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCgogIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqLwogIGlmICgodHlwZSA9PT0gTEVO" +
        "UyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8CiAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHsKICAgIHJldHVybiAxOwogIH0KCiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5k" +
        "IG1ha2UgdGFibGUgZW50cmllcyAqLwogIGZvciAoOzspIHsKICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLwogICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDsKICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHsK" +
        "ICAgICAgaGVyZV9vcCA9IDA7CiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dOwogICAgfQogICAgZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7CiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCAr" +
        "IHdvcmtbc3ltXV07CiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTsKICAgIH0KICAgIGVsc2UgewogICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2Yg" +
        "YmxvY2sgKi8KICAgICAgaGVyZV92YWwgPSAwOwogICAgfQoKICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCiAgICBpbmNyID0gMSA8" +
        "PCAobGVuIC0gZHJvcCk7CiAgICBmaWxsID0gMSA8PCBjdXJyOwogICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi8KICAgIGRvIHsKICAgICAgZmls" +
        "bCAtPSBpbmNyOwogICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IChoZXJlX2JpdHMgPDwgMjQpIHwgKGhlcmVfb3AgPDwgMTYpIHwgaGVyZV92YWwgfDA7CiAgICB9IHdoaWxlIChm" +
        "aWxsICE9PSAwKTsKCiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLwogICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpOwogICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7CiAg" +
        "ICAgIGluY3IgPj49IDE7CiAgICB9CiAgICBpZiAoaW5jciAhPT0gMCkgewogICAgICBodWZmICY9IGluY3IgLSAxOwogICAgICBodWZmICs9IGluY3I7CiAgICB9IGVsc2UgewogICAgICBodWZmID0gMDsKICAg" +
        "IH0KCiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi8KICAgIHN5bSsrOwogICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkgewogICAgICBpZiAobGVuID09PSBtYXgpIHsgYnJl" +
        "YWs7IH0KICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTsKICAgIH0KCiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi8KICAgIGlmIChsZW4gPiByb290ICYmICho" +
        "dWZmICYgbWFzaykgIT09IGxvdykgewogICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi8KICAgICAgaWYgKGRyb3AgPT09IDApIHsKICAgICAgICBkcm9wID0gcm9vdDsK" +
        "ICAgICAgfQoKICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqLwogICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi8KCiAgICAgIC8qIGRldGVy" +
        "bWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLwogICAgICBjdXJyID0gbGVuIC0gZHJvcDsKICAgICAgbGVmdCA9IDEgPDwgY3VycjsKICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7CiAgICAgICAg" +
        "bGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07CiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfQogICAgICAgIGN1cnIrKzsKICAgICAgICBsZWZ0IDw8PSAxOwogICAgICB9CgogICAgICAvKiBjaGVj" +
        "ayBmb3IgZW5vdWdoIHNwYWNlICovCiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyOwogICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fAogICAgICAgICh0eXBlID09PSBESVNU" +
        "UyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkgewogICAgICAgIHJldHVybiAxOwogICAgICB9CgogICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLwogICAgICBsb3cgPSBo" +
        "dWZmICYgbWFzazsKICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjsKICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDsKICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsq" +
        "LwogICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7CiAgICB9CiAgfQoKICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRy" +
        "eSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZQogICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZQogICBtYXhp" +
        "bXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovCiAgaWYgKGh1ZmYgIT09IDApIHsKICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAg" +
        "ICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLwogICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7CiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwOwogICAgdGFi" +
        "bGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwOwogIH0KCiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7" +
        "CiAgb3B0cy5iaXRzID0gcm9vdDsKICByZXR1cm4gMDsKfTsKCn0seyIuLi91dGlscy9jb21tb24iOjQxfV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewondXNlIHN0cmljdCc7CgovLyAo" +
        "QykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBw" +
        "cm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2Vz" +
        "Ci8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vCi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAov" +
        "LyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9u" +
        "czoKLy8KLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwg" +
        "c29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQovLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQovLyAgIGFwcHJl" +
        "Y2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi8vICAgbWlzcmVwcmVz" +
        "ZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgovLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKbW9k" +
        "dWxlLmV4cG9ydHMgPSB7CiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFN" +
        "X0VORCAgICAgIDEgICovCiAgMDogICAgICAnJywgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8g" +
        "ICAgICAgICAoLTEpICovCiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCiAgJy0zJzogICAnZGF0YSBlcnJvcicsICAgICAgICAgIC8qIFpfREFUQV9F" +
        "UlJPUiAgICAoLTMpICovCiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VS" +
        "Uk9SICAgICAoLTUpICovCiAgJy02JzogICAnaW5jb21wYXRpYmxlIHZlcnNpb24nIC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCn07Cgp9LHt9XSw1MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0" +
        "cyl7Cid1c2Ugc3RyaWN0JzsKCi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgovLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpbgov" +
        "LwovLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAovLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxk" +
        "IGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLy8KLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0" +
        "d2FyZSBmb3IgYW55IHB1cnBvc2UsCi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRo" +
        "ZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgovLwovLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAovLyAgIGNsYWltIHRoYXQg" +
        "eW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0" +
        "aW9uIHdvdWxkIGJlCi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVz" +
        "dCBub3QgYmUKLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNv" +
        "dXJjZSBkaXN0cmlidXRpb24uCgp2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTsKCi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PSovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLy92YXIgWl9GSUxURVJF" +
        "RCAgICAgICAgICA9IDE7Ci8vdmFyIFpfSFVGRk1BTl9PTkxZICAgICAgPSAyOwovL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMzsKdmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7Ci8vdmFyIFpfREVG" +
        "QVVMVF9TVFJBVEVHWSAgPSAwOwoKLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLwp2YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDsK" +
        "dmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7Ci8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVAp2YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjsKCi8qPT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgt" +
        "LWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9CgovLyBGcm9tIHp1dGlsLmgKCnZhciBTVE9SRURfQkxPQ0sgPSAwOwp2YXIgU1RBVElDX1RSRUVTID0gMTsKdmFyIERZTl9UUkVFUyAgICA9IDI7Ci8qIFRo" +
        "ZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCgp2YXIgTUlOX01BVENIICAgID0gMzsKdmFyIE1BWF9NQVRDSCAgICA9IDI1ODsKLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAq" +
        "LwoKLy8gRnJvbSBkZWZsYXRlLmgKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEludGVybmFsIGNvbXByZXNz" +
        "aW9uIHN0YXRlLgogKi8KCnZhciBMRU5HVEhfQ09ERVMgID0gMjk7Ci8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLwoKdmFyIExJVEVS" +
        "QUxTICAgICAgPSAyNTY7Ci8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLwoKdmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7Ci8qIG51bWJlciBvZiBMaXRl" +
        "cmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwoKdmFyIERfQ09ERVMgICAgICAgPSAzMDsKLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCgp2YXIgQkxfQ09E" +
        "RVMgICAgICA9IDE5OwovKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KCnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxOwovKiBtYXhpbXVtIGhl" +
        "YXAgc2l6ZSAqLwoKdmFyIE1BWF9CSVRTICAgICAgPSAxNTsKLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCgp2YXIgQnVmX3NpemUgICAgICA9IDE2OwovKiBzaXplIG9mIGJp" +
        "dCBidWZmZXIgaW4gYmlfYnVmICovCgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIENvbnN0YW50cwogKi8K" +
        "CnZhciBNQVhfQkxfQklUUyA9IDc7Ci8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KCnZhciBFTkRfQkxPQ0sgICA9IDI1NjsKLyogZW5kIG9mIGJsb2NrIGxp" +
        "dGVyYWwgY29kZSAqLwoKdmFyIFJFUF8zXzYgICAgID0gMTY7Ci8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KCnZhciBSRVBaXzNfMTAg" +
        "ICA9IDE3OwovKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KCnZhciBSRVBaXzExXzEzOCA9IDE4OwovKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAx" +
        "MS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLwoKLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi8KdmFyIGV4dHJhX2xiaXRzID0gICAv" +
        "KiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCiAgWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF07Cgp2YXIgZXh0cmFfZGJpdHMgPSAg" +
        "IC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLwogIFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXTsKCnZhciBl" +
        "eHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KICBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN107Cgp2YXIgYmxfb3JkZXIgPQogIFsx" +
        "NiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTsKLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqLwoKLyogVGhlIGxlbmd0aHMg" +
        "b2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZwogKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0" +
        "IGxlbmd0aCBjb2Rlcy4KICovCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogTG9jYWwgZGF0YS4gVGhlc2Ug" +
        "YXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KICovCgovLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2FwcwoKdmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNl" +
        "ZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqLwoKLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnNkZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzEKdmFyIHN0YXRp" +
        "Y19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpOwp6ZXJvKHN0YXRpY19sdHJlZSk7Ci8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9z" +
        "ZWQsIHRoZXJlIGlzIG5vCiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyCiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUg" +
        "bmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdAogKiBiZWxvdykuCiAqLwoKdmFyIHN0YXRpY19kdHJlZSAgPSBuZXcgQXJyYXkoRF9DT0RFUyAqIDIpOwp6ZXJvKHN0YXRpY19k" +
        "dHJlZSk7Ci8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKICogNSBiaXRzLikKICovCgp2YXIgX2Rpc3RfY29kZSAgICA9IG5l" +
        "dyBBcnJheShESVNUX0NPREVfTEVOKTsKemVybyhfZGlzdF9jb2RlKTsKLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcwogKiAzIC4uIDI1" +
        "OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLgogKi8KCnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9N" +
        "QVRDSCAtIE1JTl9NQVRDSCArIDEpOwp6ZXJvKF9sZW5ndGhfY29kZSk7Ci8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KCnZhciBiYXNl" +
        "X2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7Cnplcm8oYmFzZV9sZW5ndGgpOwovKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLwoKdmFy" +
        "IGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyk7Cnplcm8oYmFzZV9kaXN0KTsKLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi8K" +
        "CgpmdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHsKCiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsg" +
        "IC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KICB0aGlzLmV4dHJhX2Jhc2Ug" +
        "ICA9IGV4dHJhX2Jhc2U7ICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqLwogIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0" +
        "cmVlICovCiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KCiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1" +
        "bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzCiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7Cn0KCgp2YXIgc3RhdGljX2xfZGVzYzsKdmFy" +
        "IHN0YXRpY19kX2Rlc2M7CnZhciBzdGF0aWNfYmxfZGVzYzsKCgpmdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7CiAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOyAgICAgLyogdGhlIGR5" +
        "bmFtaWMgdHJlZSAqLwogIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwogIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAg" +
        "IC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovCn0KCgoKZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHsKICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1" +
        "NiArIChkaXN0ID4+PiA3KV07Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogT3V0cHV0IGEgc2hvcnQg" +
        "TFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uCiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KICovCmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7Ci8vICAgIHB1dF9i" +
        "eXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTsKLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOwogIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjsKICBzLnBlbmRp" +
        "bmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT0KICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLgogKi8KZnVuY3Rpb24g" +
        "c2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHsKICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHsKICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjsK" +
        "ICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7CiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpOwogICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKICB9IGVs" +
        "c2UgewogICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmOwogICAgcy5iaV92YWxpZCArPSBsZW5ndGg7CiAgfQp9CgoKZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHsK" +
        "ICBzZW5kX2JpdHMocywgdHJlZVtjICogMl0vKi5Db2RlKi8sIHRyZWVbYyAqIDIgKyAxXS8qLkxlbiovKTsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlcgogKiBtZXRob2Qgd291bGQg" +
        "dXNlIGEgdGFibGUpCiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTUKICovCmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7CiAgdmFyIHJlcyA9IDA7CiAgZG8gewogICAgcmVzIHw9IGNvZGUg" +
        "JiAxOwogICAgY29kZSA+Pj49IDE7CiAgICByZXMgPDw9IDE7CiAgfSB3aGlsZSAoLS1sZW4gPiAwKTsKICByZXR1cm4gcmVzID4+PiAxOwp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LgogKi8KZnVuY3Rpb24gYmlfZmx1c2go" +
        "cykgewogIGlmIChzLmJpX3ZhbGlkID09PSAxNikgewogICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTsKICAgIHMuYmlfYnVmID0gMDsKICAgIHMuYmlfdmFsaWQgPSAwOwoKICB9IGVsc2UgaWYgKHMuYmlfdmFs" +
        "aWQgPj0gOCkgewogICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7CiAgICBzLmJpX2J1ZiA+Pj0gODsKICAgIHMuYmlfdmFsaWQgLT0gODsKICB9Cn0KCgovKiA9PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1" +
        "cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGgKICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFu" +
        "ZAogKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgogKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwg" +
        "Yml0IGxlbmd0aCwgdGhlCiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVk" +
        "OyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcwogKiAgICAgbm90IG51bGwuCiAqLwpmdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpCi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8vICAg" +
        "IHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLwp7CiAgdmFyIHRyZWUgICAgICAgICAgICA9IGRlc2MuZHluX3RyZWU7CiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4" +
        "X2NvZGU7CiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlOwogIHZhciBoYXNfc3RyZWUgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7CiAgdmFyIGV4dHJh" +
        "ICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7CiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7CiAgdmFyIG1heF9sZW5ndGggICAgICA9IGRlc2Mu" +
        "c3RhdF9kZXNjLm1heF9sZW5ndGg7CiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovCiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8K" +
        "ICB2YXIgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi8KICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi8KICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLwogIHZh" +
        "ciBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KCiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICBz" +
        "LmJsX2NvdW50W2JpdHNdID0gMDsKICB9CgogIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2Yg" +
        "dGhlIGJpdCBsZW5ndGggdHJlZSkuCiAgICovCiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0vKi5MZW4qLyA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KCiAgZm9yIChoID0gcy5oZWFwX21h" +
        "eCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykgewogICAgbiA9IHMuaGVhcFtoXTsKICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxOwogICAgaWYgKGJp" +
        "dHMgPiBtYXhfbGVuZ3RoKSB7CiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoOwogICAgICBvdmVyZmxvdysrOwogICAgfQogICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSBiaXRzOwogICAgLyogV2Ugb3Zlcndy" +
        "aXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KCiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqLwoKICAgIHMuYmxfY291bnRb" +
        "Yml0c10rKzsKICAgIHhiaXRzID0gMDsKICAgIGlmIChuID49IGJhc2UpIHsKICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07CiAgICB9CiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87CiAgICBzLm9w" +
        "dF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpOwogICAgaWYgKGhhc19zdHJlZSkgewogICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7CiAgICB9CiAg" +
        "fQogIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH0KCiAgLy8gVHJhY2UoKHN0ZGVyciwiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9i" +
        "ajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KCiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KICBkbyB7CiAgICBiaXRzID0gbWF4X2xlbmd0" +
        "aCAtIDE7CiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH0KICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KICAg" +
        "IHMuYmxfY291bnRbYml0cyArIDFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKICAgIC8qIFRoZSBicm90aGVy" +
        "IG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsCiAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KICAgICAqLwogICAgb3ZlcmZsb3cg" +
        "LT0gMjsKICB9IHdoaWxlIChvdmVyZmxvdyA+IDApOwoKICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCiAgICogaCBpcyBzdGlsbCBl" +
        "cXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAogICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRh" +
        "a2VuCiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCiAgICovCiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7CiAgICBuID0gcy5ibF9jb3Vu" +
        "dFtiaXRzXTsKICAgIHdoaWxlIChuICE9PSAwKSB7CiAgICAgIG0gPSBzLmhlYXBbLS1oXTsKICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfQogICAgICBpZiAodHJlZVttICogMiArIDFdLyou" +
        "TGVuKi8gIT09IGJpdHMpIHsKICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLCJjb2RlICVkIGJpdHMgJWQtPiVkXG4iLCBtLCB0cmVlW21dLkxlbiwgYml0cykpOwogICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAt" +
        "IHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovOwogICAgICAgIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovID0gYml0czsKICAgICAgfQogICAgICBuLS07CiAgICB9CiAgfQp9" +
        "CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVl" +
        "IGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQogKiBvcHRpbWFsKS4KICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBm" +
        "b3IKICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJl" +
        "ZSBlbGVtZW50cyBvZiBub24KICogICAgIHplcm8gY29kZSBsZW5ndGguCiAqLwpmdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KQovLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAg" +
        "ICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLwovLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KLy8gICAgdXNoZiAq" +
        "YmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqLwp7CiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpOyAvKiBuZXh0IGNvZGUg" +
        "dmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLwogIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqLwogIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBp" +
        "bmRleCAqLwogIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi8KCiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUg" +
        "dmFsdWVzCiAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCiAgICovCiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUg" +
        "KyBibF9jb3VudFtiaXRzIC0gMV0pIDw8IDE7CiAgfQogIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGUKICAgKiBtdXN0IGJlIGFs" +
        "bCBvbmVzLgogICAqLwogIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAogIC8vICAgICAgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKICAvL1Ry" +
        "YWNldigoc3RkZXJyLCJcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgIiwgbWF4X2NvZGUpKTsKCiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgewogICAgdmFyIGxlbiA9IHRyZWVbbiAqIDIgKyAx" +
        "XS8qLkxlbiovOwogICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfQogICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KICAgIHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2Nv" +
        "ZGVbbGVuXSsrLCBsZW4pOwoKICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVyciwiXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpICIsCiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikg" +
        "PyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTsKICB9Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT0KICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy4KICovCmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkgewogIHZhciBuOyAgICAgICAgLyogaXRlcmF0" +
        "ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqLwogIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovCiAgdmFyIGNvZGU7ICAgICAvKiBjb2RlIHZh" +
        "bHVlICovCiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqLwogIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpOwogIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBs" +
        "ZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLwoKICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpCiAgLy9pZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuOwoKICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJn" +
        "ZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovCi8qI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTCiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJl" +
        "ZTsKICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0czsKICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlOwogIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4" +
        "dHJhX2RiaXRzOwogIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7CiNlbmRpZiovCgogIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBj" +
        "b2RlICgwLi4yOCkgKi8KICBsZW5ndGggPSAwOwogIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHsKICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOwogICAgZm9y" +
        "IChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlOwogICAgfQogIH0KICAvL0Fzc2VydCAobGVuZ3RoID09IDI1Niwg" +
        "InRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2Iik7CiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWQKICAgKiBpbiB0d28gZGlmZmVy" +
        "ZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZQogICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzoKICAgKi8KICBfbGVuZ3Ro" +
        "X2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlOwoKICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi8KICBkaXN0ID0gMDsKICBmb3IgKGNvZGUgPSAw" +
        "OyBjb2RlIDwgMTY7IGNvZGUrKykgewogICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDsKICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgewogICAgICBfZGlzdF9jb2Rl" +
        "W2Rpc3QrK10gPSBjb2RlOwogICAgfQogIH0KICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTYiKTsKICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRp" +
        "c3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgewogICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3OwogICAgZm9yIChuID0gMDsgbiA8ICgx" +
        "IDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7CiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7CiAgICB9CiAgfQogIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRp" +
        "Y19pbml0OiAyNTYrZGlzdCAhPSA1MTIiKTsKCiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLwogIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJp" +
        "dHMrKykgewogICAgYmxfY291bnRbYml0c10gPSAwOwogIH0KCiAgbiA9IDA7CiAgd2hpbGUgKG4gPD0gMTQzKSB7CiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODsKICAgIG4rKzsKICAg" +
        "IGJsX2NvdW50WzhdKys7CiAgfQogIHdoaWxlIChuIDw9IDI1NSkgewogICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7CiAgICBuKys7CiAgICBibF9jb3VudFs5XSsrOwogIH0KICB3aGls" +
        "ZSAobiA8PSAyNzkpIHsKICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3OwogICAgbisrOwogICAgYmxfY291bnRbN10rKzsKICB9CiAgd2hpbGUgKG4gPD0gMjg3KSB7CiAgICBzdGF0aWNf" +
        "bHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODsKICAgIG4rKzsKICAgIGJsX2NvdW50WzhdKys7CiAgfQogIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0" +
        "aGVtIGluIHRoZQogICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQogICAqIGFsbCBvbmVzKQogICAqLwogIGdlbl9jb2RlcyhzdGF0aWNf" +
        "bHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7CgogIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLwogIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKICAgIHN0YXRp" +
        "Y19kdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA1OwogICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7CiAgfQoKICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2Fu" +
        "IGluaXQgc3RhdGljIHRyZWVzCiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTsKICBz" +
        "dGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTKTsKICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0" +
        "aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpOwoKICAvL3N0YXRpY19pbml0X2RvbmUgPSB0cnVlOwp9CgoKLyogPT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCiAqLwpmdW5jdGlvbiBpbml0X2Jsb2NrKHMp" +
        "IHsKICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCgogIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqLwogIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0" +
        "cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH0KICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgeyBzLmR5bl9kdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9CiAgZm9yIChuID0gMDsgbiA8IEJMX0NP" +
        "REVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH0KCiAgcy5keW5fbHRyZWVbRU5EX0JMT0NLICogMl0vKi5GcmVxKi8gPSAxOwogIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7" +
        "CiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogRmx1" +
        "c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5CiAqLwpmdW5jdGlvbiBiaV93aW5kdXAocykKewogIGlmIChzLmJpX3ZhbGlkID4gOCkgewogICAgcHV0X3No" +
        "b3J0KHMsIHMuYmlfYnVmKTsKICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7CiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMu" +
        "YmlfYnVmOwogIH0KICBzLmJpX2J1ZiA9IDA7CiAgcy5iaV92YWxpZCA9IDA7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PQogKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cwogKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KICovCmZ1bmN0aW9uIGNvcHlfYmxv" +
        "Y2socywgYnVmLCBsZW4sIGhlYWRlcikKLy9EZWZsYXRlU3RhdGUgKnM7Ci8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICov" +
        "Ci8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCnsKICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCgog" +
        "IGlmIChoZWFkZXIpIHsKICAgIHB1dF9zaG9ydChzLCBsZW4pOwogICAgcHV0X3Nob3J0KHMsIH5sZW4pOwogIH0KLy8gIHdoaWxlIChsZW4tLSkgewovLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspOwovLyAgfQog" +
        "IHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTsKICBzLnBlbmRpbmcgKz0gbGVuOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KICogdGhlIHN1" +
        "YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguCiAqLwpmdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7CiAgdmFyIF9uMiA9" +
        "IG4gKiAyOwogIHZhciBfbTIgPSBtICogMjsKICByZXR1cm4gKHRyZWVbX24yXS8qLkZyZXEqLyA8IHRyZWVbX20yXS8qLkZyZXEqLyB8fAogICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19t" +
        "Ml0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "CiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAogKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMg" +
        "dHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZwogKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCiAqIHR3byBzb25zKS4K" +
        "ICovCmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaykKLy8gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLy8gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi8KLy8gICAgaW50IGs7" +
        "ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi8KewogIHZhciB2ID0gcy5oZWFwW2tdOwogIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLwogIHdoaWxlIChqIDw9IHMuaGVh" +
        "cF9sZW4pIHsKICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiYKICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBz" +
        "LmhlYXBbal0sIHMuZGVwdGgpKSB7CiAgICAgIGorKzsKICAgIH0KICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovCiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0s" +
        "IHMuZGVwdGgpKSB7IGJyZWFrOyB9CgogICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTsKICAgIGsgPSBqOwoKICAgIC8qIEFuZCBjb250" +
        "aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi8KICAgIGogPDw9IDE7CiAgfQogIHMuaGVhcFtrXSA9IHY7Cn0KCgovLyBpbmxpbmVkIG1hbnVhbGx5Ci8vIHZhciBT" +
        "TUFMTEVTVCA9IDE7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21w" +
        "cmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCiAqLwpmdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpCi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8vICAgIGNvbnN0IGN0" +
        "X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi8KLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi8KewogIHZhciBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2Yg" +
        "bWF0Y2hlZCBzdHJpbmcgKi8KICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLwogIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVu" +
        "bmluZyBpbmRleCBpbiBsX2J1ZiAqLwogIHZhciBjb2RlOyAgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqLwogIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2Vu" +
        "ZCAqLwoKICBpZiAocy5sYXN0X2xpdCAhPT0gMCkgewogICAgZG8gewogICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsg" +
        "bHggKiAyICsgMV0pOwogICAgICBsYyA9IHMucGVuZGluZ19idWZbcy5sX2J1ZiArIGx4XTsKICAgICAgbHgrKzsKCiAgICAgIGlmIChkaXN0ID09PSAwKSB7CiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJl" +
        "ZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsIiAnJWMnICIsIGxjKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogSGVyZSwgbGMg" +
        "aXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLwogICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOwogICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8q" +
        "IHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKICAgICAgICBpZiAoZXh0cmEgIT09IDApIHsKICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVd" +
        "OwogICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCiAgICAgICAgfQogICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhl" +
        "IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwogICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7CiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOwoKICAgICAgICBzZW5kX2NvZGUo" +
        "cywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTsKICAgICAgICBpZiAoZXh0cmEgIT09IDApIHsKICAgICAg" +
        "ICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOwogICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovCiAgICAgICAgfQogICAgICB9" +
        "IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCgogICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqLwogICAgICAvL0Fz" +
        "c2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsCiAgICAgIC8vICAgICAgICJwZW5kaW5nQnVmIG92ZXJmbG93Iik7CgogICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTsK" +
        "ICB9CgogIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PQogKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3Vy" +
        "cmVudCBibG9jay4KICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgogKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJl" +
        "IHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcwogKiAgICAgYWxzbyB1" +
        "cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LgogKi8KZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKQovLyAgICBkZWZsYXRlX3N0YXRlICpzOwovLyAgICB0" +
        "cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KewogIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7CiAgdmFyIHN0cmVlICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7" +
        "CiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTsKICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtczsKICB2YXIgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVy" +
        "IGhlYXAgZWxlbWVudHMgKi8KICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5n" +
        "IGNyZWF0ZWQgKi8KCiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgogICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFy" +
        "ZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgogICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCiAgICovCiAgcy5oZWFwX2xlbiA9IDA7CiAgcy5oZWFwX21heCA9IEhFQVBfU0laRTsKCiAgZm9yIChuID0gMDsg" +
        "biA8IGVsZW1zOyBuKyspIHsKICAgIGlmICh0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkgewogICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjsKICAgICAgcy5kZXB0aFtuXSA9IDA7" +
        "CgogICAgfSBlbHNlIHsKICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwOwogICAgfQogIH0KCiAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBj" +
        "b2RlIGV4aXN0cywKICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVj" +
        "aWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAogICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCiAgICovCiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7CiAgICBub2RlID0g" +
        "cy5oZWFwWysrcy5oZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApOwogICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxOwogICAgcy5kZXB0aFtub2RlXSA9IDA7CiAgICBzLm9w" +
        "dF9sZW4tLTsKCiAgICBpZiAoaGFzX3N0cmVlKSB7CiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdLyouTGVuKi87CiAgICB9CiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2Vz" +
        "IG5vdCBoYXZlIGV4dHJhIGJpdHMgKi8KICB9CiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlOwoKICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2Yg" +
        "dGhlIHRyZWUsCiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CiAgICovCiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBw" +
        "cWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9CgogIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KICAgKiBmcmVxdWVudCBub2Rlcy4KICAg" +
        "Ki8KICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi8KICBkbyB7CiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2Yg" +
        "bGVhc3QgZnJlcXVlbmN5ICovCiAgICAvKioqIHBxcmVtb3ZlICoqKi8KICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107CiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0t" +
        "XTsKICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7CiAgICAvKioqLwoKICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5" +
        "ICovCgogICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07CgogICAgLyogQ3JlYXRl" +
        "IGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi8KICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLzsKICAgIHMuZGVwdGhb" +
        "bm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTsKICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8g" +
        "PSBub2RlOwoKICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovCiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7CiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNN" +
        "QUxMRVNUKi8pOwoKICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpOwoKICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsKCiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxk" +
        "cyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdwogICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KICAgKi8KICBnZW5fYml0bGVuKHMsIGRlc2MpOwoKICAvKiBUaGUgZmllbGQgbGVuIGlzIG5v" +
        "dyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVz" +
        "CiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuCiAqLwpmdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpCi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyog" +
        "dGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqLwovLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwp7CiAgdmFyIG47ICAgICAgICAgICAg" +
        "ICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLwogIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KICB2YXIgY3VybGVuOyAgICAg" +
        "ICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCgogIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KCiAgdmFyIGNvdW50" +
        "ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCiAgdmFyIG1pbl9j" +
        "b3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLwoKICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgbWF4X2NvdW50ID0gMTM4OwogICAgbWluX2NvdW50ID0gMzsKICB9CiAgdHJlZVsobWF4" +
        "X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqLwoKICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgIGN1cmxlbiA9IG5leHRsZW47CiAgICBuZXh0bGVu" +
        "ID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87CgogICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgIGNvbnRpbnVlOwoKICAgIH0gZWxzZSBpZiAo" +
        "Y291bnQgPCBtaW5fY291bnQpIHsKICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovICs9IGNvdW50OwoKICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7CgogICAgICBpZiAoY3VybGVuICE9" +
        "PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9CiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKzsKCiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7" +
        "CiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrOwoKICAgIH0gZWxzZSB7CiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7CiAgICB9CgogICAgY291bnQg" +
        "PSAwOwogICAgcHJldmxlbiA9IGN1cmxlbjsKCiAgICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgICBtYXhfY291bnQgPSAxMzg7CiAgICAgIG1pbl9jb3VudCA9IDM7CgogICAgfSBlbHNlIGlmIChjdXJsZW4g" +
        "PT09IG5leHRsZW4pIHsKICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgbWluX2NvdW50ID0gMzsKCiAgICB9IGVsc2UgewogICAgICBtYXhfY291bnQgPSA3OwogICAgICBtaW5fY291bnQgPSA0OwogICAgfQog" +
        "IH0KfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVl" +
        "IGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCiAqIGJsX3RyZWUuCiAqLwpmdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpCi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8v" +
        "ICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kg" +
        "Ki8KewogIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVu" +
        "Z3RoICovCiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLwoKICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2Yg" +
        "bmV4dCBjb2RlICovCgogIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJl" +
        "cGVhdCBjb3VudCAqLwogIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi8KCiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkg" +
        "c2V0ICovCiAgaWYgKG5leHRsZW4gPT09IDApIHsKICAgIG1heF9jb3VudCA9IDEzODsKICAgIG1pbl9jb3VudCA9IDM7CiAgfQoKICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgIGN1cmxl" +
        "biA9IG5leHRsZW47CiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87CgogICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgIGNv" +
        "bnRpbnVlOwoKICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTsKCiAgICB9" +
        "IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkgewogICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsKICAgICAgICBjb3VudC0tOwogICAg" +
        "ICB9CiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgIiAzXzY/Iik7CiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpOwogICAgICBzZW5kX2JpdHMocywgY291bnQg" +
        "LSAzLCAyKTsKCiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7CiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpOwoKICAg" +
        "IH0gZWxzZSB7CiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTsKICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpOwogICAgfQoKICAgIGNvdW50ID0gMDsKICAgIHByZXZs" +
        "ZW4gPSBjdXJsZW47CiAgICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgICBtYXhfY291bnQgPSAxMzg7CiAgICAgIG1pbl9jb3VudCA9IDM7CgogICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHsK" +
        "ICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgbWluX2NvdW50ID0gMzsKCiAgICB9IGVsc2UgewogICAgICBtYXhfY291bnQgPSA3OwogICAgICBtaW5fY291bnQgPSA0OwogICAgfQogIH0KfQoKCi8qID09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhz" +
        "IGFuZCByZXR1cm4gdGhlIGluZGV4IGluCiAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgogKi8KZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7CiAgdmFyIG1heF9ibGlu" +
        "ZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLwoKICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRp" +
        "c3RhbmNlIHRyZWVzICovCiAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7CiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7CgogIC8qIEJ1" +
        "aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpOwogIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25z" +
        "LCBleGNlcHQKICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLgogICAqLwoKICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBv" +
        "ZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cwog" +
        "ICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKICAgKi8KICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CiAgICBp" +
        "ZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBi" +
        "aXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLwogIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7CiAgLy9UcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxk" +
        "LCBzdGF0ICVsZCIsCiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTsKCiAgcmV0dXJuIG1heF9ibGluZGV4Owp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQogKiBs" +
        "ZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxj" +
        "b2RlcyA+PSA0LgogKi8KZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxj" +
        "b2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi8KewogIHZhciByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi8KCiAgLy9Bc3NlcnQgKGxjb2RlcyA+" +
        "PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOwogIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVz" +
        "IDw9IEJMX0NPREVTLAogIC8vICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKICAvL1RyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyog" +
        "bm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7CiAgc2VuZF9iaXRzKHMsIGJsY29kZXMgLSA0LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0" +
        "ZWQgaW4gYXBwbm90ZS50eHQgKi8KICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CiAgICAvL1RyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkp" +
        "OwogICAgc2VuZF9iaXRzKHMsIHMuYmxfdHJlZVtibF9vcmRlcltyYW5rXSAqIDIgKyAxXS8qLkxlbiovLCAzKTsKICB9CiAgLy9UcmFjZXYoKHN0ZGVyciwgIlxuYmwgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRz" +
        "X3NlbnQpKTsKCiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovCiAgLy9UcmFjZXYoKHN0ZGVyciwgIlxubGl0IHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0" +
        "c19zZW50KSk7CgogIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi8KICAvL1RyYWNldigoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgcy0+" +
        "Yml0c19zZW50KSk7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlw" +
        "ZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDoKICogICAgYSkgVGhlcmUg" +
        "YXJlIG5vIG5vbi1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgYmVsb25naW5nIHRvIHRoZQogKiAgICAgICAiYmxhY2sgbGlzdCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS4KICogICAgYikgVGhlcmUgaXMg" +
        "YXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZQogKiAgICAgICAid2hpdGUgbGlzdCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLgogKiAtIEJJTkFS" +
        "WSBvdGhlcndpc2UuCiAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYQogKiAgICJncmF5IGxpc3QiIHRoYXQgaXMgaWdub3JlZCBpbiB0aGlzIGRl" +
        "dGVjdGlvbiBhbGdvcml0aG06CiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS4KICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHlu" +
        "X2x0cmVlIGFyZSBzZXQuCiAqLwpmdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHsKICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXMKICAgKiBzZXQgYml0cyAw" +
        "Li42LCAxNC4uMjUsIGFuZCAyOC4uMzEKICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExCiAgICovCiAgdmFyIGJsYWNrX21hc2sgPSAweGYzZmZjMDdmOwog" +
        "IHZhciBuOwoKICAvKiBDaGVjayBmb3Igbm9uLXRleHR1YWwgKCJibGFjay1saXN0ZWQiKSBieXRlcy4gKi8KICBmb3IgKG4gPSAwOyBuIDw9IDMxOyBuKyssIGJsYWNrX21hc2sgPj4+PSAxKSB7CiAgICBpZiAo" +
        "KGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkgewogICAgICByZXR1cm4gWl9CSU5BUlk7CiAgICB9CiAgfQoKICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoIndo" +
        "aXRlLWxpc3RlZCIpIGJ5dGVzLiAqLwogIGlmIChzLmR5bl9sdHJlZVs5ICogMl0vKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fAogICAgICBzLmR5bl9sdHJl" +
        "ZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7CiAgICByZXR1cm4gWl9URVhUOwogIH0KICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHsKICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVx" +
        "Ki8gIT09IDApIHsKICAgICAgcmV0dXJuIFpfVEVYVDsKICAgIH0KICB9CgogIC8qIFRoZXJlIGFyZSBubyAiYmxhY2stbGlzdGVkIiBvciAid2hpdGUtbGlzdGVkIiBieXRlczoKICAgKiB0aGlzIHN0cmVhbSBl" +
        "aXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoImdyYXktbGlzdGVkIikgYnl0ZXMgb25seS4KICAgKi8KICByZXR1cm4gWl9CSU5BUlk7Cn0KCgp2YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlOwoK" +
        "LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZv" +
        "ciBhIG5ldyB6bGliIHN0cmVhbS4KICovCmZ1bmN0aW9uIF90cl9pbml0KHMpCnsKCiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7CiAgICB0cl9zdGF0aWNfaW5pdCgpOwogICAgc3RhdGljX2luaXRfZG9uZSA9" +
        "IHRydWU7CiAgfQoKICBzLmxfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpOwogIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVz" +
        "Yyk7CiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpOwoKICBzLmJpX2J1ZiA9IDA7CiAgcy5iaV92YWxpZCA9IDA7CgogIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0" +
        "IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLwogIGluaXRfYmxvY2socyk7Cn0KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PT09PT0KICogU2VuZCBhIHN0b3JlZCBibG9jawogKi8KZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpCi8vRGVmbGF0ZVN0YXRlICpzOwovL2NoYXJmICpidWY7" +
        "ICAgICAgIC8qIGlucHV0IGJsb2NrICovCi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3Qg" +
        "YmxvY2sgZm9yIGEgZmlsZSAqLwp7CiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7ICAgIC8qIHNlbmQgYmxvY2sgdHlwZSAqLwogIGNvcHlfYmxvY2socywg" +
        "YnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi8KfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09" +
        "PT09PQogKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgogKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBp" +
        "biB0aGUgYml0IGJ1ZmZlci4KICovCmZ1bmN0aW9uIF90cl9hbGlnbihzKSB7CiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTsKICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRy" +
        "ZWUpOwogIGJpX2ZsdXNoKHMpOwp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIERldGVybWluZSB0aGUg" +
        "YmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYwogKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZp" +
        "bGUuCiAqLwpmdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KQovL0RlZmxhdGVTdGF0ZSAqczsKLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVM" +
        "TCBpZiB0b28gb2xkICovCi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9y" +
        "IGEgZmlsZSAqLwp7CiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KICB2YXIgbWF4X2JsaW5kZXggPSAwOyAgICAgICAgLyogaW5kZXgg" +
        "b2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLwoKICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovCiAgaWYgKHMubGV2" +
        "ZWwgPiAwKSB7CgogICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04pIHsKICAgICAgcy5zdHJtLmRhdGFfdHlw" +
        "ZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7CiAgICB9CgogICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLwogICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7CiAgICAvLyBU" +
        "cmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CgogICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7" +
        "CiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpOwogICAgLyogQXQgdGhpcyBwb2lu" +
        "dCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRp" +
        "b25zLgogICAgICovCgogICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0" +
        "IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgogICAgICovCiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBi" +
        "bG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLwogICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzOwogICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzOwoKICAg" +
        "IC8vIFRyYWNldigoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSAiLAogICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwg" +
        "cy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbiwKICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpOwoKICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9Cgog" +
        "IH0gZWxzZSB7CiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxv" +
        "Y2sgKi8KICB9CgogIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkgewogICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLwoKICAgIC8qIFRoZSB0ZXN0" +
        "IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCiAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5" +
        "dGVzIHNpbmNlCiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW4KICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBp" +
        "dCBpcyBuZXZlciB0b28gbGF0ZSB0bwogICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KICAgICAqLwogICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxh" +
        "c3QpOwoKICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7CgogICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/" +
        "IDEgOiAwKSwgMyk7CiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7CgogIH0gZWxzZSB7CiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8g" +
        "MSA6IDApLCAzKTsKICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpOwogICAgY29tcHJlc3NfYmxvY2socywg" +
        "cy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTsKICB9CiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsICJiYWQgY29tcHJlc3NlZCBzaXplIik7CiAgLyogVGhlIGFib3ZlIGNo" +
        "ZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUIKICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy4KICAgKi8KICBpbml0X2Jsb2NrKHMpOwoKICBpZiAo" +
        "bGFzdCkgewogICAgYmlfd2luZHVwKHMpOwogIH0KICAvLyBUcmFjZXYoKHN0ZGVyciwiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBzLT5jb21wcmVzc2VkX2xlbj4+MywKICAvLyAgICAgICBzLT5jb21wcmVzc2Vk" +
        "X2xlbi03Kmxhc3QpKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFNhdmUgdGhlIG1hdGNoIGluZm8g" +
        "YW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgogKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBfdHJfdGFsbHkocywgZGlzdCwgbGMp" +
        "Ci8vICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwovLyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1J" +
        "Tl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi8KewogIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7CgogIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQg" +
        "KiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmOwogIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjsKCiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsg" +
        "cy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7CiAgcy5sYXN0X2xpdCsrOwoKICBpZiAoZGlzdCA9PT0gMCkgewogICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovCiAgICBzLmR5bl9sdHJlZVtsYyAqIDJd" +
        "LyouRnJlcSovKys7CiAgfSBlbHNlIHsKICAgIHMubWF0Y2hlcysrOwogICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLwogICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBk" +
        "aXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmCiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFU" +
        "Q0gpICYmCiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgICJfdHJfdGFsbHk6IGJhZCBtYXRjaCIpOwoKICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElU" +
        "RVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7CiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXS8qLkZyZXEqLysrOwogIH0KCi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVm" +
        "YWlsdHMsCi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkKCi8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLCi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBz" +
        "dG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi8KLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHsKLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3Ig" +
        "dGhlIGNvbXByZXNzZWQgbGVuZ3RoICovCi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7Ci8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0OwovLwovLyAgICBmb3IgKGRj" +
        "b2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7Ci8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTsKLy8g" +
        "ICAgfQovLyAgICBvdXRfbGVuZ3RoID4+Pj0gMzsKLy8gICAgLy9UcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKLy8gICAgLy8gICAgICAgcy0+bGFzdF9s" +
        "aXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCwKLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTsKLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50" +
        "IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykgewovLyAgICAgIHJldHVybiB0cnVlOwovLyAgICB9Ci8vICB9Ci8vI2VuZGlmCgogIHJldHVybiAocy5sYXN0X2xpdCA9PT0g" +
        "cy5saXRfYnVmc2l6ZSAtIDEpOwogIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SwogICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVj" +
        "YXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCiAgICogNjRLLTEgYnl0ZXMuCiAgICovCn0KCmV4cG9ydHMuX3RyX2luaXQgID0gX3RyX2luaXQ7CmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9" +
        "IF90cl9zdG9yZWRfYmxvY2s7CmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jazsKZXhwb3J0cy5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7CmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2Fs" +
        "aWduOwoKfSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDF9XSw1MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cid1c2Ugc3RyaWN0JzsKCi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBh" +
        "bmQgTWFyayBBZGxlcgovLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpbgovLwovLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4" +
        "cHJlc3Mgb3IgaW1wbGllZAovLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhp" +
        "cyBzb2Z0d2FyZS4KLy8KLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0" +
        "aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgovLwovLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMg" +
        "c29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAovLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3" +
        "YXJlCi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLy8g" +
        "Mi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29m" +
        "dHdhcmUuCi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgpmdW5jdGlvbiBaU3RyZWFtKCkgewogIC8qIG5leHQgaW5w" +
        "dXQgYnl0ZSAqLwogIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzCiAgdGhpcy5uZXh0X2luID0gMDsKICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZh" +
        "aWxhYmxlIGF0IGlucHV0ICovCiAgdGhpcy5hdmFpbF9pbiA9IDA7CiAgLyogdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCiAgdGhpcy50b3RhbF9pbiA9IDA7CiAgLyogbmV4dCBv" +
        "dXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCiAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzCiAgdGhpcy5uZXh0X291dCA9IDA7" +
        "CiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovCiAgdGhpcy5hdmFpbF9vdXQgPSAwOwogIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCiAgdGhpcy50b3RhbF9v" +
        "dXQgPSAwOwogIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLwogIHRoaXMubXNnID0gJycvKlpfTlVMTCovOwogIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwogIHRo" +
        "aXMuc3RhdGUgPSBudWxsOwogIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi8KICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovOwogIC8qIGFkbGVyMzIg" +
        "dmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCiAgdGhpcy5hZGxlciA9IDA7Cn0KCm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTsKCn0se31dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBv" +
        "cnRzKXsKJ3VzZSBzdHJpY3QnOwptb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgPyBzZXRJbW1lZGlhdGUgOgoJZnVuY3Rpb24gc2V0SW1tZWRpYXRlKCkgewoJCXZh" +
        "ciBhcmdzID0gW10uc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKCQlhcmdzLnNwbGljZSgxLCAwLCAwKTsKCQlzZXRUaW1lb3V0LmFwcGx5KG51bGwsIGFyZ3MpOwoJfTsKCn0se31dfSx7fSxbMTBdKSgxMCkKfSk7"
    );
    core.threads = Thread.createWorkerPool({
        extcode: "var JSZip = null, window = {};\r\n" +
                EncodingClass.exportCode() + "\r\n" +
                wCode + " \r\n",
        modules: {core: blobcore},
        afunc: function (params, callbackfunc) {
            if (JSZip === null) JSZip = window.JSZip;
            core[params.name](params, callbackfunc);
        }
    });
    wCode = null;
    retval.setMaxThread = function (n) {
        core.threads.maxThread = n;
    };
    var cfuncList = ["compressContent", "compress", "extract", "compressContentu8", "compressu8", "extractu8"];
    var i;
    for (i = 0; i < cfuncList.length; i++) {
        retval[cfuncList[i]] = function (core, fname) {
            return function (content, callbackfunc, transferList) {
                if (transferList === undefined) transferList = [];
                core.threads.acall({
                    params: {
                        name: fname,
                        params: content
                    },
                    transferList: transferList,
                    callbackfunc: callbackfunc
                });
            }
        } (core, cfuncList[i]);
    }
    retval.compressToFile = function (ZipWorkerClass) {
        return function (filename, content) {
            ZipWorkerClass.compress(content, function (filename) {
                return function (content) {
                    FormClass.saveAs(filename, content);
                }
            } (filename));
        }
    } (retval);
    retval.compressFilesFromInput = function (ZipWorkerClass) {
        return function (fileinput, callbackfunc) {
            FormClass.readFileFromInput(fileinput, function(callbackfunc) {
                return function(rv) {
                    var flist = [];
                    var i;
                    for (i = 0; i < rv.length; i++) {
                        flist.push({
                            type: "file",
                            name: rv[i].name,
                            content: rv[i].content
                        });
                    }
                    ZipWorkerClass.compress(flist, callbackfunc);
                }
            } (callbackfunc));
        }
    } (retval);
    retval.compressedFilesFromInputToFile = function (ZipWorkerClass) {
        return function (fileinput, filename) {
            ZipWorkerClass.compressFilesFromInput(fileinput, function (filename) {
                return function (content) {
                    var xurl = window.URL || window.webkitURL;
                    if (xurl == null) return false;
                    var element = document.createElement('a');
                    if (element == null) return false;
                    var xcontent = [];
                    var i;
                    for (i = 0; i < content.length; i++) {
                        xcontent.push(content.charCodeAt(i));
                    }
                    content = new Uint8Array(xcontent);
                    xcontent = null;
                    element.setAttribute('href', xurl.createObjectURL(new Blob([content], {type: "application/zip"})));
                    element.setAttribute('download', filename);
                    element.style.display = 'none';
                    document.body.appendChild(element);
                    element.click();
                    document.body.removeChild(element);
                    //saveAs(content, "example.zip");
                }
            } (filename));
        }
    } (retval);
    retval.execCode = function (ZipWorkerClass) {
        return function (content, callbackfunc) {
            var f = function (callbackfunc) {
                return function (files) {
                    var i, xf, rv = [];
                    var keys = Object.keys(files);
                    for (i = 0; i < keys.length; i++) {
                        try {
                            xf = new Function (files[keys[i]].content);
                            rv.push({
                                file: keys[i],
                                value: xf()
                            });
                        }
                        catch(err) {
                            console.log(err);
                            console.log(files[keys[i]].content);
                            ZipWorkerClass.lastErrorExecCode = files[keys[i]].content;
                        }
                    }
                    if ((callbackfunc !== undefined) && (callbackfunc !== null)) {
                        if (EncodingClass.type.isFunction(callbackfunc)) {
                            callbackfunc(rv);
                        }
                    }
                };
            } (callbackfunc);
            ZipWorkerClass.extract([{
                content: content
            }], f);
        }
    } (retval);
    retval.extractFilesFromInput = function (ZipWorkerClass) {
        return function (fileinput, callbackfunc) {
            FormClass.readFileFromInput(fileinput, function(ZipWorkerClass, callbackfunc) {
                return function(content) {
                    ZipWorkerClass.extract([{content: content[0].content}], callbackfunc);
                }
            } (ZipWorkerClass, callbackfunc));
        }
    } (retval);
    return retval;
} ());

if (window.ModuleManagerClass !== undefined) {
    ModuleManagerClass.register({
        name: "ZipWorkerClass",
        prerequisites: ["EncodingClass"]
    });
}

VaKeR 2022