LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogCiAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgogKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogKgogKgogKiAKICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogKiAKICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAogKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAogKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgogKiAKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSmFuIEvkbGxtYW4JCUFkZGVkCQkyMSBNYXIgMjAxMAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5JTzsKdXNpbmcgT2ZmaWNlT3BlblhtbDsKdXNpbmcgU3lzdGVtLlhtbDsKdXNpbmcgU3lzdGVtLkRyYXdpbmc7CnVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cm5hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCnsKCWNsYXNzIFNhbXBsZTEKCXsKCQkvLy8gPHN1bW1hcnk+CgkJLy8vIFNhbXBsZSAxIC0gc2ltcGx5IGNyZWF0ZXMgYSBuZXcgd29ya2Jvb2sgZnJvbSBzY3JhdGNoLgoJCS8vLyBUaGUgd29ya2Jvb2sgY29udGFpbnMgb25lIHdvcmtzaGVldCB3aXRoIGEgc2ltcGxlIGludmVydG9yeSBsaXN0CgkJLy8vIDwvc3VtbWFyeT4KCQlwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGUxKERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQoJCXsKCQkJRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKCQkJaWYgKG5ld0ZpbGUuRXhpc3RzKQoJCQl7CgkJCQluZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKCQkJCW5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4Iik7CgkJCX0KCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkludmVudG9yeSIpOwogICAgICAgICAgICAgICAgLy9BZGQgdGhlIGhlYWRlcnMKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJJRCI7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgM10uVmFsdWUgPSAiUXVhbnRpdHkiOwogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDRdLlZhbHVlID0gIlByaWNlIjsKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7CgogICAgICAgICAgICAgICAgLy9BZGQgc29tZSBpdGVtcy4uLgogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTIwMDE7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiTmFpbHMiOwogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMiJdLlZhbHVlID0gMzc7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAzLjk5OwoKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDEyMDAyOwogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gIkhhbW1lciI7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMzIl0uVmFsdWUgPSA1OwogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMyJdLlZhbHVlID0gMTIuMTA7CgogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gMTIwMDM7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAiU2F3IjsKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9IDEyOwogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENCJdLlZhbHVlID0gMTUuMzc7CgogICAgICAgICAgICAgICAgLy9BZGQgYSBmb3JtdWxhIGZvciB0aGUgdmFsdWUtY29sdW1uCiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkUyOkU0Il0uRm9ybXVsYSA9ICJDMipEMiI7CgogICAgICAgICAgICAgICAgLy9PayBub3cgZm9ybWF0IHRoZSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJhbmdlID0gd29ya3NoZWV0LkNlbGxzWzEsIDEsIDEsIDVdKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5EYXJrQmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE1OkU1Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbNSwgMywgNSwgNV0uRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIlNVQlRPVEFMKDksezB9KSIsIG5ldyBFeGNlbEFkZHJlc3MoMiwzLDQsMykuQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMyOkM1Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyOkU1Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMC4wMCI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGFuIGF1dG9maWx0ZXIgZm9yIHRoZSByYW5nZQogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMTpFNCJdLkF1dG9GaWx0ZXIgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTI6QTQiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIkAiOyAgIC8vRm9ybWF0IGFzIHRleHQKCiAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIGFjdHVhbGx5IG5vIG5lZWQgdG8gY2FsY3VsYXRlLCBFeGNlbCB3aWxsIGRvIGl0IGZvciB5b3UsIGJ1dCBpbiBzb21lIGNhc2VzIGl0IG1pZ2h0IGJlIHVzZWZ1bC4gCiAgICAgICAgICAgICAgICAvL0ZvciBleGFtcGxlIGlmIHlvdSBsaW5rIHRvIHRoaXMgd29ya2Jvb2sgZnJvbSBhbm90aGVyIHdvcmtib29rIG9yIHlvdSB3aWxsIG9wZW4gdGhlIHdvcmtib29rIGluIGEgcHJvZ3JhbSB0aGF0IGhhc24ndCBhIGNhbGN1bGF0aW9uIGVuZ2luZSBvciAKICAgICAgICAgICAgICAgIC8veW91IHdhbnQgdG8gdXNlIHRoZSByZXN1bHQgb2YgYSBmb3JtdWxhIGluIHlvdXIgcHJvZ3JhbS4KICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DYWxjdWxhdGUoKTsgCgogICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzLkF1dG9GaXRDb2x1bW5zKDApOyAgLy9BdXRvZml0IGNvbHVtbnMgZm9yIGFsbCBjZWxscwoKICAgICAgICAgICAgICAgIC8vIGxldHMgc2V0IHRoZSBoZWFkZXIgdGV4dCAKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICImMjQmVSZcIkFyaWFsLFJlZ3VsYXIgQm9sZFwiIEludmVudG9yeSI7CiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHBhZ2UgbnVtYmVyIHRvIHRoZSBmb290ZXIgcGx1cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLk9kZEZvb3Rlci5SaWdodEFsaWduZWRUZXh0ID0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCJQYWdlIHswfSBvZiB7MX0iLCBFeGNlbEhlYWRlckZvb3Rlci5QYWdlTnVtYmVyLCBFeGNlbEhlYWRlckZvb3Rlci5OdW1iZXJPZlBhZ2VzKTsKICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgc2hlZXQgbmFtZSB0byB0aGUgZm9vdGVyCiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLk9kZEZvb3Rlci5DZW50ZXJlZFRleHQgPSBFeGNlbEhlYWRlckZvb3Rlci5TaGVldE5hbWU7CiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGZpbGUgcGF0aCB0byB0aGUgZm9vdGVyCiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLk9kZEZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgPSBFeGNlbEhlYWRlckZvb3Rlci5GaWxlUGF0aCArIEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVOYW1lOwoKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IHdvcmtzaGVldC5DZWxsc1siMToyIl07CiAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSB3b3Jrc2hlZXQuQ2VsbHNbIkE6RyJdOwoKICAgICAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgc2hlZXQgdmlldyB0byBzaG93IGl0IGluIHBhZ2UgbGF5b3V0IG1vZGUKICAgICAgICAgICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgc29tZSBkb2N1bWVudCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5BdXRob3IgPSAiSmFuIEvkbGxtYW4iOwogICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbW1lbnRzID0gIlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGFuIEV4Y2VsIDIwMDcgd29ya2Jvb2sgdXNpbmcgRVBQbHVzIjsKCiAgICAgICAgICAgICAgICAvLyBzZXQgc29tZSBleHRlbmRlZCBwcm9wZXJ0eSB2YWx1ZXMKICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21wYW55ID0gIkFkdmVudHVyZVdvcmtzIEluYy4iOwoKICAgICAgICAgICAgICAgIC8vIHNldCBzb21lIGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMKICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJDaGVja2VkIGJ5IiwgIkphbiBL5GxsbWFuIik7CiAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkVQUGx1cyIpOwogICAgICAgICAgICAgICAgLy8gc2F2ZSBvdXIgbmV3IHdvcmtib29rIGFuZCB3ZSBhcmUgZG9uZSEKICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CgkJfQoJfQp9Cg==