LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAxMyBDRUEgTElTVC4KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKgkJUulnaXMgQ0hFVlJFTDogY2hldnJlbC5yZWdpcyA8YXQ+IGdtYWlsLmNvbQogKgkJQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuZGlhZ3JhbS5wYXJhbWV0cmljLnByb3ZpZGVyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JU3BlY2lhbGl6YXRpb25UeXBlOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbC5jb25zdHJhaW50cy5Db25zdHJhaW50QmxvY2s7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0uY29tbW9uLnV0aWxzLlN5c01MR3JhcGhpY2FsVHlwZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0uaW50ZXJuYWxibG9jay5wcm92aWRlci5FbGVtZW50VHlwZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLnNlcnZpY2UudHlwZXMuZWxlbWVudC5TeXNNTEVsZW1lbnRUeXBlczsKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMudW1sLmRpYWdyYW0uY29tbW9uLnV0aWxzLlVNTEdyYXBoaWNhbFR5cGVzOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy51bWwuc2VydmljZS50eXBlcy5lbGVtZW50LlVNTEVsZW1lbnRUeXBlczsKaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkVsZW1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CgpwdWJsaWMgY2xhc3MgQ3VzdG9tR3JhcGhpY2FsVHlwZVJlZ2lzdHJ5IGV4dGVuZHMgR3JhcGhpY2FsVHlwZVJlZ2lzdHJ5IHsKCgkvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLwoJcHVibGljIEN1c3RvbUdyYXBoaWNhbFR5cGVSZWdpc3RyeSgpIHsKCgkJc3VwZXIoKTsKCgkJLy8gTm9kZXMKCQlrbm93bk5vZGVzLmFkZChTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0NPTlNUUkFJTlRCTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQpOwoJCWtub3duTm9kZXMuYWRkKFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfRkxPV1BPUlRfQVNfQUZGSVhFRF9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuU0hBUEVfVU1MX1BPUlRfQVNfQUZGSVhFRF9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuU0hBUEVfVU1MX1BST1BFUlRZX0FTX0FGRklYRURfSUQpOwoJCS8vIERlY29yYXRpb25zCgkJa25vd25Ob2Rlcy5hZGQoU3lzTUxHcmFwaGljYWxUeXBlcy5BRkZJWEVETEFCRUxfU1lTTUxfRkxPV1BPUlRfTEFCRUxfSUQpOwoJCWtub3duTm9kZXMuYWRkKFN5c01MR3JhcGhpY2FsVHlwZXMuQ09NUEFSVE1FTlRfU1lTTUxfQkxPQ0tQUk9QRVJUWV9TVFJVQ1RVUkVfSUQpOwoJCWtub3duTm9kZXMuYWRkKFN5c01MR3JhcGhpY2FsVHlwZXMuQ09NUEFSVE1FTlRfU1lTTUxfU1RSVUNUVVJFX0lEKTsKCQlrbm93bk5vZGVzLmFkZChTeXNNTEdyYXBoaWNhbFR5cGVzLkxBQkVMX1NZU01MX0JMT0NLX05BTUVfSUQpOwoJCWtub3duTm9kZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkFGRklYRURMQUJFTF9VTUxfQVBQTElFRFNURVJFT1RZUEVfSUQpOwoJCWtub3duTm9kZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkFGRklYRURMQUJFTF9VTUxfUE9SVF9MQUJFTF9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuTEFCRUxfVU1MX1BST1BFUlRZX0xBQkVMX0lEKTsKCQlrbm93bk5vZGVzLmFkZChVTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9VTUxfQ09OU1RSQUlOVF9BU19MQUJFTF9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuTElOS0xBQkVMX1VNTF9BUFBMSUVEU1RFUkVPVFlQRV9JRCk7CgkJa25vd25Ob2Rlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuTElOS0xBQkVMX1VNTF9DT05ORUNUT1JfTEFCRUxfSUQpOwoJCWtub3duTm9kZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkxJTktMQUJFTF9VTUxfQ09OTkVDVE9SX1NPVVJDRV9NVUxUSVBMSUNJVFlfSUQpOwoJCWtub3duTm9kZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkxJTktMQUJFTF9VTUxfQ09OTkVDVE9SX1RBUkdFVF9NVUxUSVBMSUNJVFlfSUQpOwoJCWtub3duTm9kZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkxJTktMQUJFTF9VTUxfTkFNRURFTEVNRU5UX05BTUVfSUQpOwoKCQkvLyBFZGdlcwoJCWtub3duRWRnZXMuYWRkKFVNTEdyYXBoaWNhbFR5cGVzLkxJTktfVU1MX0NPTk5FQ1RPUl9JRCk7CgkJa25vd25FZGdlcy5hZGQoVU1MR3JhcGhpY2FsVHlwZXMuTElOS19VTUxfREVQRU5ERU5DWV9JRCk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKi8KCUBPdmVycmlkZQoJcHVibGljIFN0cmluZyBnZXROb2RlR3JhcGhpY2FsVHlwZShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBjb250YWluZXJUeXBlKSB7CgkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGdldE5vZGVHcmFwaGljYWxUeXBlKEVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIGNvbnRhaW5lclR5cGUpCgkJLy8gRW5kIG9mIHVzZXIgY29kZQoKCQlpZiAoKChJU3BlY2lhbGl6YXRpb25UeXBlKSBTeXNNTEVsZW1lbnRUeXBlcy5CTE9DSykuZ2V0TWF0Y2hlcigpLm1hdGNoZXMoZG9tYWluRWxlbWVudCkpIHsKCQkJaWYgKEVsZW1lbnRUeXBlcy5ESUFHUkFNX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCXJldHVybiBVTkRFRklORURfVFlQRTsKCQl9CgkJaWYgKCgoSVNwZWNpYWxpemF0aW9uVHlwZSkgU3lzTUxFbGVtZW50VHlwZXMuQ09OU1RSQUlOVF9QUk9QRVJUWSkuZ2V0TWF0Y2hlcigpLm1hdGNoZXMoZG9tYWluRWxlbWVudCkpIHsKCQkJaWYgKFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tfQVNfQ09NUE9TSVRFX0lELmVxdWFscyhkb21haW5FbGVtZW50KSkgewoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQ09OU1RSQUlOVEJMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX0JMT0NLUFJPUEVSVFlfU1RSVUNUVVJFX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQ09OU1RSQUlOVEJMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0NPTlNUUkFJTlRCTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlyZXR1cm4gVU5ERUZJTkVEX1RZUEU7CgkJfQoKCQkvLyBUaGVzZSBlbGVtZW50IGFyZSBvbmx5IGF1dGhvcml6ZWQgb24gQmxvY2ssIG5vdCBpbiBDb25zdHJhaW50IEJsb2NrLiBJbiBDb25zdHJhaW50QmxvY2sgaXQgbXVzdCBiZWNvbWUgYSBDb25zdHJhaW50UGFyYW1ldGVyCgkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKChFbGVtZW50KSBkb21haW5FbGVtZW50LmVDb250YWluZXIoKSwgQ29uc3RyYWludEJsb2NrLmNsYXNzKSA9PSBudWxsKSB7CgkJCWlmICgoKElTcGVjaWFsaXphdGlvblR5cGUpIFN5c01MRWxlbWVudFR5cGVzLlBBUlRfUFJPUEVSVFkpLmdldE1hdGNoZXIoKS5tYXRjaGVzKGRvbWFpbkVsZW1lbnQpKSB7CgkJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tQUk9QRVJUWV9BU19DT01QT1NJVEVfSUQ7CgkJCQl9CgkJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5DT01QQVJUTUVOVF9TWVNNTF9CTE9DS1BST1BFUlRZX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJCX0KCQkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJCX0KCQkJCXJldHVybiBVTkRFRklORURfVFlQRTsKCQkJfQoJCQlpZiAoKChJU3BlY2lhbGl6YXRpb25UeXBlKSBTeXNNTEVsZW1lbnRUeXBlcy5SRUZFUkVOQ0VfUFJPUEVSVFkpLmdldE1hdGNoZXIoKS5tYXRjaGVzKGRvbWFpbkVsZW1lbnQpKSB7CgkJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tQUk9QRVJUWV9BU19DT01QT1NJVEVfSUQ7CgkJCQl9CgkJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5DT01QQVJUTUVOVF9TWVNNTF9CTE9DS1BST1BFUlRZX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJCX0KCQkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJCX0KCQkJCXJldHVybiBVTkRFRklORURfVFlQRTsKCQkJfQoJCQlpZiAoKChJU3BlY2lhbGl6YXRpb25UeXBlKSBTeXNNTEVsZW1lbnRUeXBlcy5WQUxVRV9QUk9QRVJUWSkuZ2V0TWF0Y2hlcigpLm1hdGNoZXMoZG9tYWluRWxlbWVudCkpIHsKCQkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLX0FTX0NPTVBPU0lURV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJCX0KCQkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX0JMT0NLUFJPUEVSVFlfU1RSVUNUVVJFX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQkJfQoJCQkJaWYgKFN5c01MR3JhcGhpY2FsVHlwZXMuQ09NUEFSVE1FTlRfU1lTTUxfU1RSVUNUVVJFX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQkJfQoJCQkJcmV0dXJuIFVOREVGSU5FRF9UWVBFOwoJCQl9CgkJfQoJCS8vIE9yZGVyIGlzIGltcG9ydGFudCBmb3IgUGFydC9SZWZlcmVuY2UvQ29uc3RyYWludFByb3BlcnR5IHdoaWNoIGFyZSBhbHNvIFByb3BlcnR5CgkJaWYgKFVNTEVsZW1lbnRUeXBlcy5QUk9QRVJUWS5nZXRFQ2xhc3MoKS5pc0luc3RhbmNlKGRvbWFpbkVsZW1lbnQpKSB7CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0NPTlNUUkFJTlRCTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBVTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9VTUxfUFJPUEVSVFlfQVNfQUZGSVhFRF9JRDsKCQkJfQoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQlyZXR1cm4gVU1MR3JhcGhpY2FsVHlwZXMuU0hBUEVfVU1MX1BST1BFUlRZX0FTX0FGRklYRURfSUQ7CgkJCX0KCQkJcmV0dXJuIFVOREVGSU5FRF9UWVBFOwoKCQl9CgkJaWYgKCgoSVNwZWNpYWxpemF0aW9uVHlwZSkgU3lzTUxFbGVtZW50VHlwZXMuQkxPQ0spLmdldE1hdGNoZXIoKS5tYXRjaGVzKGRvbWFpbkVsZW1lbnQpKSB7CgkJCWlmIChFbGVtZW50VHlwZXMuRElBR1JBTV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlyZXR1cm4gVU5ERUZJTkVEX1RZUEU7CgkJfQoJCXJldHVybiBzdXBlci5nZXROb2RlR3JhcGhpY2FsVHlwZShkb21haW5FbGVtZW50LCBjb250YWluZXJUeXBlKTsKCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqLwoJQE92ZXJyaWRlCglwdWJsaWMgU3RyaW5nIGdldE5vZGVHcmFwaGljYWxUeXBlKFN0cmluZyBwcm9wb3NlZFR5cGUsIFN0cmluZyBjb250YWluZXJUeXBlKSB7CgkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGdldE5vZGVHcmFwaGljYWxUeXBlKFN0cmluZyBwcm9wb3NlZFR5cGUsIFN0cmluZyBjb250YWluZXJUeXBlKQoJCS8vIEVuZCBvZiB1c2VyIGNvZGUKCgkJaWYgKFN5c01MRWxlbWVudFR5cGVzLkJMT0NLLmdldFNlbWFudGljSGludCgpLmVxdWFscyhwcm9wb3NlZFR5cGUpKSB7CgkJCWlmIChFbGVtZW50VHlwZXMuRElBR1JBTV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlyZXR1cm4gVU5ERUZJTkVEX1RZUEU7CgkJfQoKCQlpZiAoVU1MRWxlbWVudFR5cGVzLlBST1BFUlRZLmdldFNlbWFudGljSGludCgpLmVxdWFscyhwcm9wb3NlZFR5cGUpKSB7CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0NPTlNUUkFJTlRCTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBVTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9VTUxfUFJPUEVSVFlfQVNfQUZGSVhFRF9JRDsKCQkJfQoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQlyZXR1cm4gVU1MR3JhcGhpY2FsVHlwZXMuU0hBUEVfVU1MX1BST1BFUlRZX0FTX0FGRklYRURfSUQ7CgkJCX0KCQkJcmV0dXJuIFVOREVGSU5FRF9UWVBFOwoJCX0KCgkJaWYgKFN5c01MRWxlbWVudFR5cGVzLkNPTlNUUkFJTlRfUFJPUEVSVFkuZ2V0U2VtYW50aWNIaW50KCkuZXF1YWxzKHByb3Bvc2VkVHlwZSkpIHsKCQkJaWYgKFN5c01MR3JhcGhpY2FsVHlwZXMuQ09NUEFSVE1FTlRfU1lTTUxfQkxPQ0tQUk9QRVJUWV9TVFJVQ1RVUkVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQ09OU1RSQUlOVEJMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0NPTlNUUkFJTlRCTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlyZXR1cm4gVU5ERUZJTkVEX1RZUEU7CgkJfQoKCQlpZiAoU3lzTUxFbGVtZW50VHlwZXMuUEFSVF9QUk9QRVJUWS5nZXRTZW1hbnRpY0hpbnQoKS5lcXVhbHMocHJvcG9zZWRUeXBlKSkgewoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5DT01QQVJUTUVOVF9TWVNNTF9CTE9DS1BST1BFUlRZX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCXJldHVybiBVTkRFRklORURfVFlQRTsKCQl9CgkJaWYgKFN5c01MRWxlbWVudFR5cGVzLlJFRkVSRU5DRV9QUk9QRVJUWS5nZXRTZW1hbnRpY0hpbnQoKS5lcXVhbHMocHJvcG9zZWRUeXBlKSkgewoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS19BU19DT01QT1NJVEVfSUQuZXF1YWxzKGNvbnRhaW5lclR5cGUpKSB7CgkJCQlyZXR1cm4gU3lzTUxHcmFwaGljYWxUeXBlcy5TSEFQRV9TWVNNTF9CTE9DS1BST1BFUlRZX0FTX0NPTVBPU0lURV9JRDsKCQkJfQoJCQlpZiAoU3lzTUxHcmFwaGljYWxUeXBlcy5DT01QQVJUTUVOVF9TWVNNTF9CTE9DS1BST1BFUlRZX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX1NUUlVDVFVSRV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCXJldHVybiBVTkRFRklORURfVFlQRTsKCQl9CgkJaWYgKFN5c01MRWxlbWVudFR5cGVzLlZBTFVFX1BST1BFUlRZLmdldFNlbWFudGljSGludCgpLmVxdWFscyhwcm9wb3NlZFR5cGUpKSB7CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLX0FTX0NPTVBPU0lURV9JRC5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKCQkJCXJldHVybiBTeXNNTEdyYXBoaWNhbFR5cGVzLlNIQVBFX1NZU01MX0JMT0NLUFJPUEVSVFlfQVNfQ09NUE9TSVRFX0lEOwoJCQl9CgkJCWlmIChTeXNNTEdyYXBoaWNhbFR5cGVzLkNPTVBBUlRNRU5UX1NZU01MX0JMT0NLUFJPUEVSVFlfU1RSVUNUVVJFX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tQUk9QRVJUWV9BU19DT01QT1NJVEVfSUQ7CgkJCX0KCQkJaWYgKFN5c01MR3JhcGhpY2FsVHlwZXMuQ09NUEFSVE1FTlRfU1lTTUxfU1RSVUNUVVJFX0lELmVxdWFscyhjb250YWluZXJUeXBlKSkgewoJCQkJcmV0dXJuIFN5c01MR3JhcGhpY2FsVHlwZXMuU0hBUEVfU1lTTUxfQkxPQ0tQUk9QRVJUWV9BU19DT01QT1NJVEVfSUQ7CgkJCX0KCQkJcmV0dXJuIFVOREVGSU5FRF9UWVBFOwoJCX0KCQlyZXR1cm4gc3VwZXIuZ2V0Tm9kZUdyYXBoaWNhbFR5cGUocHJvcG9zZWRUeXBlLCBjb250YWluZXJUeXBlKTsKCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqLwoJQE92ZXJyaWRlCglwdWJsaWMgU3RyaW5nIGdldEVkZ2VHcmFwaGljYWxUeXBlKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewoJCS8vIFN0YXJ0IG9mIHVzZXIgY29kZSBnZXRFZGdlR3JhcGhpY2FsVHlwZShFT2JqZWN0IGRvbWFpbkVsZW1lbnQpCgkJLy8gRW5kIG9mIHVzZXIgY29kZQoKCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNPTk5FQ1RPUi5nZXRFQ2xhc3MoKS5pc0luc3RhbmNlKGRvbWFpbkVsZW1lbnQpKSB7CgkJCXJldHVybiBVTUxHcmFwaGljYWxUeXBlcy5MSU5LX1VNTF9DT05ORUNUT1JfSUQ7CgkJfQoJCWlmIChVTUxFbGVtZW50VHlwZXMuREVQRU5ERU5DWS5nZXRFQ2xhc3MoKS5pc0luc3RhbmNlKGRvbWFpbkVsZW1lbnQpKSB7CgkJCXJldHVybiBVTUxHcmFwaGljYWxUeXBlcy5MSU5LX1VNTF9ERVBFTkRFTkNZX0lEOwoJCX0KCQlyZXR1cm4gc3VwZXIuZ2V0RWRnZUdyYXBoaWNhbFR5cGUoZG9tYWluRWxlbWVudCk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKi8KCUBPdmVycmlkZQoJcHVibGljIFN0cmluZyBnZXRFZGdlR3JhcGhpY2FsVHlwZShTdHJpbmcgcHJvcG9zZWRUeXBlKSB7CgkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGdldEVkZ2VHcmFwaGljYWxUeXBlKFN0cmluZyBwcm9wb3NlZFR5cGUpCgkJLy8gRW5kIG9mIHVzZXIgY29kZQoKCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNPTk5FQ1RPUi5nZXRTZW1hbnRpY0hpbnQoKS5lcXVhbHMocHJvcG9zZWRUeXBlKSkgewoJCQlyZXR1cm4gVU1MR3JhcGhpY2FsVHlwZXMuTElOS19VTUxfQ09OTkVDVE9SX0lEOwoJCX0KCQlpZiAoVU1MRWxlbWVudFR5cGVzLkRFUEVOREVOQ1kuZ2V0U2VtYW50aWNIaW50KCkuZXF1YWxzKHByb3Bvc2VkVHlwZSkpIHsKCQkJcmV0dXJuIFVNTEdyYXBoaWNhbFR5cGVzLkxJTktfVU1MX0RFUEVOREVOQ1lfSUQ7CgkJfQoJCXJldHVybiBzdXBlci5nZXRFZGdlR3JhcGhpY2FsVHlwZShwcm9wb3NlZFR5cGUpOwoJfQp9Cg==