Ly8gQ29weXJpZ2h0IDIwMDYsIDIwMDksIDIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCnBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTUuaW50ZXJuYWwuc2VydmljZXM7CgppbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGFwZXN0cnk1LmlvYy5pbnRlcm5hbC51dGlsLkNvbGxlY3Rpb25GYWN0b3J5Lm5ld1NldDsKCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CgppbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeTUuT3B0aW9uTW9kZWw7CmltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5NS5TZWxlY3RNb2RlbDsKaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnk1LmludGVybmFsLnRlc3QuSW50ZXJuYWxCYXNlVGVzdENhc2U7CmltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5NS5pb2Muc2VydmljZXMuVGhyZWFkTG9jYWxlOwppbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeTUuaW9jLnRlc3QuVGVzdEJhc2U7CmltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5NS5zZXJ2aWNlcy5Mb2NhbGl6YXRpb25TZXR0ZXI7CmltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5NS5zZXJ2aWNlcy5QZXJzaXN0ZW50TG9jYWxlOwppbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeTUuc2VydmljZXMuUmVxdWVzdDsKaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKCnB1YmxpYyBjbGFzcyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsVGVzdCBleHRlbmRzIEludGVybmFsQmFzZVRlc3RDYXNlCnsKCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgbG9jYWxlX3NwbGl0KCkKICAgIHsKICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxpemF0aW9uU2V0dGVySW1wbC5zdHJpcFRlcm0oImZvb19iYXJfQmF6IiksICJmb29fYmFyIik7CiAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsaXphdGlvblNldHRlckltcGwuc3RyaXBUZXJtKCJmb29fYmFyIiksICJmb28iKTsKICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxpemF0aW9uU2V0dGVySW1wbC5zdHJpcFRlcm0oImZvbyIpLCAiIik7CiAgICB9CgogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIHRvX2xvY2FsZV9pc19jYWNoZWQoKQogICAgewogICAgICAgIExvY2FsaXphdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgTG9jYWxpemF0aW9uU2V0dGVySW1wbChudWxsLCBudWxsLCBudWxsLCAiZW4iKTsKCiAgICAgICAgTG9jYWxlIGwxID0gc2V0dGVyLnRvTG9jYWxlKCJlbiIpOwoKICAgICAgICBhc3NlcnRFcXVhbHMobDEudG9TdHJpbmcoKSwgImVuIik7CgogICAgICAgIGNoZWNrTG9jYWxlKGwxLCAiZW4iLCAiIiwgIiIpOwoKICAgICAgICBhc3NlcnRTYW1lKHNldHRlci50b0xvY2FsZSgiZW4iKSwgbDEpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBjaGVja0xvY2FsZShMb2NhbGUgbCwgU3RyaW5nIGV4cGVjdGVkTGFuZ3VhZ2UsIFN0cmluZyBleHBlY3RlZENvdW50cnksIFN0cmluZyBleHBlY3RlZFZhcmlhbnQpCiAgICB7CiAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0TGFuZ3VhZ2UoKSwgZXhwZWN0ZWRMYW5ndWFnZSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKGwuZ2V0Q291bnRyeSgpLCBleHBlY3RlZENvdW50cnkpOwogICAgICAgIGFzc2VydEVxdWFscyhsLmdldFZhcmlhbnQoKSwgZXhwZWN0ZWRWYXJpYW50KTsKICAgIH0KCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgdG9fbG9jYWxlKCkKICAgIHsKICAgICAgICBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsIHNldHRlciA9IG5ldyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsKG51bGwsIG51bGwsIG51bGwsICJlbiIpOwoKICAgICAgICBjaGVja0xvY2FsZShzZXR0ZXIudG9Mb2NhbGUoImVuIiksICJlbiIsICIiLCAiIik7CiAgICAgICAgY2hlY2tMb2NhbGUoc2V0dGVyLnRvTG9jYWxlKCJrbGluZ29uX0dhY2giKSwgImtsaW5nb24iLCAiR0FDSCIsICIiKTsKICAgICAgICBjaGVja0xvY2FsZShzZXR0ZXIudG9Mb2NhbGUoImtsaW5nb25fR2FjaF9zbnVmZiIpLCAia2xpbmdvbiIsICJHQUNIIiwgInNudWZmIik7CiAgICB9CgogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIGtub3duX2xvY2FsZSgpCiAgICB7CiAgICAgICAgUGVyc2lzdGVudExvY2FsZSBwbCA9IG1vY2tQZXJzaXN0ZW50TG9jYWxlKCk7CiAgICAgICAgVGhyZWFkTG9jYWxlIHRsID0gbW9ja1RocmVhZExvY2FsZSgpOwogICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG1vY2tSZXF1ZXN0KCk7CgogICAgICAgIHRsLnNldExvY2FsZShMb2NhbGUuRlJFTkNIKTsKICAgICAgICBwbC5zZXQoTG9jYWxlLkZSRU5DSCk7CgogICAgICAgIHJlcGxheSgpOwoKICAgICAgICBMb2NhbGl6YXRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IExvY2FsaXphdGlvblNldHRlckltcGwocmVxdWVzdCwgcGwsIHRsLCAiZW4sZnIiKTsKCiAgICAgICAgYXNzZXJ0VHJ1ZShzZXR0ZXIuc2V0TG9jYWxlRnJvbUxvY2FsZU5hbWUoImZyIikpOwoKICAgICAgICB2ZXJpZnkoKTsKICAgIH0KCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgZ2V0X3NlbGVjdGVkX2xvY2FsZXMoKQogICAgewogICAgICAgIExvY2FsaXphdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgTG9jYWxpemF0aW9uU2V0dGVySW1wbChudWxsLCBudWxsLCBudWxsLCAiZW4sZnIiKTsKCiAgICAgICAgYXNzZXJ0TGlzdHNFcXVhbHMoc2V0dGVyLmdldFN1cHBvcnRlZExvY2FsZXMoKSwgTG9jYWxlLkVOR0xJU0gsIExvY2FsZS5GUkVOQ0gpOwogICAgfQogICAgCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgZ2V0X3NlbGVjdGVkX2xvY2FsZV9uYW1lcygpCiAgICB7CiAgICAgICAgTG9jYWxpemF0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsKG51bGwsIG51bGwsIG51bGwsICJlbixmciIpOwogICAgICAgIAogICAgICAgIE9iamVjdCBsb2NhbGVOYW1lcyA9IFRlc3RCYXNlLmdldChzZXR0ZXIsICJzdXBwb3J0ZWRMb2NhbGVOYW1lcyIpOwoKICAgICAgICBhc3NlcnRUcnVlKG5ld1NldCgiZW4iLCAiZnIiKS5lcXVhbHMobG9jYWxlTmFtZXMpKTsKICAgIH0KICAgIAogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIGdldF9zZWxlY3RlZF9sb2NhbGVfbmFtZXNfd2l0aF93aGl0ZXNwYWNlcygpCiAgICB7CiAgICAgICAgTG9jYWxpemF0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsKG51bGwsIG51bGwsIG51bGwsICJlbiwgZnIsICBkZSIpOwogICAgICAgIAogICAgICAgIE9iamVjdCBsb2NhbGVOYW1lcyA9IFRlc3RCYXNlLmdldChzZXR0ZXIsICJzdXBwb3J0ZWRMb2NhbGVOYW1lcyIpOwoKICAgICAgICBhc3NlcnRUcnVlKG5ld1NldCgiZW4iLCAiZnIiLCAiZGUiKS5lcXVhbHMobG9jYWxlTmFtZXMpKTsKICAgIH0KCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgZ2V0X2xvY2FsZV9tb2RlbCgpCiAgICB7CiAgICAgICAgTG9jYWxpemF0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsKG51bGwsIG51bGwsIG51bGwsICJlbixmciIpOwoKICAgICAgICBTZWxlY3RNb2RlbCBtb2RlbCA9IHNldHRlci5nZXRTdXBwb3J0ZWRMb2NhbGVzTW9kZWwoKTsKCiAgICAgICAgYXNzZXJ0TnVsbChtb2RlbC5nZXRPcHRpb25Hcm91cHMoKSk7CgogICAgICAgIExpc3Q8T3B0aW9uTW9kZWw+IG9wdGlvbnMgPSBtb2RlbC5nZXRPcHRpb25zKCk7CgogICAgICAgIGFzc2VydEVxdWFscyhvcHRpb25zLnNpemUoKSwgMik7CgogICAgICAgIGFzc2VydEVxdWFscyhvcHRpb25zLmdldCgwKS5nZXRMYWJlbCgpLCAiRW5nbGlzaCIpOwogICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYWxpemVkIHRvIHRoZSB1bmRlcmx5aW5nIGxvY2FsZSwgbm90IHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAgICAvLyBUaGF0J3Mgd2h5IGl0cyAiZnJhbo1haXMiIChpLmUuLCBhcyBhIEZyZW5jaCBzcGVha2VyIHdvdWxkIHNheSBpdCksIG5vdCAiRnJlbmNoIgogICAgICAgIC8vIChsaWtlIGFuIEVuZ2xpc2ggc3BlYWtlcikuCiAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbnMuZ2V0KDEpLmdldExhYmVsKCksICJmcmFuXHUwMGU3YWlzIik7CgogICAgICAgIGFzc2VydEVxdWFscyhvcHRpb25zLmdldCgwKS5nZXRWYWx1ZSgpLCBMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbnMuZ2V0KDEpLmdldFZhbHVlKCksIExvY2FsZS5GUkVOQ0gpOwoKICAgIH0KCiAgICBwcm90ZWN0ZWQgZmluYWwgUGVyc2lzdGVudExvY2FsZSBtb2NrUGVyc2lzdGVudExvY2FsZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ld01vY2soUGVyc2lzdGVudExvY2FsZS5jbGFzcyk7CiAgICB9CgogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIHVua25vd25fbG9jYWxlX3VzZXNfbG9jYWxlX2Zyb21fcmVxdWVzdCgpCiAgICB7CiAgICAgICAgUGVyc2lzdGVudExvY2FsZSBwbCA9IG1vY2tQZXJzaXN0ZW50TG9jYWxlKCk7CiAgICAgICAgVGhyZWFkTG9jYWxlIHRsID0gbW9ja1RocmVhZExvY2FsZSgpOwogICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG1vY2tSZXF1ZXN0KCk7CgogICAgICAgIHRsLnNldExvY2FsZShMb2NhbGUuRlJFTkNIKTsKCiAgICAgICAgdHJhaW5fZ2V0TG9jYWxlKHJlcXVlc3QsIExvY2FsZS5DQU5BREFfRlJFTkNIKTsKCiAgICAgICAgcmVwbGF5KCk7CgogICAgICAgIExvY2FsaXphdGlvblNldHRlckltcGwgc2V0dGVyID0gbmV3IExvY2FsaXphdGlvblNldHRlckltcGwocmVxdWVzdCwgcGwsIHRsLCAiZW4sZnIiKTsKCiAgICAgICAgYXNzZXJ0RmFsc2Uoc2V0dGVyLnNldExvY2FsZUZyb21Mb2NhbGVOYW1lKCJ1bmtub3duIikpOwoKICAgICAgICB2ZXJpZnkoKTsKICAgIH0KCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgdW5zdXBwb3J0ZWRfbG9jYWxlX2luX3JlcXVlc3RfdXNlc19kZWZhdWx0X2xvY2FsZSgpCiAgICB7CiAgICAgICAgUGVyc2lzdGVudExvY2FsZSBwbCA9IG1vY2tQZXJzaXN0ZW50TG9jYWxlKCk7CiAgICAgICAgVGhyZWFkTG9jYWxlIHRsID0gbW9ja1RocmVhZExvY2FsZSgpOwogICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG1vY2tSZXF1ZXN0KCk7CgogICAgICAgIHRsLnNldExvY2FsZShMb2NhbGUuSVRBTElBTik7CgogICAgICAgIHRyYWluX2dldExvY2FsZShyZXF1ZXN0LCBMb2NhbGUuQ0hJTkVTRSk7CgogICAgICAgIHJlcGxheSgpOwoKICAgICAgICBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsIHNldHRlciA9IG5ldyBMb2NhbGl6YXRpb25TZXR0ZXJJbXBsKHJlcXVlc3QsIHBsLCB0bCwgIml0LGVuLGZyIik7CgogICAgICAgIGFzc2VydEZhbHNlKHNldHRlci5zZXRMb2NhbGVGcm9tTG9jYWxlTmFtZSgidW5rbm93biIpKTsKCiAgICAgICAgdmVyaWZ5KCk7CiAgICB9CgogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIHNldF9ub25wZXJzaXN0ZW50X2xvY2FsZSgpCiAgICB7CiAgICAgICAgUGVyc2lzdGVudExvY2FsZSBwbCA9IG1vY2tQZXJzaXN0ZW50TG9jYWxlKCk7CiAgICAgICAgVGhyZWFkTG9jYWxlIHRsID0gbW9ja1RocmVhZExvY2FsZSgpOwogICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG1vY2tSZXF1ZXN0KCk7CgogICAgICAgIHRsLnNldExvY2FsZShMb2NhbGUuRlJFTkNIKTsKCiAgICAgICAgcmVwbGF5KCk7CgogICAgICAgIExvY2FsaXphdGlvblNldHRlckltcGwgc2V0dGVyID0gbmV3IExvY2FsaXphdGlvblNldHRlckltcGwocmVxdWVzdCwgcGwsIHRsLCAiZW4sZnIiKTsKCiAgICAgICAgc2V0dGVyLnNldE5vblBlcmlzdGVudExvY2FsZUZyb21Mb2NhbGVOYW1lKCJmcl9CRSIpOwoKICAgICAgICB2ZXJpZnkoKTsKCiAgICB9CiAgIAogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIGlzX3N1cHBvcnRlZF9sb2NhbGVfbmFtZSgpCiAgICB7CiAgICAgICAgUGVyc2lzdGVudExvY2FsZSBwbCA9IG1vY2tQZXJzaXN0ZW50TG9jYWxlKCk7CiAgICAgICAgVGhyZWFkTG9jYWxlIHRsID0gbW9ja1RocmVhZExvY2FsZSgpOwogICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG1vY2tSZXF1ZXN0KCk7CgoKICAgICAgICByZXBsYXkoKTsKCiAgICAgICAgTG9jYWxpemF0aW9uU2V0dGVySW1wbCBzZXR0ZXIgPSBuZXcgTG9jYWxpemF0aW9uU2V0dGVySW1wbChyZXF1ZXN0LCBwbCwgdGwsICJkZSwgZGVfREUsIGRlX0NILGVuIik7CgogICAgICAgIGFzc2VydFRydWUoc2V0dGVyLmlzU3VwcG9ydGVkTG9jYWxlTmFtZSgiZGUiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShzZXR0ZXIuaXNTdXBwb3J0ZWRMb2NhbGVOYW1lKCJkZV9kZSIpKTsKICAgICAgICBhc3NlcnRUcnVlKHNldHRlci5pc1N1cHBvcnRlZExvY2FsZU5hbWUoImRlX2RlIikpOwogICAgICAgIGFzc2VydFRydWUoc2V0dGVyLmlzU3VwcG9ydGVkTG9jYWxlTmFtZSgiZGVfREUiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShzZXR0ZXIuaXNTdXBwb3J0ZWRMb2NhbGVOYW1lKCJkZV9jaCIpKTsKICAgICAgICBhc3NlcnRUcnVlKHNldHRlci5pc1N1cHBvcnRlZExvY2FsZU5hbWUoImRlX0NIIikpOwogICAgICAgIGFzc2VydFRydWUoc2V0dGVyLmlzU3VwcG9ydGVkTG9jYWxlTmFtZSgiZW4iKSk7CgogICAgICAgIHZlcmlmeSgpOwoKICAgIH0KfQo=