LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci8qKgogKiBBY3Rpb25CYXJDb250cmlidXRvciBmb3IgdGhlIFdlYiBicm93c2VyLgogKiBKdXN0IGFkZHMgY3V0LCBjb3B5LCBwYXN0ZSBhY3Rpb25zLgogKi8KcHVibGljIGNsYXNzIFdlYkJyb3dzZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKCXByb3RlY3RlZCBXZWJCcm93c2VyRWRpdG9yIGVkaXRvcjsKCXByb3RlY3RlZCBBY3Rpb24gYmFjazsKCXByb3RlY3RlZCBBY3Rpb24gZm9yd2FyZDsKCXByb3RlY3RlZCBVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgVXBkYXRlcigpOwoKCWNsYXNzIFVwZGF0ZXIgaW1wbGVtZW50cyBCcm93c2VyVmlld2VyLklCYWNrTmV4dExpc3RlbmVyIHsKCQlwdWJsaWMgdm9pZCB1cGRhdGVCYWNrTmV4dEJ1c3koKSB7CgkJCWlmIChiYWNrID09IG51bGwpCgkJCQlyZXR1cm47CgkJCWJhY2suc2V0RW5hYmxlZChnZXRXZWJCcm93c2VyKCkuaXNCYWNrRW5hYmxlZCgpKTsKCQkJZm9yd2FyZC5zZXRFbmFibGVkKGdldFdlYkJyb3dzZXIoKS5pc0ZvcndhcmRFbmFibGVkKCkpOwoJCQkvL2J1c3kuc2V0QnVzeShnZXRXZWJCcm93c2VyKCkubG9hZGluZyk7CgkJfQoJfQoKCS8qKgoJICogV2ViQnJvd3NlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKgoJICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvciBmb3IgdGhlIGNvbnRyaWJ1dG9yLgoJICovCglwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7CgkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFdlYkJyb3dzZXJFZGl0b3IpIHsKCQkJZWRpdG9yID0gKFdlYkJyb3dzZXJFZGl0b3IpIHRhcmdldEVkaXRvcjsKCQkJV2ViQnJvd3NlckVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldFdlYkJyb3dzZXJFZGl0b3JJbnB1dCgpOwoJCQkKCQkJaWYgKGlucHV0ID09IG51bGwgfHwgaW5wdXQuaXNMb2NhdGlvbkJhckxvY2FsKCkpIHsKCQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7CgkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGVkaXRvci5nZXRDb3B5QWN0aW9uKCkpOwoJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGVkaXRvci5nZXRDdXRBY3Rpb24oKSk7CgkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBlZGl0b3IuZ2V0UGFzdGVBY3Rpb24oKSk7CgkJCX0KCQkJCgkJCS8vaWYgKGlucHV0LmlzVG9vbGJhckdsb2JhbCgpKQoJCQkvLwlnZXRXZWJCcm93c2VyKCkuYmFja05leHRMaXN0ZW5lciA9IHRoaXMudXBkYXRlcjsKCQkJCQoJCQkvL2VkaXRvci51cGRhdGVBY3Rpb25zKCk7CgkJfSBlbHNlCgkJCWVkaXRvciA9IG51bGw7Cgl9CgkKCXByb3RlY3RlZCBCcm93c2VyVmlld2VyIGdldFdlYkJyb3dzZXIoKSB7CgkJaWYgKGVkaXRvciA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQkKCQlyZXR1cm4gZWRpdG9yLndlYkJyb3dzZXI7IAoJfQoKCS8qCiAgICAqIENvbnRyaWJ1dGVzIHRvIHRoZSBnaXZlbiB0b29sIGJhci4KICAgICovCiAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CiAgIAlpZiAoZWRpdG9yID09IG51bGwpCiAgIAkJcmV0dXJuOwogICAJLypXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0V2ViQnJvd3NlckVkaXRvcklucHV0KCk7CiAgIAlpZiAoaW5wdXQuaXNMb2NhdGlvbkJhckdsb2JhbCgpKSB7CgkgICAJZmluYWwgTG9jYXRpb25Db250cmlidXRpb25JdGVtIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uQ29udHJpYnV0aW9uSXRlbSgpOwoJICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChsb2NhdGlvbik7CgkgICAKCSAgIAlBY3Rpb24gZ28gPSBuZXcgQWN0aW9uKCkgewoJICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkgICAJCQlnZXRXZWJCcm93c2VyKCkuc2V0VVJMKGxvY2F0aW9uLmdldFRleHQoKSk7CgkgICAJCX0KCSAgIAl9OwoJICAgCWdvLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX05BVl9HTykpOwoJICAgCWdvLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX0dPKSk7CgkgICAJZ28uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfR08pKTsKCSAgIAlnby5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25XZWJCcm93c2VyR28iKSk7CgkgICAJdG9vbEJhck1hbmFnZXIuYWRkKGdvKTsKICAgCX0KICAgCQogICAJaWYgKGlucHV0LmlzTG9jYXRpb25CYXJHbG9iYWwoKSAmJiBpbnB1dC5pc1Rvb2xiYXJHbG9iYWwoKSkgewogICAJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwogICAJfQogICAJCiAgIAlpZiAoaW5wdXQuaXNUb29sYmFyR2xvYmFsKCkpIHsKCSAgIAlBY3Rpb24gZmF2b3JpdGVzID0gbmV3IEFjdGlvbihNZXNzYWdlcy5hY3Rpb25XZWJCcm93c2VyRmF2b3JpdGVzIiksIElBY3Rpb24uQVNfRFJPUF9ET1dOX01FTlUpIHsKCSAgIAkJcHVibGljIHZvaWQgcnVuKCkgewoJICAgCQkJZ2V0V2ViQnJvd3NlcigpLmFkZEZhdm9yaXRlKCk7CgkgICAJCX0KCSAgIAkJcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKCSAgIAkJCXJldHVybiBuZXcgSU1lbnVDcmVhdG9yKCkgewoJCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCQkJCQkJLy8gZG8gbm90aGluZwoJCQkJCQl9CgkKCQkJCQkJcHVibGljIE1lbnUgZ2V0TWVudShmaW5hbCBDb250cm9sIHBhcmVudCkgewoJCQkJCQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKCQkJCQkJCQoJCQkJCQkJLy8gbG9ja2VkIGZhdm9yaXRlcwoJCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXZWJCcm93c2VyVXRpbC5nZXRMb2NrZWRGYXZvcml0ZXMoKS5pdGVyYXRvcigpOwoJCQkJCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJZmluYWwgRmF2b3JpdGUgZiA9IChGYXZvcml0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkJCQkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKCQkJCQkJCQkJaXRlbS5zZXRUZXh0KGYuZ2V0TmFtZSgpKTsKCQkJCQkJCQkJaXRlbS5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0ZBVk9SSVRFKSk7CgkJCQkJCQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewoJCQkJCQkJCQkJCWdldFdlYkJyb3dzZXIoKS5zZXRVUkwoZi5nZXRVUkwoKSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0pOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWl0ZXJhdG9yID0gV2ViQnJvd3NlclByZWZlcmVuY2UuZ2V0SW50ZXJuYWxXZWJCcm93c2VyRmF2b3JpdGVzKCkuaXRlcmF0b3IoKTsKCQkJCQkJCWlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CgkJCQkJCQkJaXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJOb0Zhdm9yaXRlcyIpKTsKCQkJCQkJCX0KCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJCQkJCQlmaW5hbCBGYXZvcml0ZSBmID0gKEZhdm9yaXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CgkJCQkJCQkJaXRlbS5zZXRUZXh0KGYuZ2V0TmFtZSgpKTsKCQkJCQkJCQlpdGVtLnNldEltYWdlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfRkFWT1JJVEUpKTsKCQkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewoJCQkJCQkJCQkJZ2V0V2ViQnJvd3NlcigpLnNldFVSTChmLmdldFVSTCgpKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0pOwoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7CgkJCQkJCgkJCQkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKCQkJCQkJCWl0ZW0uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25XZWJCcm93c2VyT3JnYW5pemVGYXZvcml0ZXMiKSk7CgkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CgkJCQkJCQkJCU9yZ2FuaXplRmF2b3JpdGVzRGlhbG9nIGRpYWxvZyA9IG5ldyBPcmdhbml6ZUZhdm9yaXRlc0RpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSk7CgkJCQkJCQkJCWRpYWxvZy5vcGVuKCk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCQlyZXR1cm4gbWVudTsKCQkJCQkJfQoJCgkJCQkJCXB1YmxpYyBNZW51IGdldE1lbnUoZmluYWwgTWVudSBwYXJlbnQpIHsKCQkJCQkJCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7CgkJCQkJCQkKCQkJCQkJCS8vIGxvY2tlZCBmYXZvcml0ZXMKCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gV2ViQnJvd3NlclV0aWwuZ2V0TG9ja2VkRmF2b3JpdGVzKCkuaXRlcmF0b3IoKTsKCQkJCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJCWZpbmFsIEZhdm9yaXRlIGYgPSAoRmF2b3JpdGUpIGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CgkJCQkJCQkJCWl0ZW0uc2V0VGV4dChmLmdldE5hbWUoKSk7CgkJCQkJCQkJCWl0ZW0uc2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19GQVZPUklURSkpOwoJCQkJCQkJCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQkJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKCQkJCQkJCQkJCQlnZXRXZWJCcm93c2VyKCkuc2V0VVJMKGYuZ2V0VVJMKCkpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9KTsKCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQlpdGVyYXRvciA9IFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEludGVybmFsV2ViQnJvd3NlckZhdm9yaXRlcygpLml0ZXJhdG9yKCk7CgkJCQkJCQlpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQkJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwoJCQkJCQkJCWl0ZW0uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25XZWJCcm93c2VyTm9GYXZvcml0ZXMiKSk7CgkJCQkJCQl9CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJZmluYWwgRmF2b3JpdGUgZiA9IChGYXZvcml0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwoJCQkJCQkJCWl0ZW0uc2V0VGV4dChmLmdldE5hbWUoKSk7CgkJCQkJCQkJaXRlbS5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0ZBVk9SSVRFKSk7CgkJCQkJCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKCQkJCQkJCQkJCWdldFdlYkJyb3dzZXIoKS5zZXRVUkwoZi5nZXRVUkwoKSk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9KTsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwoJCQkJCQoJCQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7CgkJCQkJCQlpdGVtLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3Nlck9yZ2FuaXplRmF2b3JpdGVzIikpOwoJCQkJCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewoJCQkJCQkJCQlPcmdhbml6ZUZhdm9yaXRlc0RpYWxvZyBkaWFsb2cgPSBuZXcgT3JnYW5pemVGYXZvcml0ZXNEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwoJCQkJCQkJCQlkaWFsb2cub3BlbigpOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQkJcmV0dXJuIG1lbnU7CgkJCQkJCX0KCSAgIAkJCX07CgkgICAJCX0KCSAgIAl9OwoJICAgCWZhdm9yaXRlcy5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfRkFWT1JJVEVTKSk7CgkgICAJZmF2b3JpdGVzLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX0ZBVk9SSVRFUykpOwoJICAgCWZhdm9yaXRlcy5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX05BVl9GQVZPUklURVMpKTsKCSAgIAlmYXZvcml0ZXMuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckZhdm9yaXRlcyIpKTsKCSAgIAl0b29sQmFyTWFuYWdlci5hZGQoZmF2b3JpdGVzKTsKCSAgIAkKCSAgIAliYWNrID0gbmV3IEFjdGlvbigpIHsKCSAgIAkJcHVibGljIHZvaWQgcnVuKCkgewoJICAgCQkJZ2V0V2ViQnJvd3NlcigpLmJhY2soKTsKCSAgIAkJfQoJICAgCX07CgkgICAJYmFjay5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9OQVZfQkFDS1dBUkQpKTsKCQkJYmFjay5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX05BVl9CQUNLV0FSRCkpOwoJCQliYWNrLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX0JBQ0tXQVJEKSk7CgkJCWJhY2suc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uV2ViQnJvd3NlckJhY2siKSk7CgkgICAJdG9vbEJhck1hbmFnZXIuYWRkKGJhY2spOwoJICAgCQoJICAgCWZvcndhcmQgPSBuZXcgQWN0aW9uKCkgewoJICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkgICAJCQlnZXRXZWJCcm93c2VyKCkuZm9yd2FyZCgpOwoJICAgCQl9CgkgICAJfTsKCSAgIAlmb3J3YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX05BVl9GT1JXQVJEKSk7CgkgICAJZm9yd2FyZC5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX05BVl9GT1JXQVJEKSk7CgkJCWZvcndhcmQuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9OQVZfRk9SV0FSRCkpOwoJCQlmb3J3YXJkLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJGb3J3YXJkIikpOwoJICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChmb3J3YXJkKTsKCSAgIAkKCSAgIAlBY3Rpb24gc3RvcCA9IG5ldyBBY3Rpb24oKSB7CgkgICAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCSAgIAkJCWdldFdlYkJyb3dzZXIoKS5zdG9wKCk7CgkgICAJCX0KCSAgIAl9OwoJICAgCXN0b3Auc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX1NUT1ApKTsKCSAgIAlzdG9wLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX1NUT1ApKTsKCSAgIAlzdG9wLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX1NUT1ApKTsKCSAgIAlzdG9wLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJTdG9wIikpOwoJICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChzdG9wKTsKCSAgIAkKCSAgIAlBY3Rpb24gcmVmcmVzaCA9IG5ldyBBY3Rpb24oKSB7CgkgICAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCSAgIAkJCWdldFdlYkJyb3dzZXIoKS5yZWZyZXNoKCk7CgkgICAJCX0KCSAgIAl9OwoJICAgCXJlZnJlc2guc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfTkFWX1JFRlJFU0gpKTsKCSAgIAlyZWZyZXNoLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfTkFWX1JFRlJFU0gpKTsKCSAgIAlyZWZyZXNoLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfTkFWX1JFRlJFU0gpKTsKCSAgIAlyZWZyZXNoLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbldlYkJyb3dzZXJSZWZyZXNoIikpOwoJICAgCXRvb2xCYXJNYW5hZ2VyLmFkZChyZWZyZXNoKTsKICAgCX0qLwogICAJCiAgIAkvKnRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwogICAJCiAgIAlDb250cm9sQ29udHJpYnV0aW9uIGJ1c3lDb250ID0gbmV3IENvbnRyb2xDb250cmlidXRpb24oIndlYmJyb3dzZXIuYnVzeSIpIHsKICAgCSAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewogICAJICAgCWJ1c3kgPSBuZXcgQnVzeUluZGljYXRvcihwYXJlbnQsIFNXVC5OT05FKTsKICAgCSAgIAlyZXR1cm4gYnVzeTsKICAgCSAgIH0KICAgCX07CiAgIAl0b29sQmFyTWFuYWdlci5hZGQoYnVzeUNvbnQpOyovCiAgIH0KfQ==