LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogCiAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgogKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogKgogKgogKiAKICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogKiAKICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAogKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAogKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgogKiAKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIFNhbXBsZSBjb2RlIGRlbW9uc3RyYXRpbmcgaG93IHRvIGdlbmVyYXRlIEV4Y2VsIHNwcmVhZHNoZWV0cyBvbiB0aGUgc2VydmVyIHVzaW5nIAogKiBPZmZpY2UgT3BlbiBYTUwgYW5kIHRoZSBFeGNlbFBhY2thZ2Ugd3JhcHBlciBjbGFzc2VzLgogKiAKICogRXhjZWxQYWNrYWdlIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCiAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FeGNlbFBhY2thZ2UgZm9yIGRldGFpbHMuCiAqIAogKiBTYW1wbGUgMzogQ3JlYXRlcyBhIHdvcmtib29rIGJhc2VkIG9uIGEgdGVtcGxhdGUgYW5kIHBvcHVsYXRlcyB1c2luZyB0aGUgZGF0YWJhc2UgZGF0YS4KICogCiAqIENvcHlyaWdodCAyMDA3IKkgRHIgSm9obiBUdW5uaWNsaWZmZSAKICogbWFpbHRvOmRyLmpvaG4udHVubmljbGlmZmVAYnRpbnRlcm5ldC5jb20KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogCiAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAogKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogKi8KdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIFN5c3RlbS5YbWw7CnVzaW5nIE9mZmljZU9wZW5YbWw7CnVzaW5nIFN5c3RlbS5EYXRhLlNxbENsaWVudDsKdXNpbmcgU3lzdGVtLkRyYXdpbmc7CnVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CgpuYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwp7CgljbGFzcyBTYW1wbGUzCgl7CgkJLy8vIDxzdW1tYXJ5PgoJCS8vLyBTYW1wbGUgMyAtIGNyZWF0ZXMgYSB3b3JrYm9vayBhbmQgcG9wdWxhdGVzIHVzaW5nIGRhdGEgZnJvbSB0aGUgQWR2ZW50dXJlV29ya3MgZGF0YWJhc2UKCQkvLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCiAgICAgICAgLy8vIFRoaXMgb25lIGlzIGZyb20gdGhlIG9yZ2luYWwgRXhjZWxwYWNrYWdlIHNhbXBsZSBwcm9qZWN0LCBidXQgd2l0aG91dCB0aGUgdGVtcGxhdGUKCQkvLy8gPC9zdW1tYXJ5PgoJCS8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0RGlyIj5UaGUgb3V0cHV0IGRpcmVjdG9yeTwvcGFyYW0+CgkJLy8vIDxwYXJhbSBuYW1lPSJ0ZW1wbGF0ZURpciI+VGhlIGxvY2F0aW9uIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGU8L3BhcmFtPgoJCS8vLyA8cGFyYW0gbmFtZT0iY29ubmVjdGlvblN0cmluZyI+VGhlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHlvdXIgY29weSBvZiB0aGUgQWR2ZW50dXJlV29ya3MgZGF0YWJhc2U8L3BhcmFtPgoJCXB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTMoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIHN0cmluZyBjb25uZWN0aW9uU3RyaW5nKQoJCXsKCQkJCiAgICAgICAgICAgIHN0cmluZyBmaWxlID0gb3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMy54bHN4IjsKICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGZpbGUpKSBGaWxlLkRlbGV0ZShmaWxlKTsKICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUzLnhsc3giKTsKCgkJCS8vIG9rLCB3ZSBjYW4gcnVuIHRoZSByZWFsIGNvZGUgb2YgdGhlIHNhbXBsZSBub3cKCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSB4bFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpKQoJCQl7CgkJCQkvLyB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IHRoZSBYTUwgd3JpdHRlbiBvdXQgdG8gdGhlIG91dHB1dERpcgoJCQkJLy94bFBhY2thZ2UuRGVidWdNb2RlID0gdHJ1ZTsgCgoJCQkJLy8gZ2V0IGhhbmRsZSB0byB0aGUgZXhpc3Rpbmcgd29ya3NoZWV0CgkJCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSB4bFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbGVzIik7CiAgICAgICAgICAgICAgICB2YXIgbmFtZWRTdHlsZSA9IHhsUGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiSHlwZXJMaW5rIik7ICAgLy9UaGlzIG9uZSBpcyBsYW5ndWFnZSBkZXBlbmRlbnQKICAgICAgICAgICAgICAgIG5hbWVkU3R5bGUuU3R5bGUuRm9udC5VbmRlckxpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgbmFtZWRTdHlsZS5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLkJsdWUpOwogICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldCAhPSBudWxsKQoJCQkJewoJCQkJCWNvbnN0IGludCBzdGFydFJvdyA9IDU7CgkJCQkJaW50IHJvdyA9IHN0YXJ0Um93OwogICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIEhlYWRlcnMgYW5kIGZvcm1hdCB0aGVtIAogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJBZHZlbnR1cmVXb3JrcyBJbmMuIjsKICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByID0gd29ya3NoZWV0LkNlbGxzWyJBMTpHMSJdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgci5NZXJnZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQnJpdGFubmljIEJvbGQiLCAyMiwgRm9udFN0eWxlLkl0YWxpYykpOwogICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuV2hpdGUpOwogICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOwogICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLlNvbGlkOwogICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDIzLDU1LDkzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJZZWFyLUVuZCBTYWxlcyBSZXBvcnQiOwogICAgICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3b3Jrc2hlZXQuQ2VsbHNbIkEyOkcyIl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LlNldEZyb21Gb250KG5ldyBGb250KCJCcml0YW5uaWMgQm9sZCIsIDE4LCBGb250U3R5bGUuSXRhbGljKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOwogICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigxODQsMjA0LDIyOCkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gIk5hbWUiOwogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJKb2IgVGl0bGUiOwogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9ICJSZWdpb24iOwogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDQiXS5WYWx1ZSA9ICJNb250aGx5IFF1b3RhIjsKICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkU0Il0uVmFsdWUgPSAiUXVvdGEgWVREIjsKICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkY0Il0uVmFsdWUgPSAiU2FsZXMgWVREIjsKICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkc0Il0uVmFsdWUgPSAiUXVvdGEgJSI7CiAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE0Okc0Il0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoMTg0LCAyMDQsIDIyOCkpOwogICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTQ6RzQiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwoKCiAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBjb25uZWN0IHRvIHRoZSBBZHZlbnR1cmVXb3JrcyBzYW1wbGUgZGF0YWJhc2UgZm9yIHNvbWUgZGF0YQoJCQkJCXVzaW5nIChTcWxDb25uZWN0aW9uIHNxbENvbm4gPSBuZXcgU3FsQ29ubmVjdGlvbihjb25uZWN0aW9uU3RyaW5nKSkKCQkJCQl7CgkJCQkJCXNxbENvbm4uT3BlbigpOwoJCQkJCQl1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgic2VsZWN0IExhc3ROYW1lICsgJywgJyArIEZpcnN0TmFtZSBBUyBbTmFtZV0sIEVtYWlsQWRkcmVzcywgSm9iVGl0bGUsIENvdW50cnlSZWdpb25OYW1lLCBJU05VTEwoU2FsZXNRdW90YSwwKSBBUyBTYWxlc1F1b3RhLCBJU05VTEwoU2FsZXNRdW90YSwwKSoxMiBBUyBZZWFybHlRdW90YSwgU2FsZXNZVEQgZnJvbSBTYWxlcy52U2FsZXNQZXJzb24gT1JERVIgQlkgU2FsZXNZVEQgZGVzYyIsIHNxbENvbm4pKQoJCQkJCQl7CgkJCQkJCQl1c2luZyAoU3FsRGF0YVJlYWRlciBzcWxSZWFkZXIgPSBzcWxDbWQuRXhlY3V0ZVJlYWRlcigpKQoJCQkJCQkJewoJCQkJCQkJCS8vIGdldCB0aGUgZGF0YSBhbmQgZmlsbCByb3dzIDUgb253YXJkcwoJCQkJCQkJCXdoaWxlIChzcWxSZWFkZXIuUmVhZCgpKQoJCQkJCQkJCXsKCQkJCQkJCQkJaW50IGNvbCA9IDE7CgkJCQkJCQkJCS8vIG91ciBxdWVyeSBoYXMgdGhlIGNvbHVtbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLCBzbyBzaW1wbHkKCQkJCQkJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2x1bW5zCgkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3FsUmVhZGVyLkZpZWxkQ291bnQ7IGkrKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJLy8gdXNlIHRoZSBlbWFpbCBhZGRyZXNzIGFzIGEgaHlwZXJsaW5rIGZvciBjb2x1bW4gMQoJCQkJCQkJCQkJaWYgKHNxbFJlYWRlci5HZXROYW1lKGkpID09ICJFbWFpbEFkZHJlc3MiKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCS8vIGluc2VydCB0aGUgZW1haWwgYWRkcmVzcyBhcyBhIGh5cGVybGluayBmb3IgdGhlIG5hbWUKCQkJCQkJCQkJCQlzdHJpbmcgaHlwZXJsaW5rID0gIm1haWx0bzoiICsgc3FsUmVhZGVyLkdldFZhbHVlKGkpLlRvU3RyaW5nKCk7CgkJCQkJCQkJCQkJd29ya3NoZWV0LkNlbGxzW3JvdywgMV0uSHlwZXJsaW5rID0gbmV3IFVyaShoeXBlcmxpbmssIFVyaUtpbmQuQWJzb2x1dGUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCS8vIGRvIG5vdCBib3RoZXIgZmlsbGluZyBjZWxsIHdpdGggYmxhbmsgZGF0YSAoYWxzbyB1c2VmdWwgaWYgd2UgaGF2ZSBhIGZvcm11bGEgaW4gYSBjZWxsKQoJCQkJCQkJCQkJCWlmIChzcWxSZWFkZXIuR2V0VmFsdWUoaSkgIT0gbnVsbCkKCQkJCQkJCQkJCQkJd29ya3NoZWV0LkNlbGxzW3JvdywgY29sXS5WYWx1ZSA9IHNxbFJlYWRlci5HZXRWYWx1ZShpKTsKCQkJCQkJCQkJCQljb2wrKzsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQlyb3crKzsKCQkJCQkJCQl9CgkJCQkJCQkJc3FsUmVhZGVyLkNsb3NlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1tzdGFydFJvdywgMSwgcm93IC0gMSwgMV0uU3R5bGVOYW1lID0gIkh5cGVyTGluayI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzW3N0YXJ0Um93LCA0LCByb3cgLSAxLCA2XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIlskJC00MDldIywjIzAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1tzdGFydFJvdywgNywgcm93IC0gMSwgN10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIwJSI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1tzdGFydFJvdywgNywgcm93IC0gMSwgN10uRm9ybXVsYVIxQzEgPSAiPUlGKFJDWy0yXT0wLDAsUkNbLTFdL1JDWy0yXSkiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NldCBjb2x1bW4gd2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDEpLldpZHRoID0gMjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigyKS5XaWR0aCA9IDI4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMykuV2lkdGggPSAxODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDQpLldpZHRoID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig1KS5XaWR0aCA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNikuV2lkdGggPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDcpLldpZHRoID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCX0KCQkJCQkJc3FsQ29ubi5DbG9zZSgpOwoJCQkJCX0KCiAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBzZXQgdGhlIGhlYWRlciB0ZXh0IAoJCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICJBZHZlbnR1cmVXb3JrcyBJbmMuIFNhbGVzIFJlcG9ydCI7CgkJCQkJLy8gYWRkIHRoZSBwYWdlIG51bWJlciB0byB0aGUgZm9vdGVyIHBsdXMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcwoJCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkRm9vdGVyLlJpZ2h0QWxpZ25lZFRleHQgPQoJCQkJCQlzdHJpbmcuRm9ybWF0KCJQYWdlIHswfSBvZiB7MX0iLCBFeGNlbEhlYWRlckZvb3Rlci5QYWdlTnVtYmVyLCBFeGNlbEhlYWRlckZvb3Rlci5OdW1iZXJPZlBhZ2VzKTsKCQkJCQkvLyBhZGQgdGhlIHNoZWV0IG5hbWUgdG8gdGhlIGZvb3RlcgoJCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkRm9vdGVyLkNlbnRlcmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLlNoZWV0TmFtZTsKCQkJCQkvLyBhZGQgdGhlIGZpbGUgcGF0aCB0byB0aGUgZm9vdGVyCgkJCQkJd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuTGVmdEFsaWduZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuRmlsZVBhdGggKyBFeGNlbEhlYWRlckZvb3Rlci5GaWxlTmFtZTsKCQkJCX0KCQkJCS8vIHdlIGhhZCBiZXR0ZXIgYWRkIHNvbWUgZG9jdW1lbnQgcHJvcGVydGllcyB0byB0aGUgc3ByZWFkc2hlZXQgCgoJCQkJLy8gc2V0IHNvbWUgY29yZSBwcm9wZXJ0eSB2YWx1ZXMKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIlNhbXBsZSAzIjsKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkF1dGhvciA9ICJKb2huIFR1bm5pY2xpZmZlIjsKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlN1YmplY3QgPSAiRXhjZWxQYWNrYWdlIFNhbXBsZXMiOwoJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuS2V5d29yZHMgPSAiT2ZmaWNlIE9wZW4gWE1MIjsKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNhdGVnb3J5ID0gIkV4Y2VsUGFja2FnZSBTYW1wbGVzIjsKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbW1lbnRzID0gIlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGFuIEV4Y2VsIDIwMDcgZmlsZSBmcm9tIHNjcmF0Y2ggdXNpbmcgdGhlIFBhY2thZ2luZyBBUEkgYW5kIE9mZmljZSBPcGVuIFhNTCI7CgoJCQkJLy8gc2V0IHNvbWUgZXh0ZW5kZWQgcHJvcGVydHkgdmFsdWVzCgkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21wYW55ID0gIkFkdmVudHVyZVdvcmtzIEluYy4iOwogICAgICAgICAgICAgICAgeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuSHlwZXJsaW5rQmFzZSA9IG5ldyBVcmkoImh0dHA6Ly93d3cuY29kZXBsZXguY29tL01TRlREQlByb2RTYW1wbGVzIik7CgoJCQkJLy8gc2V0IHNvbWUgY3VzdG9tIHByb3BlcnR5IHZhbHVlcwoJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQ2hlY2tlZCBieSIsICJKb2huIFR1bm5pY2xpZmZlIik7CgkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJFbXBsb3llZUlEIiwgIjExNDciKTsKCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkFzc2VtYmx5TmFtZSIsICJFeGNlbFBhY2thZ2UiKTsKCQkJCQoJCQkJLy8gc2F2ZSB0aGUgbmV3IHNwcmVhZHNoZWV0CgkJCQl4bFBhY2thZ2UuU2F2ZSgpOwoJCQl9CgoJCQkvLyBpZiB5b3Ugd2FudCB0byB0YWtlIGEgbG9vayBhdCB0aGUgWE1MIGNyZWF0ZWQgaW4gdGhlIHBhY2thZ2UsIHNpbXBseSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcwoJCQkvLyBUaGVzZSBjb3B5IHRoZSBvdXRwdXQgZmlsZSBhbmQgZ2l2ZSBpdCBhIHppcCBleHRlbnNpb24gc28geW91IGNhbiBvcGVuIGl0IGFuZCB0YWtlIGEgbG9vayEKCQkJLy9GaWxlSW5mbyB6aXBGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTMuemlwIik7CgkJCS8vaWYgKHppcEZpbGUuRXhpc3RzKSB6aXBGaWxlLkRlbGV0ZSgpOwoJCQkvL25ld0ZpbGUuQ29weVRvKHppcEZpbGUuRnVsbE5hbWUpOwoKCQkJcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CgkJfQoJfQp9Cg==