cGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnNjbS5wcm92aWRlci5iYXphYXI7CgovKgogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogKiB1bmRlciB0aGUgTGljZW5zZS4KICovCgppbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zY20uU2NtRmlsZVNldDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLlNjbVJlc3VsdDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLnByb3ZpZGVyLmJhemFhci5jb21tYW5kLkJhemFhckNvbW1hbmQ7CmltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLlBsZXh1c1Rlc3RDYXNlOwppbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKLyoqCiAqIENvbW1vbiBjb2RlIHVzZWQgaW4gYWxsIHRlc3RzLgogKgogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp0b3Jiam9ybkBzbW9yZ3Jhdi5vcmciPlRvcmJq+HJuIEVpa2xpIFNt+HJncmF2PC9hPgogKi8KcHVibGljIGNsYXNzIEJhemFhclJlcG9VdGlscwogICAgZXh0ZW5kcyBQbGV4dXNUZXN0Q2FzZQp7CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmaWxlc0luVGVzdEJyYW5jaCA9CiAgICAgICAgbmV3IFN0cmluZ1tdIHsgInBvbS54bWwiLCAicmVhZG1lLnR4dCIsICJzcmMvbWFpbi9qYXZhL0FwcGxpY2F0aW9uLmphdmEiLCAic3JjL3Rlc3QvamF2YS9UZXN0LmphdmEiIH07CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENLX0ZJTEVfQ09OU1RBTlQgPSAiLyI7CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBTkNIX05BTUUgPSAidGFyZ2V0IiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QtYnJhbmNoIjsKCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGUgV09SS0lOR19ESVIgPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLCBCUkFOQ0hfTkFNRSApOwoKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1JVF9NRVNTQUdFID0gIkFkZCBmaWxlcyB0byB0ZXN0IGJyYW5jaCI7CgogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NtVXJsKCkKICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICJzY206YmF6YWFyOmZpbGU6Ly8iICsgV09SS0lOR19ESVIuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXBvKCkKICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICB7CiAgICAgICAgLy8gUHJlcGFyZSB0bXAgZGlyZWN0b3J5CiAgICAgICAgaWYgKCBXT1JLSU5HX0RJUi5leGlzdHMoKSApCiAgICAgICAgewogICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KCBXT1JLSU5HX0RJUiApOwoKICAgICAgICAgICAgaWYgKCBXT1JLSU5HX0RJUi5leGlzdHMoKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbiggV09SS0lOR19ESVIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHdhc24ndCBkZWxldGVkLiIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYm9vbGVhbiB3b3JraW5nRGlyUmVhZHkgPSBXT1JLSU5HX0RJUi5ta2RpcnMoKTsKCiAgICAgICAgaWYgKCAhd29ya2luZ0RpclJlYWR5ICkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbiggIkNvdWxkIG5vdCBpbml0aWF0ZSB0ZXN0IGJyYW5jaCBhdDogIiArIFdPUktJTkdfRElSICk7CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0IHJlcG9zaXRvcnkKICAgICAgICBTdHJpbmdbXSBpbml0X2NtZCA9IG5ldyBTdHJpbmdbXXtCYXphYXJDb21tYW5kLklOSVRfQ01EfTsKICAgICAgICBCYXphYXJVdGlscy5leGVjdXRlKCBXT1JLSU5HX0RJUiwgaW5pdF9jbWQgKTsKCiAgICAgICAgLy8gQ3JlYXRlIGFuZCBhZGQgZmlsZXMgdG8gcmVwb3NpdG9yeQogICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgZmlsZXNJblRlc3RCcmFuY2gubGVuZ3RoOyBpKysgKQogICAgICAgIHsKICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoIFdPUktJTkdfRElSLmdldEFic29sdXRlUGF0aCgpLCBmaWxlc0luVGVzdEJyYW5jaFtpXSApOwogICAgICAgICAgICBpZiAoIGZpbGUuZ2V0UGFyZW50RmlsZSgpICE9IG51bGwgJiYgIWZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgICAgICAgICAgICBpZiAoICFzdWNjZXNzICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yaWVzIGluIGJyYW5jaCBmb3I6ICIgKyBmaWxlICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7CgogICAgICAgICAgICBGaWxlVXRpbHMuZmlsZVdyaXRlKCBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBUQ0tfRklMRV9DT05TVEFOVCArIGZpbGVzSW5UZXN0QnJhbmNoW2ldICk7CgogICAgICAgICAgICBmaWxlcy5hZGQoIGZpbGUgKTsKICAgICAgICB9CgogICAgICAgIC8vQWRkIHRvIHJlcG9zaXRvcnkKICAgICAgICBTdHJpbmdbXSBhZGRfY21kID0gbmV3IFN0cmluZ1tdIHsgQmF6YWFyQ29tbWFuZC5BRERfQ01EIH07CiAgICAgICAgU2NtRmlsZVNldCBmaWxlc1RvQWRkID0gbmV3IFNjbUZpbGVTZXQoIG5ldyBGaWxlKCAiIiApLCBmaWxlcyApOwogICAgICAgIGFkZF9jbWQgPSBCYXphYXJVdGlscy5leHBhbmRDb21tYW5kTGluZSggYWRkX2NtZCwgZmlsZXNUb0FkZCApOwogICAgICAgIFNjbVJlc3VsdCByZXN1bHQgPSBCYXphYXJVdGlscy5leGVjdXRlKCBXT1JLSU5HX0RJUiwgYWRkX2NtZCApOwogICAgICAgIGlmICggIXJlc3VsdC5pc1N1Y2Nlc3MoKSApCiAgICAgICAgewogICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICAiUHJvdmlkZXIgbWVzc2FnZTogIiArIHJlc3VsdC5nZXRQcm92aWRlck1lc3NhZ2UoKSArICJcbiIgKyAiT3V0cHV0OiAiICsgcmVzdWx0LmdldENvbW1hbmRPdXRwdXQoKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggbWVzc2FnZSApOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29tbWl0IHRoZSBpbml0aWFsIHJlcG9zaXRvcnkKICAgICAgICBTdHJpbmdbXSBjb21taXRfY21kID0gbmV3IFN0cmluZ1tde0JhemFhckNvbW1hbmQuQ09NTUlUX0NNRCwgQmF6YWFyQ29tbWFuZC5NRVNTQUdFX09QVElPTiwgQ09NTUlUX01FU1NBR0V9OwogICAgICAgIHJlc3VsdCA9IEJhemFhclV0aWxzLmV4ZWN1dGUoIFdPUktJTkdfRElSLCBjb21taXRfY21kICk7CiAgICAgICAgaWYgKCAhcmVzdWx0LmlzU3VjY2VzcygpICkKICAgICAgICB7CiAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KICAgICAgICAgICAgICAgICJQcm92aWRlciBtZXNzYWdlOiAiICsgcmVzdWx0LmdldFByb3ZpZGVyTWVzc2FnZSgpICsgIlxuIiArICJPdXRwdXQ6ICIgKyByZXN1bHQuZ2V0Q29tbWFuZE91dHB1dCgpOwogICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCBtZXNzYWdlICk7CiAgICAgICAgfQogICAgfQp9Cg==