LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5pbWFnaW5nLmZvcm1hdHMuYm1wOwoKcHVibGljIGNsYXNzIEJtcEhlYWRlckluZm8KewogICAgLy8gICAgICAgIJFCTZIgLSBXaW5kb3dzIDMuMXgsIDk1LCBOVCwghQogICAgLy8gICAgICAgIJFCQZIgLSBPUy8yIEJpdG1hcCBBcnJheQogICAgLy8gICAgICAgIJFDSZIgLSBPUy8yIENvbG9yIEljb26RCiAgICAvLyAgICAgICAgQ1CSIC0gT1MvMiBDb2xvciBQb2ludGVyCiAgICAvLyAgICAgICAgkUlDkiAtIE9TLzIgSWNvbgogICAgLy8gICAgICAgIJFQVJIgLSBPUy8yIFBvaW50ZXIKICAgIHB1YmxpYyBmaW5hbCBieXRlIGlkZW50aWZpZXIxOwogICAgcHVibGljIGZpbmFsIGJ5dGUgaWRlbnRpZmllcjI7CgogICAgcHVibGljIGZpbmFsIGludCBmaWxlU2l6ZTsKICAgIHB1YmxpYyBmaW5hbCBpbnQgcmVzZXJ2ZWQ7CiAgICBwdWJsaWMgZmluYWwgaW50IGJpdG1hcERhdGFPZmZzZXQ7CgogICAgcHVibGljIGZpbmFsIGludCBiaXRtYXBIZWFkZXJTaXplOwogICAgcHVibGljIGZpbmFsIGludCB3aWR0aDsKICAgIHB1YmxpYyBmaW5hbCBpbnQgaGVpZ2h0OwogICAgcHVibGljIGZpbmFsIGludCBwbGFuZXM7CiAgICBwdWJsaWMgZmluYWwgaW50IGJpdHNQZXJQaXhlbDsKICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcHJlc3Npb247CiAgICBwdWJsaWMgZmluYWwgaW50IGJpdG1hcERhdGFTaXplOwogICAgcHVibGljIGZpbmFsIGludCBoUmVzb2x1dGlvbjsKICAgIHB1YmxpYyBmaW5hbCBpbnQgdlJlc29sdXRpb247CiAgICBwdWJsaWMgZmluYWwgaW50IGNvbG9yc1VzZWQ7CiAgICBwdWJsaWMgZmluYWwgaW50IGNvbG9yc0ltcG9ydGFudDsKCiAgICBwdWJsaWMgZmluYWwgaW50IHJlZE1hc2s7CiAgICBwdWJsaWMgZmluYWwgaW50IGdyZWVuTWFzazsKICAgIHB1YmxpYyBmaW5hbCBpbnQgYmx1ZU1hc2s7CiAgICBwdWJsaWMgZmluYWwgaW50IGFscGhhTWFzazsKCiAgICBwdWJsaWMgZmluYWwgaW50IGNvbG9yU3BhY2VUeXBlOwogICAgcHVibGljIGZpbmFsIENvbG9yU3BhY2UgY29sb3JTcGFjZTsKICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2FtbWFSZWQ7CiAgICBwdWJsaWMgZmluYWwgaW50IGdhbW1hR3JlZW47CiAgICBwdWJsaWMgZmluYWwgaW50IGdhbW1hQmx1ZTsKICAgIHB1YmxpYyBmaW5hbCBpbnQgaW50ZW50OwogICAgcHVibGljIGZpbmFsIGludCBwcm9maWxlRGF0YTsKICAgIHB1YmxpYyBmaW5hbCBpbnQgcHJvZmlsZVNpemU7CiAgICBwdWJsaWMgZmluYWwgaW50IHJlc2VydmVkVjU7CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xvclNwYWNlQ29vcmRpbmF0ZQogICAgewogICAgICAgIHB1YmxpYyBpbnQgeCwgeSwgejsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbG9yU3BhY2UKICAgIHsKICAgICAgICBwdWJsaWMgQ29sb3JTcGFjZUNvb3JkaW5hdGUgcmVkOwogICAgICAgIHB1YmxpYyBDb2xvclNwYWNlQ29vcmRpbmF0ZSBncmVlbjsKICAgICAgICBwdWJsaWMgQ29sb3JTcGFjZUNvb3JkaW5hdGUgYmx1ZTsKICAgIH0KCiAgICBwdWJsaWMgQm1wSGVhZGVySW5mbyhieXRlIGlkZW50aWZpZXIxLCBieXRlIGlkZW50aWZpZXIyLCBpbnQgZmlsZVNpemUsCiAgICAgICAgICAgIGludCByZXNlcnZlZCwgaW50IGJpdG1hcERhdGFPZmZzZXQsCiAgICAgICAgICAgIGludCBiaXRtYXBIZWFkZXJTaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwbGFuZXMsCiAgICAgICAgICAgIGludCBiaXRzUGVyUGl4ZWwsIGludCBjb21wcmVzc2lvbiwgaW50IGJpdG1hcERhdGFTaXplLAogICAgICAgICAgICBpbnQgaFJlc29sdXRpb24sIGludCB2UmVzb2x1dGlvbiwgaW50IGNvbG9yc1VzZWQsCiAgICAgICAgICAgIGludCBjb2xvcnNJbXBvcnRhbnQsIGludCByZWRNYXNrLCBpbnQgZ3JlZW5NYXNrLAogICAgICAgICAgICBpbnQgYmx1ZU1hc2ssIGludCBhbHBoYU1hc2ssIGludCBjb2xvclNwYWNlVHlwZSwKICAgICAgICAgICAgQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBpbnQgZ2FtbWFSZWQsIGludCBnYW1tYUdyZWVuLAogICAgICAgICAgICBpbnQgZ2FtbWFCbHVlLCBpbnQgaW50ZW50LCBpbnQgcHJvZmlsZURhdGEsCiAgICAgICAgICAgIGludCBwcm9maWxlU2l6ZSwgaW50IHJlc2VydmVkVjUpCiAgICB7CiAgICAgICAgdGhpcy5pZGVudGlmaWVyMSA9IGlkZW50aWZpZXIxOwogICAgICAgIHRoaXMuaWRlbnRpZmllcjIgPSBpZGVudGlmaWVyMjsKICAgICAgICB0aGlzLmZpbGVTaXplID0gZmlsZVNpemU7CiAgICAgICAgdGhpcy5yZXNlcnZlZCA9IHJlc2VydmVkOwogICAgICAgIHRoaXMuYml0bWFwRGF0YU9mZnNldCA9IGJpdG1hcERhdGFPZmZzZXQ7CgogICAgICAgIHRoaXMuYml0bWFwSGVhZGVyU2l6ZSA9IGJpdG1hcEhlYWRlclNpemU7CiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHRoaXMucGxhbmVzID0gcGxhbmVzOwogICAgICAgIHRoaXMuYml0c1BlclBpeGVsID0gYml0c1BlclBpeGVsOwogICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKICAgICAgICB0aGlzLmJpdG1hcERhdGFTaXplID0gYml0bWFwRGF0YVNpemU7CiAgICAgICAgdGhpcy5oUmVzb2x1dGlvbiA9IGhSZXNvbHV0aW9uOwogICAgICAgIHRoaXMudlJlc29sdXRpb24gPSB2UmVzb2x1dGlvbjsKICAgICAgICB0aGlzLmNvbG9yc1VzZWQgPSBjb2xvcnNVc2VkOwogICAgICAgIHRoaXMuY29sb3JzSW1wb3J0YW50ID0gY29sb3JzSW1wb3J0YW50OwoKICAgICAgICB0aGlzLnJlZE1hc2sgPSByZWRNYXNrOwogICAgICAgIHRoaXMuZ3JlZW5NYXNrID0gZ3JlZW5NYXNrOwogICAgICAgIHRoaXMuYmx1ZU1hc2sgPSBibHVlTWFzazsKICAgICAgICB0aGlzLmFscGhhTWFzayA9IGFscGhhTWFzazsKICAgICAgICB0aGlzLmNvbG9yU3BhY2VUeXBlID0gY29sb3JTcGFjZVR5cGU7CiAgICAgICAgdGhpcy5jb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICAgICAgICB0aGlzLmdhbW1hUmVkID0gZ2FtbWFSZWQ7CiAgICAgICAgdGhpcy5nYW1tYUdyZWVuID0gZ2FtbWFHcmVlbjsKICAgICAgICB0aGlzLmdhbW1hQmx1ZSA9IGdhbW1hQmx1ZTsKICAgICAgICB0aGlzLmludGVudCA9IGludGVudDsKICAgICAgICB0aGlzLnByb2ZpbGVEYXRhID0gcHJvZmlsZURhdGE7CiAgICAgICAgdGhpcy5wcm9maWxlU2l6ZSA9IHByb2ZpbGVTaXplOwogICAgICAgIHRoaXMucmVzZXJ2ZWRWNSA9IHJlc2VydmVkVjU7CiAgICB9Cgp9