cGFja2FnZSBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubWV0cmljcy5nZW5lcmF0b3IudWk7CgppbXBvcnQgamF2YS51dGlsLkFycmF5czsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubWV0cmljcy5nZW5lcmF0b3IuaW50ZXJmYWNlcy5JTmV3TWV0cmljV2l6YXJkOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwoKcHVibGljIGNsYXNzIE1ldHJpY0Jhc2ljRGF0YVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewoKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm1ldHJpY3MuTWV0cmljQmFzaWNEYXRhV2l6YXJkUGFnZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9USVRMRSA9ICJOZXcgTWV0cmljOiBCYXNpYyBEYXRhIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0RFU0NSSVBUSU9OID0gIlBsZWFzZSBzcGVjaWZ5IGJhc2ljIG1ldHJpYyBkYXRhLiAiICsKCQkJCQkJCQkJCQkJIlJlcXVpcmVkIGZpZWxkcyBhcmUgZGVub3RlZCBieSBcIigqKVwiLiI7Cglwcml2YXRlIFRleHQgbmFtZVRleHRGaWVsZCwgaWRUZXh0RmllbGQsIGRlc2NyaXB0aW9uVGV4dEZpZWxkOwoJcHJpdmF0ZSBDb21ibyBwcm9qZWN0Q29tYm8sIG1ldGFtb2RlbENvbWJvLCBjb250ZXh0Q29tYm87Cglwcml2YXRlIFN0cmluZyBqYXIgPSAiIjsKCQoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKCQlmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwoJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKCQljcmVhdGVUZXh0RmllbGRzKGNvbnRhaW5lcik7CgkJaW5pdFByb2plY3RzQW5kTWV0YW1vZGVscygpOwoJCXNldENvbnRyb2woY29udGFpbmVyKTsKCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Cgl9CQoKCUBPdmVycmlkZQoJcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7CgkJaWYgKCgoSU5ld01ldHJpY1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFBhZ2VOdW1iZXJzKCkgPiAxKSB7CgkJCXJldHVybiB0aGlzLmlzUGFnZUNvbXBsZXRlKCk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCQoJcHVibGljIFdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7CgkJaWYgKCgoSU5ld01ldHJpY1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFBhZ2VOdW1iZXJzKCkgPiAxKSB7CgkJCXJldHVybiAoKElOZXdNZXRyaWNXaXphcmQpIGdldFdpemFyZCgpKS5nZXRTZWNvbmRQYWdlKCk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoJCglAT3ZlcnJpZGUKCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CgkJaWYgKGV2ZW50LndpZGdldCA9PSBwcm9qZWN0Q29tYm8pIHsKCQkJKChJTmV3TWV0cmljV2l6YXJkKSBnZXRXaXphcmQoKSkuc2V0VGFyZ2V0UHJvamVjdChwcm9qZWN0Q29tYm8uZ2V0VGV4dCgpKTsKCQl9CgkJaWYgKGV2ZW50LndpZGdldCA9PSBtZXRhbW9kZWxDb21ibykgewoJCQlTdHJpbmcgbnNVUkkgPSBtZXRhbW9kZWxDb21iby5nZXRUZXh0KCk7CgkJCWlmIChuc1VSSSAhPSBudWxsICYmICEgbnNVUkkuaXNFbXB0eSgpKSB7CgkJCQlFUGFja2FnZSBlUGFja2FnZSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG5zVVJJKTsKCQkJCWlmIChlUGFja2FnZSAhPSBudWxsKSB7CgkJCQkJamFyID0gZVBhY2thZ2UuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwoJCQkJCWNvbnRleHRDb21iby5yZW1vdmVBbGwoKTsKCQkJCQlPYmplY3RbXSBlT2JqZWN0TmFtZXMgPSBuZXcgT2JqZWN0W2VQYWNrYWdlLmVDb250ZW50cygpLnNpemUoKV07CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlT2JqZWN0TmFtZXMubGVuZ3RoOyBpKyspIHsKCQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZVBhY2thZ2UuZUNvbnRlbnRzKCkuZ2V0KGkpOwoJCQkJCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVOYW1lZEVsZW1lbnQpIHsKCQkJCQkJCWVPYmplY3ROYW1lc1tpXSA9ICgoRU5hbWVkRWxlbWVudCkgZVBhY2thZ2UuZUNvbnRlbnRzKCkuZ2V0KGkpKS5nZXROYW1lKCk7CgkJCQkJCX0KCQkJCQl9CQkJCQkKCQkJICAgICAgICBBcnJheXMuc29ydChlT2JqZWN0TmFtZXMpOwoJCQkJCWZvcihPYmplY3Qgb2JqZWN0IDogZU9iamVjdE5hbWVzKXsKCQkJCQkJY29udGV4dENvbWJvLmFkZCgoU3RyaW5nKW9iamVjdCk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJamFyID0gIiI7CgkJCQljb250ZXh0Q29tYm8ucmVtb3ZlQWxsKCk7CgkJCX0KCQl9CgkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwoJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CQoJfQoKCXB1YmxpYyBNZXRyaWNCYXNpY0RhdGFXaXphcmRQYWdlKCkgewoJCXN1cGVyKFBBR0VfTkFNRSk7CgkJc2V0VGl0bGUoUEFHRV9USVRMRSk7CgkJc2V0RGVzY3JpcHRpb24oUEFHRV9ERVNDUklQVElPTik7Cgl9CgkKCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0RmllbGRzKENvbXBvc2l0ZSBjb250YWluZXIpIHsKCQlMYWJlbCBsYWJlbDsKCQlHcmlkRGF0YSBncmlkRGF0YTsKCQlHcm91cCBncm91cDsKCQlHcmlkTGF5b3V0IGxheW91dDsKCQkvLyAtIFByb2plY3QgLQoJCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwoJCWdyb3VwLnNldFRleHQoIlByb2plY3QgRGF0YSIpOwoJICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwoJICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwoJICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CgkJLy8gY29sOjEKCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwoJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CgkJbGFiZWwuc2V0VGV4dCgiVGFyZ2V0IHByb2plY3QgKCopOiIpOwoJCS8vIGNvbDoyCgkJcHJvamVjdENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKCQlmaW5hbCBHcmlkRGF0YSBwcm9qZWN0Q29tYm9EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkJcHJvamVjdENvbWJvLnNldExheW91dERhdGEocHJvamVjdENvbWJvRGF0YSk7CgkJLy9wcm9qZWN0Q29tYm8uc2V0VGV4dCgiU2VsZWN0IFByb2plY3QiKTsKCQlwcm9qZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7CgkJLy8gLSBNZXRyaWMgRGF0YSAtCgkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7CgkJZ3JvdXAuc2V0VGV4dCgiTWV0cmljIERhdGEiKTsKCSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKCSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwoJICAgIGdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwoJCS8vIC0gTmFtZSAtCgkJLy8gY29sOjEKCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwoJCWxhYmVsLnNldFRleHQoIk5hbWUgKCopOiIpOwoJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CgkJLy8gY29sOjIKCQluYW1lVGV4dEZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwoJCW5hbWVUZXh0RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7CgkJbmFtZVRleHRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKCQkvLyAtIElkIC0KCQkvLyBjb2w6MQoJCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CgkJbGFiZWwuc2V0VGV4dCgiTWV0cmljIElEICgqKToiKTsKCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwoJCS8vIGNvbDoyCgkJaWRUZXh0RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7CgkJaWRUZXh0RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7CgkJaWRUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CgkJLy8gLSBEZXNjcmlwdGlvbiAtCgkJLy8gY29sOjEKCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwoJCWxhYmVsLnNldFRleHQoIkRlc2NyaXB0aW9uOiIpOwoJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CgkJLy8gY29sOjIKCQlkZXNjcmlwdGlvblRleHRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSKTsKCQlkZXNjcmlwdGlvblRleHRGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKCQlkZXNjcmlwdGlvblRleHRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKCQkvLyAtIFNvdXJjZSAtCgkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7CgkJZ3JvdXAuc2V0VGV4dCgiTWV0YSBNb2RlbCBhbmQgQ29udGV4dCBUeXBlIik7CgkgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CgkgICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CgkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKCSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKCSAgICAvLyAtIE1ldGFtb2RlbCAtCgkgCS8vIGNvbDoxCgkgCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CgkgCWxhYmVsLnNldFRleHQoIk1ldGEgbW9kZWwgKCopOiIpOwoJIAlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwoJIAkvLyBjb2w6MgoJIAltZXRhbW9kZWxDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkJPUkRFUik7CgkgCW1ldGFtb2RlbENvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwoJICAgIC8vIC0gQ29udGV4dCAtCgkgCS8vIGNvbDoxCgkgCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CgkgCWxhYmVsLnNldFRleHQoIkNvbnRleHQgdHlwZSAoKik6Iik7CgkgCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CgkgCS8vIGNvbDoyCgkgCWNvbnRleHRDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkJPUkRFUik7CgkgCWNvbnRleHRDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKCX0KCQoJcHJpdmF0ZSB2b2lkIGluaXRQcm9qZWN0c0FuZE1ldGFtb2RlbHMoKXsKCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiAoKElOZXdNZXRyaWNXaXphcmQpIGdldFdpemFyZCgpKS5nZXRQcm9qZWN0cygpKSB7CgkJCXByb2plY3RDb21iby5hZGQocHJvamVjdC5nZXROYW1lKCkpOwoJCX0KCQlPYmplY3QgW10gbWV0YW1vZGVsT2JqZWN0cyA9IAoJCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0Uua2V5U2V0KCkudG9BcnJheShuZXcgT2JqZWN0W0VQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnNpemUoKV0pOwogICAgICAgIEFycmF5cy5zb3J0KG1ldGFtb2RlbE9iamVjdHMpOwoJCWZvcihPYmplY3Qgb2JqZWN0IDogbWV0YW1vZGVsT2JqZWN0cyl7CgkJCW1ldGFtb2RlbENvbWJvLmFkZChvYmplY3QudG9TdHJpbmcoKSk7CgkJfQoJfQoKCS8qKgoJICogV2lyZCBqZWRlcyBtYWwgYXVzZ2Vm/GhyIHdlbm4gc2ljaCBkZXIgSW5oYWx0IGVpbmVzIFRleHRmZWxkZXMgaW0gV2l6YXJkCgkgKiB2ZXLkbmRlcnQuINxiZXJwcvxmdCBkaWUgaW5oYWx0ZSBkZXIgVGV4dGZlbGRlciB1bmQgZXJ6ZXVndAoJICogZW50c2NocHJlY2hlbmRlIE1lbGR1bmdlbiBpbSBXaXphcmRmZW5zdGVyLgoJICovCglwcml2YXRlIHZvaWQgdXBkYXRlUGFnZUNvbXBsZXRlKCkgewoJCWlmKG5hbWVUZXh0RmllbGQuZ2V0VGV4dCgpLmlzRW1wdHkoKSl7CgkJCXRoaXMuc2V0TWVzc2FnZSgiTWV0cmljIG5hbWUgaXMgbm90IHNwZWNpZmllZC4iLCBFUlJPUik7CgkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKCQl9ZWxzZQoJCWlmKGlkVGV4dEZpZWxkLmdldFRleHQoKS5pc0VtcHR5KCkpewoJCQl0aGlzLnNldE1lc3NhZ2UoIk1ldHJpYyBJRCBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCX1lbHNlCgkJaWYobWV0YW1vZGVsQ29tYm8uZ2V0VGV4dCgpLmlzRW1wdHkoKSl7CgkJCXRoaXMuc2V0TWVzc2FnZSgiTWV0cmljIG1ldGFtb2RlbCBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCX1lbHNlCgkJaWYoIGNvbnRleHRDb21iby5nZXRUZXh0KCkuaXNFbXB0eSgpKXsKCQkJdGhpcy5zZXRNZXNzYWdlKCJNZXRyaWMgY29udGV4dCBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCX1lbHNlCgkJaWYoIWNoZWNrUHJvamVjdCgpKXsKCQkJdGhpcy5zZXRNZXNzYWdlKCJUYXJnZXQgcHJvamVjdCBmb3IgdGhlIE1ldHJpYyBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCX1lbHNlewoJCQl0aGlzLnNldE1lc3NhZ2UoIiIpOwoJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKCQkJc2F2ZVRleHRGaWVsZFZhbHVlcygpOwoJCX0KCX0KCQoJcHJpdmF0ZSBib29sZWFuIGNoZWNrUHJvamVjdCgpewoJCWlmKCFwcm9qZWN0Q29tYm8uZ2V0VGV4dCgpLmlzRW1wdHkoKSkKCQkJcmV0dXJuIHRydWU7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglwcml2YXRlIHZvaWQgc2F2ZVRleHRGaWVsZFZhbHVlcygpewoJCSgoSU5ld01ldHJpY1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldE5hbWUodGhpcy5uYW1lVGV4dEZpZWxkLmdldFRleHQoKSk7CgkJKChJTmV3TWV0cmljV2l6YXJkKSBnZXRXaXphcmQoKSkuc2V0SWQodGhpcy5pZFRleHRGaWVsZC5nZXRUZXh0KCkpOwoJCSgoSU5ld01ldHJpY1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb25UZXh0RmllbGQuZ2V0VGV4dCgpKTsKCQkoKElOZXdNZXRyaWNXaXphcmQpIGdldFdpemFyZCgpKS5zZXRNZXRhbW9kZWwodGhpcy5tZXRhbW9kZWxDb21iby5nZXRUZXh0KCkpOwoJCSgoSU5ld01ldHJpY1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldENvbnRleHQodGhpcy5jb250ZXh0Q29tYm8uZ2V0VGV4dCgpKTsKCQkoKElOZXdNZXRyaWNXaXphcmQpIGdldFdpemFyZCgpKS5zZXRKYXIoamFyKTsKCX0KCn0KCQoK