LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogCiAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgogKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogKgogKgogKiAKICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogKiAKICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAogKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAogKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgogKiAKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIE9mZmljZU9wZW5YbWw7CgpuYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwp7CgljbGFzcyBTYW1wbGVfTWFpbgoJewoJCXN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKCQl7CgkJCXRyeQoJCQl7CiAgICAgICAgICAgICAgICAvL1NhbXBsZSAzLCA0IGFuZCAxMiB1c2VzIHRoZSBBZHZlbnR1cmV3b3JrcyBkYXRhYmFzZS4gRW50ZXIgdGhlbiBuYW1lIG9mIHlvdXIgU1FMIHNlcnZlciBpbnRvIHRoZSB2YXJpYWJsZSBiZWxvdy4uLgogICAgICAgICAgICAgICAgLy9MZWF2ZSB0aGlzIGJsYW5rIGlmIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgQWR2ZW50dXJld29ya3MgZGF0YWJhc2UgCiAgICAgICAgICAgICAgICBzdHJpbmcgU3FsU2VydmVyTmFtZSA9ICIiOwoKICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGlzIGxpbmUgdG8gY29udGFpbiB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IGZvbGRlcgogICAgICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhAImM6XHRlbXBcU2FtcGxlQXBwIik7CiAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERpci5FeGlzdHMpIHRocm93IG5ldyBFeGNlcHRpb24oIm91dHB1dERpciBkb2VzIG5vdCBleGlzdCEiKTsKCiAgICAgICAgICAgICAgICAvLyBTYW1wbGUgMSAtIHNpbXBseSBjcmVhdGVzIGEgbmV3IHdvcmtib29rIGZyb20gc2NyYXRjaAogICAgICAgICAgICAgICAgLy8gY29udGFpbmluZyBhIHdvcmtzaGVldCB0aGF0IGFkZHMgYSBmZXcgbnVtYmVycyB0b2dldGhlciAKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxIik7CiAgICAgICAgICAgICAgICBzdHJpbmcgb3V0cHV0ID0gU2FtcGxlMS5SdW5TYW1wbGUxKG91dHB1dERpcik7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDEgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgogICAgICAgICAgICAgICAgLy8gU2FtcGxlIDIgLSBzaW1wbHkgcmVhZHMgc29tZSB2YWx1ZXMgZnJvbSB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgc2FtcGxlIDEKICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIHRoZW0gdG8gdGhlIGNvbnNvbGUKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAyIik7CiAgICAgICAgICAgICAgICBTYW1wbGUyLlJ1blNhbXBsZTIob3V0cHV0KTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSAiIjsKCiAgICAgICAgICAgICAgICBpZiAoU3FsU2VydmVyTmFtZSAhPSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29ubmVjdGlvblN0ciA9IHN0cmluZy5Gb3JtYXQoQCJzZXJ2ZXI9ezB9O2RhdGFiYXNlPUFkdmVudHVyZVdvcmtzO0ludGVncmF0ZWQgU2VjdXJpdHk9dHJ1ZTsiLCBTcWxTZXJ2ZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGUgMyAtIGNyZWF0ZXMgYSB3b3JrYm9vayBmcm9tIHNjcmF0Y2ggCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBzYW1wbGUgYXMgdGhlIG9yaWdpbmFsIEV4Y2VscGFja2FnZSwgc2FtcGxlIDQsIGJ1dCB3aXRob3V0IHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2FtcGxlIHJlcXVpcmVzIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZS4gIAogICAgICAgICAgICAgICAgICAgIC8vU2hvd3MgaG93IHRvIHVzZSBSYW5nZXMsIFN0eWxpbmcsIE5hbWVkc3R5bGVzIGFuZCBIeXBlcmxpbmtzCiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDMiKTsKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGUzLlJ1blNhbXBsZTMob3V0cHV0RGlyLCBjb25uZWN0aW9uU3RyKTsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDMgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGUgNCAtIGNyZWF0ZXMgYSB3b3JrYm9vayBiYXNlZCBvbiBhIHRlbXBsYXRlLgogICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlcyBhIHJhbmdlIHdpdGggZGF0YSBhbmQgc2V0IHRoZSBzZXJpZXMgb2YgYSBsaW5lY2hhcnQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDQiKTsKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGU0LlJ1blNhbXBsZTQoY29ubmVjdGlvblN0ciwgbmV3IEZpbGVJbmZvKCIuLlxcLi5cXEdyYXBoVGVtcGxhdGUueGxzeCIpLCBvdXRwdXREaXIpOyAgICAgIC8vVGVtcGxhdGUgcGF0aCBmcm9tIC9iaW4vZGVidWcgb3IgL2Jpbi9yZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA0IGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1NhbXBsZSA1CiAgICAgICAgICAgICAgICAvL09wZW4gc2FtcGxlIDEgYW5kIGFkZCBhIHBpZSBjaGFydC4KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA1Iik7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGU1LlJ1blNhbXBsZTUob3V0cHV0RGlyKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgNSBjcmVhdGVkOiIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDYKICAgICAgICAgICAgICAgIC8vQ3JlYXRlcyBhbiBhZHZhbmNlZCByZXBvcnQgb24gYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0uCiAgICAgICAgICAgICAgICAvL1BhcmFtZXRlciAyIGlzIHRoZSBkaXJlY3RvcnkgdG8gcmVwb3J0LiBQYXJhbXRlciAzIGlzIGhvdyBkZWVwIHRoZSBzY2FuIHdpbGwgZ28uIFBhcmFtZXRlciA0IFNraXBzIEljb25zIGlmIHNldCB0byB0cnVlIChUaGUgaWNvbiBoYW5kbGluZyBpcyBzbG93KQogICAgICAgICAgICAgICAgLy9UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2Ugb3V0bGluZXMsIHRhYmxlcyxjb21tZW50cywgc2hhcGVzLCBwaWN0dXJlcyBhbmQgY2hhcnRzLiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA2Iik7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGU2LlJ1blNhbXBsZTYob3V0cHV0RGlyLCBuZXcgRGlyZWN0b3J5SW5mbygiLi5cXC4uIiksIDUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgNiBjcmVhdGVkOiIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDcKICAgICAgICAgICAgICAgIC8vVGhpcyBzYW1wbGUgc2hvd3MgdGhlIHBlcmZvcm1hbmNlIGNhcGFiaWxpdGllcyBvZiB0aGUgY29tcG9uZW50IGFuZCBzaG93cyBzaGVldCBwcm90ZWN0aW9uLgogICAgICAgICAgICAgICAgLy9Mb2FkIFgocGFyYW0gMikgcm93cyB3aXRoIGZpdmUgY29sdW1ucwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDciKTsKICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTcuUnVuU2FtcGxlNyhvdXRwdXREaXIsIDY1NTM0KTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgNyBjcmVhdGVkOiIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDggLSBMaW5xCiAgICAgICAgICAgICAgICAvL09wZW5zIFNhbXBsZSA3IGFuZCBwZXJmb3JtIHNvbWUgTGlucSBxdWVyaWVzCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgOC1MaW5xIik7CiAgICAgICAgICAgICAgICBMaW5xU2FtcGxlLlJ1bkxpbnFTYW1wbGUob3V0cHV0RGlyKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgogICAgICAgICAgICAgICAgLy9TYW1wbGUgOSBMb2FkcyB0d28gY3N2IGZpbGVzIGludG8gdGFibGVzIGFuZCBjcmVhdGVzIGFuIGFyZWEgY2hhcnQgYW5kIGEgQ29sdW1uL0xpbmUgY2hhcnQgb24gdGhlIGRhdGEuCiAgICAgICAgICAgICAgICAvL1RoaXMgc2FtcGxlIGFsc28gc2hvd3MgaG93IHRvIHVzZSBhIHNlY29uZGFyeSBheGlzLgogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDkiKTsKICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTkuUnVuU2FtcGxlOShvdXRwdXREaXIpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA5IGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDEwIFN3ZWRpc2ggUXVpeiA6IFNob3dzIEVuY3J5cHRpb24gYW5kIHdvcmtib29rIGFuZCBzaGVldCBwcm90ZWN0aW9uLgogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDEwIik7CiAgICAgICAgICAgICAgICBTYW1wbGUxMC5SdW5TYW1wbGUxMChvdXRwdXREaXIpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMCBjcmVhdGVkOiB7MH0iLCBvdXRwdXREaXIuRnVsbE5hbWUpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgICAgICAgICAvL1NhbXBsZSAxMSAtIERhdGEgdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDExIik7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGUxMS5SdW5TYW1wbGUxMShvdXRwdXREaXIpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMSBjcmVhdGVkIHswfSIsIG91dHB1dCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDEyIC0gUGl2b3R0YWJsZXMKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMiIpOwogICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlMTIuUnVuU2FtcGxlMTIoU3FsU2VydmVyTmFtZSwgb3V0cHV0RGlyKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgMTIgY3JlYXRlZCB7MH0iLCBvdXRwdXQpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgICAgICAgICAvL1NhbXBsZSAxMyAtIFNob3dzIGEgZmV3IHdheXMgdG8gbG9hZCBkYXRhIChEYXRhdGFibGUsIElFbnVtZXJhYmxlIGFuZCBtb3JlKS4KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMyIpOwogICAgICAgICAgICAgICAgU2FtcGxlMTMuUnVuU2FtcGxlMTMob3V0cHV0RGlyKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgMTMgY3JlYXRlZCB7MH0iLCBvdXRwdXREaXIuTmFtZSk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIDE0IC0gQ29uZGl0aW9uYWwgRm9ybWF0dGluZwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDE0Iik7CiAgICAgICAgICAgICAgICBTYW1wbGUxNC5SdW5TYW1wbGUxNChvdXRwdXREaXIpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxNCBjcmVhdGVkIHswfSIsIG91dHB1dERpci5OYW1lKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgogICAgICAgICAgICAgICAgLy9TYW1wbGUgMTUgLSBTaG93cyBob3cgdG8gd29yayB3aXRoIG1hY3JvLWVuYWJsZWQgd29ya2Jvb2tzKFZCQSkuCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMTUtVkJBIik7CiAgICAgICAgICAgICAgICBTYW1wbGUxNS5WQkFTYW1wbGUob3V0cHV0RGlyKTsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgMTUgY3JlYXRlZCB7MH0iLCBvdXRwdXREaXIuTmFtZSk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAgICAgICAgIC8vU2FtcGxlIEZvcm11bGFDYWxjIC0gU2hvd3MgaG93IHRvIGNhbGN1bGF0ZSBmb3JtdWxhcyBpbiB0aGUgd29ya2Jvb2suCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBTYW1wbGVfRm9ybXVsYUNhbGMiKTsKICAgICAgICAgICAgICAgIFNhbXBsZV9Gb3JtdWxhQ2FsYy5SdW5TYW1wbGVGb3JtdWxhQ2FsYygpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgICAgICAgICAvL1NhbXBsZSBBZGRGb3JtdWxhRnVuY3Rpb24gLSBTaG93cyBob3cgdG8gYWRkIHlvdXIgb3duIGltcGxlbWVudGF0aW9ucyBvZiBleGNlbCBmdW5jdGlvbnMgdG8gRVBQbHVzLgogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbiIpOwogICAgICAgICAgICAgICAgU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5SdW5TYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwogICAgICAgICAgICB9CgkJCWNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvcjogezB9IiwgZXguTWVzc2FnZSk7CgkJCX0KCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlByZXNzIHRoZSByZXR1cm4ga2V5IHRvIGV4aXQuLi4iKTsKCQkJQ29uc29sZS5SZWFkKCk7CgkJfQoJfQp9Cg==