ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI3YWEwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9jYXJib24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iSlJFX1NSQyIga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY2FyYm9uIj4KLQkgICAgPGF0dHJpYnV0ZXM+Ci0JCQk8YXR0cmlidXRlIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmNhcmJvbiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEwMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2d0aworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJndGsiPgotCSAgICA8YXR0cmlidXRlcz4KLQkJCTxhdHRyaWJ1dGUgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZ3RrL29zL2xpbnV4L3g4NiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfbW90aWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNWZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9IkpSRV9TUkMiIGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vdGlmIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfd2luMzIgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4MTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3aW4zMiI+Ci0JICAgIDxhdHRyaWJ1dGVzPgotCQkJPGF0dHJpYnV0ZSB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC53aW4zMi9vcy93aW4zMi94ODYiIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX0FUVFJfTElCUkFSWV9QQVRIX0VOVFJZIi8+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5zd3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMTEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi0uY2xhc3NwYXRoCi13cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uuc3d0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMzM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOyBzaW5nbGV0b249dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiAkd3MkL29wZW5nbC5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUHJvdmlkZS1QYWNrYWdlOiAKLSAgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYxMmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImFnbF9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiYWdsX3N0YXRzLmgiCi0KLSNkZWZpbmUgQUdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfY2FyYm9uX0FHTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19hZ2xDaG9vc2VQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWFnbENob29zZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsQ3JlYXRlQ29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENyZWF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xDcmVhdGVDb250ZXh0KGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsRGVzY3JpYmVQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsRGVzY3JpYmVQaXhlbEZvcm1hdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXN0cm95Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95UGl4ZWxGb3JtYXQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95UGl4ZWxGb3JtYXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXRfRlVOQyk7Ci0JYWdsRGVzdHJveVBpeGVsRm9ybWF0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbEVuYWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xFbmFibGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xFbmFibGVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pYWdsRW5hYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbEVuYWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJjID0gKGppbnQpYWdsR2V0Q3VycmVudENvbnRleHQoKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldERyYXdhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsR2V0RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xHZXREcmF3YWJsZShhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXREcmF3YWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRDdXJyZW50Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRDdXJyZW50Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXREcmF3YWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWFnbFNldERyYXdhYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbFNldEludGVnZXJfX0lJSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRJbnRlZ2VyKGFyZzAsIGFyZzEsIGFyZzIpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRJbnRlZ2VyX19JSV8zSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSV8zSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGpib29sZWFuKWFnbFNldEludGVnZXIoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzIgJiYgbHBhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTd2FwQnVmZmVycwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci0JYWdsU3dhcEJ1ZmZlcnMoYXJnMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xVcGRhdGVDb250ZXh0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFVwZGF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsVXBkYXRlQ29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xVcGRhdGVDb250ZXh0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFVwZGF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4N2Q0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjAxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJhZ2xfc3RhdHMuaCIKLQotI2lmZGVmIE5BVElWRV9TVEFUUwotCi1pbnQgQUdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAxNDsKLWludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMTRdOwotY2hhciAqIEFHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImFnbENob29zZVBpeGVsRm9ybWF0IiwKLQkiYWdsQ3JlYXRlQ29udGV4dCIsCi0JImFnbERlc2NyaWJlUGl4ZWxGb3JtYXQiLAotCSJhZ2xEZXN0cm95Q29udGV4dCIsCi0JImFnbERlc3Ryb3lQaXhlbEZvcm1hdCIsCi0JImFnbEVuYWJsZSIsCi0JImFnbEdldEN1cnJlbnRDb250ZXh0IiwKLQkiYWdsR2V0RHJhd2FibGUiLAotCSJhZ2xTZXRDdXJyZW50Q29udGV4dCIsCi0JImFnbFNldERyYXdhYmxlIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlJIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlfM0kiLAotCSJhZ2xTd2FwQnVmZmVycyIsCi0JImFnbFVwZGF0ZUNvbnRleHQiLAotfTsKLQotI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEFHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBBR0xfbmF0aXZlRnVuY3Rpb25Db3VudDsKLX0KLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBTVEFUU19OQVRJVkUoQUdMXzFHZXRGdW5jdGlvbk5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShBR0xfMUdldEZ1bmN0aW9uQ2FsbENvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEFHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtpbmRleF07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2xfc3RhdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEFHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgQUdMX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWFnbENob29zZVBpeGVsRm9ybWF0X0ZVTkMsCi0JYWdsQ3JlYXRlQ29udGV4dF9GVU5DLAotCWFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQywKLQlhZ2xEZXN0cm95Q29udGV4dF9GVU5DLAotCWFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DLAotCWFnbEVuYWJsZV9GVU5DLAotCWFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMsCi0JYWdsR2V0RHJhd2FibGVfRlVOQywKLQlhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DLAotCWFnbFNldERyYXdhYmxlX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlJX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlfM0lfRlVOQywKLQlhZ2xTd2FwQnVmZmVyc19GVU5DLAotCWFnbFVwZGF0ZUNvbnRleHRfRlVOQywKLX0gQUdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MzFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvY2FyYm9uL0FHTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzMzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBBR0wgewotCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLS8qIEF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9OT05FID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfU0laRSA9IDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfTEVWRUwgPSAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX1JHQkEgPSA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0RPVUJMRUJVRkZFUiA9IDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFUkVPID0gNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BVVhfQlVGRkVSUyA9IDc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfUkVEX1NJWkUgPSA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0dSRUVOX1NJWkUgPSA5OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0JMVUVfU0laRSA9IDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0FMUEhBX1NJWkUgPSAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9ERVBUSF9TSVpFID0gMTI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFTkNJTF9TSVpFID0gMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fUkVEX1NJWkUgPSAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BQ0NVTV9HUkVFTl9TSVpFID0gMTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQkxVRV9TSVpFID0gMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQUxQSEFfU0laRSA9IDE3OwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFX0JVRkZFUlNfQVJCID0gNTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFU19BUkIgPSA1NjsKLQotLyogSW50ZWdlciBwYXJhbWV0ZXJzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQlVGRkVSX1JFQ1QgPSAyMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1dBUF9JTlRFUlZBTCA9IDIyMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfTkFNRSA9IDIzMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9DTElQX1JFR0lPTiA9IDI1NDsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENob29zZVBpeGVsRm9ybWF0KGludCBnZGV2cywgaW50IG5kZXYsIGludFtdIGF0dHJpYnMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENyZWF0ZUNvbnRleHQoaW50IHBpeCwgaW50IHNoYXJlKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gYWdsRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgcGl4LCBpbnQgYXR0cmliLCBpbnRbXSB2YWx1ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbERlc3Ryb3lDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXQoaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbEVuYWJsZShpbnQgY3R4LCBpbnQgcG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgYWdsR2V0RHJhd2FibGUoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEN1cnJlbnRDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXREcmF3YWJsZShpbnQgY3R4LCBpbnQgZHJhdyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEludGVnZXIoaW50IGN0eCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXRJbnRlZ2VyKGludCBjdHgsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgYWdsU3dhcEJ1ZmZlcnMoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFVwZGF0ZUNvbnRleHQoaW50IGN0eCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmYzc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuY2FyYm9uLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7CQotCWludCBjb250ZXh0OwotCWludCBwaXhlbEZvcm1hdDsKLQlzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSSUJVVEVTID0gMzI7Ci0KLS8qKgotICogQ3JlYXRlIGEgR0xDYW52YXMgd2lkZ2V0IHVzaW5nIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlZCBpbiB0aGUgR0xEYXRhCi0gKiBvYmplY3QgcHJvdmlkZWQuCi0gKgotICogQHBhcmFtIHBhcmVudCBhIGNvbXBvc2l0ZSB3aWRnZXQKLSAqIEBwYXJhbSBzdHlsZSB0aGUgYml0d2lzZSBPUidpbmcgb2Ygd2lkZ2V0IHN0eWxlcwotICogQHBhcmFtIGRhdGEgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIG9mIHRoZSBHTENhbnZhcwotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiB0aGUgZGF0YSBpcyBudWxsCi0gKiAgICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIHdoZW4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBwcm92aWRlZDwvdWw+IAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAqIDx1bD48bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfQ1JFQVRFX09CSkVDVCB3aGVuIGZhaWxlZCB0byBjcmVhdGUgT0xFIE9iamVjdAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfT1BFTl9GSUxFIHdoZW4gZmFpbGVkIHRvIG9wZW4gZmlsZQotICogICAgIDxsaT5FUlJPUl9JTlRFUkZBQ0VfTk9UX0ZPVU5EIHdoZW4gdW5hYmxlIHRvIGNyZWF0ZSBjYWxsYmFja3MgZm9yIE9MRSBJbnRlcmZhY2VzCi0gKiAgICAgPGxpPkVSUk9SX0lOVkFMSURfQ0xBU1NJRAotICogPC91bD4KLSAqLwotcHVibGljIEdMQ2FudmFzIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIEdMRGF0YSBkYXRhKSB7Ci0Jc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWludCBhZ2xBdHRyaWIgW10gPSBuZXcgaW50IFtNQVhfQVRUUklCVVRFU107Ci0JaW50IHBvcyA9IDA7Ci0JYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1JHQkE7Ci0JaWYgKGRhdGEuZG91YmxlQnVmZmVyKSBhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfRE9VQkxFQlVGRkVSOwotCWlmIChkYXRhLnN0ZXJlbykgYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURVJFTzsKLQlpZiAoZGF0YS5yZWRTaXplID4gMCkgewotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfUkVEX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5yZWRTaXplOwotCX0KLQlpZiAoZGF0YS5ncmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZ3JlZW5TaXplOwotCX0KLQlpZiAoZGF0YS5ibHVlU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0JMVUVfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hbHBoYVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BTFBIQV9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5kZXB0aFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9ERVBUSF9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZGVwdGhTaXplOwotCX0KLQlpZiAoZGF0YS5zdGVuY2lsU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURU5DSUxfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnN0ZW5jaWxTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bVJlZFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9SRURfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtUmVkU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1HcmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1HcmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQmx1ZVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUFscGhhU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUFscGhhU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuc2FtcGxlQnVmZmVycyA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NBTVBMRV9CVUZGRVJTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0JfQotCWlmIChkYXRhLnNhbXBsZXMgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9TQU1QTEVTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9OT05FOwotCXBpeGVsRm9ybWF0ID0gQUdMLmFnbENob29zZVBpeGVsRm9ybWF0ICgwLCAwLCBhZ2xBdHRyaWIpOwotLy8JY29udGV4dCA9IEFHTC5hZ2xDcmVhdGVDb250ZXh0IChwaXhlbEZvcm1hdCwgc2hhcmUgPT0gbnVsbCA/IDAgOiBzaGFyZS5jb250ZXh0KTsKLQljb250ZXh0ID0gQUdMLmFnbENyZWF0ZUNvbnRleHQgKHBpeGVsRm9ybWF0LCAwKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlBR0wuYWdsU2V0RHJhd2FibGUgKGNvbnRleHQsIHBvcnQpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQlBR0wuYWdsRGVzdHJveUNvbnRleHQgKGNvbnRleHQpOwotCQkJCUFHTC5hZ2xEZXN0cm95UGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCWNhc2UgU1dULkhpZGU6Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlhZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlNob3csIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgbGlzdGVuZXIpOwotCUNvbnRyb2wgYyA9IHRoaXM7Ci0JZG8gewotCQljLmFkZExpc3RlbmVyKFNXVC5TaG93LCBsaXN0ZW5lcik7Ci0JCWMuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGxpc3RlbmVyKTsKLQkJYyA9IGMuZ2V0UGFyZW50KCk7Ci0JfSB3aGlsZSAoYyAhPSBzaGVsbCk7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgZml4Qm91bmRzICgpIHsKLQlHQ0RhdGEgZGF0YSA9IG5ldyBHQ0RhdGEgKCk7Ci0JaW50IGdjID0gaW50ZXJuYWxfbmV3X0dDIChkYXRhKTsKLQlSZWN0IGJvdW5kcyA9IG5ldyBSZWN0ICgpOwotCU9TLkdldFJlZ2lvbkJvdW5kcyAoZGF0YS52aXNpYmxlUmduLCBib3VuZHMpOwotCWludCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OwotCWludCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKLQlSZWN0IHJlY3QgPSBuZXcgUmVjdCAoKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlPUy5HZXRQb3J0Qm91bmRzIChwb3J0LCByZWN0KTsKLQlpbnQgW10gZ2xib3VuZHMgPSBuZXcgaW50IFs0XTsKLQlnbGJvdW5kc1swXSA9IGJvdW5kcy5sZWZ0OwotCWdsYm91bmRzWzFdID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIGJvdW5kcy50b3AgLSBoZWlnaHQ7Ci0JZ2xib3VuZHNbMl0gPSB3aWR0aDsKLQlnbGJvdW5kc1szXSA9IGhlaWdodDsKLQlBR0wuYWdsU2V0SW50ZWdlciAoY29udGV4dCwgQUdMLkFHTF9CVUZGRVJfUkVDVCwgZ2xib3VuZHMpOwotCUFHTC5hZ2xFbmFibGUgKGNvbnRleHQsIEFHTC5BR0xfQlVGRkVSX1JFQ1QpOwotCUFHTC5hZ2xTZXRJbnRlZ2VyIChjb250ZXh0LCBBR0wuQUdMX0NMSVBfUkVHSU9OLCBkYXRhLnZpc2libGVSZ24pOwotCUFHTC5hZ2xVcGRhdGVDb250ZXh0IChjb250ZXh0KTsKLQlpbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9TQU1QTEVfQlVGRkVSU19BUkIsIHZhbHVlKTsKLQlkYXRhLnNhbXBsZUJ1ZmZlcnMgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NBTVBMRVNfQVJCLCB2YWx1ZSk7Ci0JZGF0YS5zYW1wbGVzID0gdmFsdWUgWzBdOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBPcGVuR0wgY29udGV4dAotICogaXMgdGhlIGN1cnJlbnQgY29udGV4dC4KLSAqICAKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaG9sZHMgdGhlIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQsCi0gKiBmYWxzZSBvdGhlcndpc2UKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNDdXJyZW50ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gQUdMLmFnbEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQ7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKEFHTC5hZ2xHZXRDdXJyZW50Q29udGV4dCAoKSAhPSBjb250ZXh0KSB7Ci0JCUFHTC5hZ2xTZXRDdXJyZW50Q29udGV4dCAoY29udGV4dCk7Ci0JfQotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlBR0wuYWdsU3dhcEJ1ZmZlcnMgKGNvbnRleHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNWU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MjcgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbF9zdGF0cy5oIgotCi0jZGVmaW5lIEdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19nbEFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFjY3VtKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLQlnbEFjY3VtKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQWxwaGFGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFscGhhRnVuYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQWxwaGFGdW5jX0ZVTkMpOwotCWdsQWxwaGFGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBbHBoYUZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEFyZVRleHR1cmVzUmVzaWRlbnQKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbEFyZVRleHR1cmVzUmVzaWRlbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamJvb2xlYW5BcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWpib29sZWFuICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JcmMgPSAoamJvb2xlYW4pZ2xBcmVUZXh0dXJlc1Jlc2lkZW50KGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xBcnJheUVsZW1lbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQXJyYXlFbGVtZW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFycmF5RWxlbWVudF9GVU5DKTsKLQlnbEFycmF5RWxlbWVudChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQXJyYXlFbGVtZW50X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCZWdpbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xCZWdpbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLQlnbEJlZ2luKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQmluZFRleHR1cmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmluZFRleHR1cmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLQlnbEJpbmRUZXh0dXJlKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQml0bWFwCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEJpdG1hcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGpieXRlQXJyYXkgYXJnNikKLXsKLQlqYnl0ZSAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaXRtYXBfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbEJpdG1hcChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCAoY29uc3QgR0x1Ynl0ZSAqKWxwYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQml0bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCbGVuZEZ1bmMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmxlbmRGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQmxlbmRGdW5jX0ZVTkMpOwotCWdsQmxlbmRGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCbGVuZEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENhbGxMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotCWdsQ2FsbExpc3QoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNCCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpieXRlQXJyYXkgYXJnMikKLXsKLQlqYnl0ZSAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNDCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpjaGFyQXJyYXkgYXJnMikKLXsKLQlqY2hhciAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Q2hhckFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNJCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2FsbExpc3RzX19JSV8zSV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0c19fSUlfM0lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotCWdsQ2xlYXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDbGVhckFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyQWNjdW0pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckFjY3VtX0ZVTkMpOwotCWdsQ2xlYXJBY2N1bShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJDb2xvcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckNvbG9yKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJDb2xvcl9GVU5DKTsKLQlnbENsZWFyQ29sb3IoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyQ29sb3JfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyRGVwdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ2xlYXJEZXB0aCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckRlcHRoX0ZVTkMpOwotCWdsQ2xlYXJEZXB0aChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJEZXB0aF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJJbmRleAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckluZGV4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJJbmRleF9GVU5DKTsKLQlnbENsZWFySW5kZXgoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFySW5kZXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyU3RlbmNpbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhclN0ZW5jaWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJTdGVuY2lsX0ZVTkMpOwotCWdsQ2xlYXJTdGVuY2lsKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDbGVhclN0ZW5jaWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsaXBQbGFuZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGlwUGxhbmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xDbGlwUGxhbmUoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNiKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNiX0ZVTkMpOwotCWdsQ29sb3IzYihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzYnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2RfRlVOQyk7Ci0JZ2xDb2xvcjNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM2R2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNmX0ZVTkMpOwotCWdsQ29sb3IzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpX0ZVTkMpOwotCWdsQ29sb3IzaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3Izc19GVU5DKTsKLQlnbENvbG9yM3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3N2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3Izc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3Izc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3ViCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3ViKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLQlnbENvbG9yM3ViKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3VidikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZUFycmF5IGFyZzApCi17Ci0JamJ5dGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWJ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjN1YnYoKGNvbnN0IEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotCWdsQ29sb3IzdWkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotCWdsQ29sb3IzdXMoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3Vzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VzdigoY29uc3QgR0x1c2hvcnQgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Yl9GVU5DKTsKLQlnbENvbG9yNGIoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0YnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGRfRlVOQyk7Ci0JZ2xDb2xvcjRkKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Zl9GVU5DKTsKLQlnbENvbG9yNGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpX0ZVTkMpOwotCWdsQ29sb3I0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHNfRlVOQyk7Ci0JZ2xDb2xvcjRzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1YgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci0JZ2xDb2xvcjR1YihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVidgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVidl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCWdsQ29sb3I0dWJ2KChjb25zdCBHTHVieXRlICopbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1YnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotCWdsQ29sb3I0dWkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNHVpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMiwganNob3J0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLQlnbENvbG9yNHVzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjR1c3YoKGNvbnN0IEdMdXNob3J0ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvck1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3JNYXNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpib29sZWFuIGFyZzAsIGpib29sZWFuIGFyZzEsIGpib29sZWFuIGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvck1hc2tfRlVOQyk7Ci0JZ2xDb2xvck1hc2soYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3JNYXRlcmlhbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvck1hdGVyaWFsKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3JNYXRlcmlhbF9GVU5DKTsKLQlnbENvbG9yTWF0ZXJpYWwoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWF0ZXJpYWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvclBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsQ29sb3JQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvcHlQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVBpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlQaXhlbHNfRlVOQyk7Ci0JZ2xDb3B5UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4SW1hZ2UxRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleEltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleFN1YkltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4U3ViSW1hZ2UyRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDdWxsRmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDdWxsRmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLQlnbEN1bGxGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlTGlzdHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLQlnbERlbGV0ZUxpc3RzKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlVGV4dHVyZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlbGV0ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbERlbGV0ZVRleHR1cmVzKGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVsZXRlVGV4dHVyZXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoRnVuYwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aEZ1bmMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRGVwdGhGdW5jX0ZVTkMpOwotCWdsRGVwdGhGdW5jKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZXB0aEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoTWFzawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW4gYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlcHRoTWFza19GVU5DKTsKLQlnbERlcHRoTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhNYXNrX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEZXB0aFJhbmdlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERlcHRoUmFuZ2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZXB0aFJhbmdlX0ZVTkMpOwotCWdsRGVwdGhSYW5nZShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhSYW5nZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGlzYWJsZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEaXNhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVfRlVOQyk7Ci0JZ2xEaXNhYmxlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEaXNhYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEaXNhYmxlQ2xpZW50U3RhdGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGlzYWJsZUNsaWVudFN0YXRlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbERpc2FibGVDbGllbnRTdGF0ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGlzYWJsZUNsaWVudFN0YXRlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QXJyYXlzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdBcnJheXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERyYXdBcnJheXNfRlVOQyk7Ci0JZ2xEcmF3QXJyYXlzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3QXJyYXlzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdCdWZmZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd0J1ZmZlcl9GVU5DKTsKLQlnbERyYXdCdWZmZXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbERyYXdCdWZmZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdFbGVtZW50cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEcmF3RWxlbWVudHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsRHJhd0VsZW1lbnRzKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRHJhd1BpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd1BpeGVsc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2xEcmF3UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFZGdlRmxhZwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYm9vbGVhbiBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci0JZ2xFZGdlRmxhZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFnUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ1BvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqYm9vbGVhbkFycmF5IGFyZzEpCi17Ci0JamJvb2xlYW4gKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdQb2ludGVyX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xFZGdlRmxhZ1BvaW50ZXIoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFZGdlRmxhZ1BvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFndgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW5BcnJheSBhcmcwKQotewotCWpib29sZWFuICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVkZ2VGbGFndl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsRWRnZUZsYWd2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWd2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRW5hYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVuYWJsZV9GVU5DKTsKLQlnbEVuYWJsZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRW5hYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGVDbGllbnRTdGF0ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmFibGVDbGllbnRTdGF0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbEVuYWJsZUNsaWVudFN0YXRlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEVuZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRW5kX0ZVTkMpOwotCWdsRW5kKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEVuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kTGlzdAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmRMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotCWdsRW5kTGlzdCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQxZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLQlnbEV2YWxDb29yZDFkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLQlnbEV2YWxDb29yZDFmKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMWZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotCWdsRXZhbENvb3JkMmQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMmR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEV2YWxDb29yZDJkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLQlnbEV2YWxDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQyZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsTWVzaDEKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbE1lc2gxKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsTWVzaDFfRlVOQyk7Ci0JZ2xFdmFsTWVzaDEoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxNZXNoMV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbE1lc2gyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxNZXNoMikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxNZXNoMl9GVU5DKTsKLQlnbEV2YWxNZXNoMihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbE1lc2gyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsUG9pbnQxCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxQb2ludDEpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbFBvaW50MV9GVU5DKTsKLQlnbEV2YWxQb2ludDEoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxQb2ludDFfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEV2YWxQb2ludDIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbFBvaW50MikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxQb2ludDJfRlVOQyk7Ci0JZ2xFdmFsUG9pbnQyKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsUG9pbnQyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xGZWVkYmFja0J1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGZWVkYmFja0J1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmVlZGJhY2tCdWZmZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xGZWVkYmFja0J1ZmZlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGZWVkYmFja0J1ZmZlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmluaXNoCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZpbmlzaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmluaXNoX0ZVTkMpOwotCWdsRmluaXNoKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZpbmlzaF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmx1c2gKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRmx1c2gpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEZsdXNoX0ZVTkMpOwotCWdsRmx1c2goKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRmx1c2hfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRm9nZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZl9GVU5DKTsKLQlnbEZvZ2YoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGb2dmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRm9naQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGb2dpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9naV9GVU5DKTsKLQlnbEZvZ2koYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xGb2dpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dpdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRm9naXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZyb250RmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGcm9udEZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJvbnRGYWNlX0ZVTkMpOwotCWdsRnJvbnRGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGcm9udEZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZydXN0dW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRnJ1c3R1bSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGpkb3VibGUgYXJnNCwgamRvdWJsZSBhcmc1KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJ1c3R1bV9GVU5DKTsKLQlnbEZydXN0dW0oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZydXN0dW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlbkxpc3RzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMX05BVElWRShnbEdlbkxpc3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2VuTGlzdHNfRlVOQyk7Ci0JcmMgPSAoamludClnbEdlbkxpc3RzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZW5MaXN0c19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlblRleHR1cmVzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdlblRleHR1cmVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZW5UZXh0dXJlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZW5UZXh0dXJlcyhhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdlblRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRCb29sZWFudgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRCb29sZWFudikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpib29sZWFuQXJyYXkgYXJnMSkKLXsKLQlqYm9vbGVhbiAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0Qm9vbGVhbnYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0Q2xpcFBsYW5lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldENsaXBQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxKQotewotCWpkb3VibGUgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldENsaXBQbGFuZShhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXREb3VibGV2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldERvdWJsZXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldERvdWJsZXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0RG91YmxldihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0RG91Ymxldl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RXJyb3IKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0RXJyb3IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0RXJyb3JfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldEVycm9yKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldEVycm9yX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RmxvYXR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEZsb2F0dikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldEZsb2F0dl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldEZsb2F0dihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRGbG9hdHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldEludGVnZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEludGVnZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRJbnRlZ2Vydl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRJbnRlZ2VydihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0SW50ZWdlcnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldExpZ2h0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TGlnaHRmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldExpZ2h0ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXBmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXBmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRNYXBmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldE1hdGVyaWFsaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWF0ZXJpYWxpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRNYXRlcmlhbGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldE1hdGVyaWFsaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UGl4ZWxNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcGZ2KGFyZzAsIGxwYXJnMSk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQaXhlbE1hcHVpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcHVpdihhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdWl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRQaXhlbE1hcHVzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRQaXhlbE1hcHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpzaG9ydEFycmF5IGFyZzEpCi17Ci0JanNob3J0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0UGl4ZWxNYXB1c3YoYXJnMCwgKEdMdXNob3J0ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UGl4ZWxNYXB1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBvaW50ZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBvaW50ZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JZ2xHZXRQb2ludGVydihhcmcwLCAoR0x2b2lkICoqKWxwYXJnMSk7Ci0JaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0UG9seWdvblN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UG9seWdvblN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQb2x5Z29uU3RpcHBsZSgoR0x1Ynl0ZSAqKWxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UG9seWdvblN0aXBwbGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldFN0cmluZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhHZW5mdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhHZW5mdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhHZW5mdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhHZW5mdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhJbWFnZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhJbWFnZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4SW1hZ2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4SW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgbHBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEltYWdlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleExldmVsUGFyYW1ldGVyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamZsb2F0QXJyYXkgYXJnMykKLXsKLQlqZmxvYXQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCX0KLQlnbEdldFRleExldmVsUGFyYW1ldGVyZnYoYXJnMCwgYXJnMSwgYXJnMiwgbHBhcmczKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnRBcnJheSBhcmczKQotewotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xIaW50Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEhpbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xIaW50X0ZVTkMpOwotCWdsSGludChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSGludF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhNYXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4TWFzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleE1hc2tfRlVOQyk7Ci0JZ2xJbmRleE1hc2soYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4TWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhQb2ludGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsSW5kZXhQb2ludGVyKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhkX0ZVTkMpOwotCWdsSW5kZXhkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4Zl9GVU5DKTsKLQlnbEluZGV4ZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEluZGV4ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleGlfRlVOQyk7Ci0JZ2xJbmRleGkoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xJbmRleGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhzX0ZVTkMpOwotCWdsSW5kZXhzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbml0TmFtZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5pdE5hbWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbml0TmFtZXNfRlVOQyk7Ci0JZ2xJbml0TmFtZXMoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5pdE5hbWVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbnRlcmxlYXZlZEFycmF5cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbnRlcmxlYXZlZEFycmF5cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbnRlcmxlYXZlZEFycmF5c19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xJbnRlcmxlYXZlZEFycmF5cyhhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW50ZXJsZWF2ZWRBcnJheXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbElzRW5hYmxlZAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xfTkFUSVZFKGdsSXNFbmFibGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbElzRW5hYmxlZF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbElzRW5hYmxlZChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSXNFbmFibGVkX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSXNMaXN0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJc0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSXNMaXN0X0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWdsSXNMaXN0KGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJc0xpc3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJc1RleHR1cmUKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbElzVGV4dHVyZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJc1RleHR1cmVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xJc1RleHR1cmUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbElzVGV4dHVyZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLQlnbExpZ2h0TW9kZWxmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRNb2RlbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbExpZ2h0TW9kZWxmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci0JZ2xMaWdodE1vZGVsaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodE1vZGVsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xMaWdodE1vZGVsaXYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZfRlVOQyk7Ci0JZ2xMaWdodGYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaWdodGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGlnaHRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGlfRlVOQyk7Ci0JZ2xMaWdodGkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGluZVN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotCWdsTGluZVN0aXBwbGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaW5lV2lkdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVdpZHRoKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGluZVdpZHRoX0ZVTkMpOwotCWdsTGluZVdpZHRoKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaW5lV2lkdGhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpc3RCYXNlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpc3RCYXNlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotCWdsTGlzdEJhc2UoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkSWRlbnRpdHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZElkZW50aXR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2FkSWRlbnRpdHlfRlVOQyk7Ci0JZ2xMb2FkSWRlbnRpdHkoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZElkZW50aXR5X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkTWF0cml4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMb2FkTWF0cml4ZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExvYWRNYXRyaXhkX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbExvYWRNYXRyaXhkKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4ZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE1hdHJpeGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE1hdHJpeGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE1hdHJpeGZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xMb2FkTWF0cml4ZihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE5hbWUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci0JZ2xMb2FkTmFtZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExvZ2ljT3AKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9naWNPcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2dpY09wX0ZVTkMpOwotCWdsTG9naWNPcChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9naWNPcF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTWFwMWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpkb3VibGVBcnJheSBhcmc1KQotewotCWpkb3VibGUgKmxwYXJnNT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMWRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNSkgbHBhcmc1ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAxZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAxZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdEFycmF5IGFyZzUpCi17Ci0JamZsb2F0ICpscGFyZzU9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDFmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBscGFyZzUsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hcDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpkb3VibGVBcnJheSBhcmc5KQotewotCWpkb3VibGUgKmxwYXJnOT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMmRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOSkgbHBhcmc5ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgbHBhcmc5LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdCBhcmc1LCBqZmxvYXQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpmbG9hdEFycmF5IGFyZzkpCi17Ci0JamZsb2F0ICpscGFyZzk9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDJmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc5KSBscGFyZzkgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc5LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc5LCBscGFyZzksIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQxZF9GVU5DKTsKLQlnbE1hcEdyaWQxZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDFmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwR3JpZDFmX0ZVTkMpOwotCWdsTWFwR3JpZDFmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXBHcmlkMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZF9GVU5DKTsKLQlnbE1hcEdyaWQyZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZl9GVU5DKTsKLQlnbE1hcEdyaWQyZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWF0ZXJpYWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZl9GVU5DKTsKLQlnbE1hdGVyaWFsZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hdGVyaWFsaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXRlcmlhbGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsaV9GVU5DKTsKLQlnbE1hdGVyaWFsaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGl2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXRlcmlhbGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRyaXhNb2RlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdHJpeE1vZGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0cml4TW9kZV9GVU5DKTsKLQlnbE1hdHJpeE1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdHJpeE1vZGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE11bHRNYXRyaXhkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE11bHRNYXRyaXhkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTXVsdE1hdHJpeGRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTXVsdE1hdHJpeGQobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNdWx0TWF0cml4ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNdWx0TWF0cml4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xNdWx0TWF0cml4Zl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE11bHRNYXRyaXhmKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOZXdMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE5ld0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOZXdMaXN0X0ZVTkMpOwotCWdsTmV3TGlzdChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTmV3TGlzdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGUgYXJnMCwgamJ5dGUgYXJnMSwgamJ5dGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotCWdsTm9ybWFsM2IoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2J2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOb3JtYWwzYnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotCWdsTm9ybWFsM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci0JZ2xOb3JtYWwzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotCWdsTm9ybWFsM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci0JZ2xOb3JtYWwzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWxQb2ludGVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsUG9pbnRlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsUG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsT3J0aG8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsT3J0aG8pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotCWdsT3J0aG8oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQYXNzVGhyb3VnaAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQYXNzVGhyb3VnaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotCWdsUGFzc1Rocm91Z2goYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbE1hcGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xQaXhlbE1hcGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdWl2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVpbnQgKilscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxNYXB1aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqc2hvcnRBcnJheSBhcmcyKQotewotCWpzaG9ydCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbE1hcHVzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdXN2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVzaG9ydCAqKWxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwdXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbFN0b3JlZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQaXhlbFN0b3JlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsU3RvcmVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsU3RvcmVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsVHJhbnNmZXJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsVHJhbnNmZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxUcmFuc2ZlcmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUGl4ZWxUcmFuc2ZlcmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxab29tCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsWm9vbSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFpvb21fRlVOQyk7Ci0JZ2xQaXhlbFpvb20oYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsWm9vbV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUG9pbnRTaXplCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvaW50U2l6ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvaW50U2l6ZV9GVU5DKTsKLQlnbFBvaW50U2l6ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9pbnRTaXplX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uTW9kZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQb2x5Z29uTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotCWdsUG9seWdvbk1vZGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uT2Zmc2V0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25PZmZzZXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUG9seWdvbk9mZnNldF9GVU5DKTsKLQlnbFBvbHlnb25PZmZzZXQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25PZmZzZXRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBvbHlnb25TdGlwcGxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25TdGlwcGxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb2x5Z29uU3RpcHBsZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUG9seWdvblN0aXBwbGUoKEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQ2xpZW50QXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BDbGllbnRBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BDbGllbnRBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQ2xpZW50QXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BNYXRyaXgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BNYXRyaXhfRlVOQyk7Ci0JZ2xQb3BNYXRyaXgoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BOYW1lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvcE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci0JZ2xQb3BOYW1lKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFByaW9yaXRpemVUZXh0dXJlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQcmlvcml0aXplVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFByaW9yaXRpemVUZXh0dXJlcyhhcmcwLCAoY29uc3QgR0x1aW50ICopbHBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoQXR0cmliCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFB1c2hBdHRyaWIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHVzaEF0dHJpYl9GVU5DKTsKLQlnbFB1c2hBdHRyaWIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFB1c2hBdHRyaWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFB1c2hDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUHVzaENsaWVudEF0dHJpYikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoQ2xpZW50QXR0cmliX0ZVTkMpOwotCWdsUHVzaENsaWVudEF0dHJpYihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHVzaENsaWVudEF0dHJpYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUHVzaE1hdHJpeAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotCWdsUHVzaE1hdHJpeCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoTmFtZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLQlnbFB1c2hOYW1lKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLQlnbFJhc3RlclBvczJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MyZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLQlnbFJhc3RlclBvczJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Myc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMnN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Mzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNHN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmVhZEJ1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWFkQnVmZmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlYWRCdWZmZXJfRlVOQyk7Ci0JZ2xSZWFkQnVmZmVyKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWFkQnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWFkUGl4ZWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlYWRQaXhlbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWFkUGl4ZWxzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFJlYWRQaXhlbHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlYWRQaXhlbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotCWdsUmVjdGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGR2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci0JZ2xSZWN0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCWpmbG9hdCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0ZnYobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotCWdsUmVjdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGl2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci0JZ2xSZWN0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCwganNob3J0QXJyYXkgYXJnMSkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCWpzaG9ydCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0c3YobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlbmRlck1vZGUKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVuZGVyTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamludCByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFJlbmRlck1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSb3RhdGVkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJvdGF0ZWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUm90YXRlZF9GVU5DKTsKLQlnbFJvdGF0ZWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJvdGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJvdGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUm90YXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJvdGF0ZWZfRlVOQyk7Ci0JZ2xSb3RhdGVmKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSb3RhdGVmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTY2FsZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2NhbGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2FsZWRfRlVOQyk7Ci0JZ2xTY2FsZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNjYWxlZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2NhbGVmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNjYWxlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2NhbGVmX0ZVTkMpOwotCWdsU2NhbGVmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTY2FsZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFNjaXNzb3IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2Npc3NvcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2lzc29yX0ZVTkMpOwotCWdsU2Npc3NvcihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2Npc3Nvcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2VsZWN0QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNlbGVjdEJ1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFNlbGVjdEJ1ZmZlcl9GVU5DKTsKLQlnbFNlbGVjdEJ1ZmZlcihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2VsZWN0QnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTaGFkZU1vZGVsCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNoYWRlTW9kZWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2hhZGVNb2RlbF9GVU5DKTsKLQlnbFNoYWRlTW9kZWwoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNoYWRlTW9kZWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFN0ZW5jaWxGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLQlnbFN0ZW5jaWxGdW5jKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU3RlbmNpbE1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU3RlbmNpbE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci0JZ2xTdGVuY2lsTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxPcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xTdGVuY2lsT3ApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFN0ZW5jaWxPcF9GVU5DKTsKLQlnbFN0ZW5jaWxPcChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE9wX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZF9GVU5DKTsKLQlnbFRleENvb3JkMWQoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmX0ZVTkMpOwotCWdsVGV4Q29vcmQxZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQxZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDFmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWlfRlVOQyk7Ci0JZ2xUZXhDb29yZDFpKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMWl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc19GVU5DKTsKLQlnbFRleENvb3JkMXMoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmRfRlVOQyk7Ci0JZ2xUZXhDb29yZDJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmZfRlVOQyk7Ci0JZ2xUZXhDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpX0ZVTkMpOwotCWdsVGV4Q29vcmQyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQycykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzX0ZVTkMpOwotCWdsVGV4Q29vcmQycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkX0ZVTkMpOwotCWdsVGV4Q29vcmQzZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZl9GVU5DKTsKLQlnbFRleENvb3JkM2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzaSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaV9GVU5DKTsKLQlnbFRleENvb3JkM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM3NfRlVOQyk7Ci0JZ2xUZXhDb29yZDNzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM3N2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZF9GVU5DKTsKLQlnbFRleENvb3JkNGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNGR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0ZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmX0ZVTkMpOwotCWdsVGV4Q29vcmQ0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQ0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0aQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGlfRlVOQyk7Ci0JZ2xUZXhDb29yZDRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c19GVU5DKTsKLQlnbFRleENvb3JkNHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNHN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0c3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZFBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmRQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhFbnZmX0ZVTkMpOwotCWdsVGV4RW52ZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4RW52aV9GVU5DKTsKLQlnbFRleEVudmkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEVudmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5kKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5kX0ZVTkMpOwotCWdsVGV4R2VuZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5mCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZl9GVU5DKTsKLQlnbFRleEdlbmYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEdlbmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5mdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEdlbmZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEdlbmlfRlVOQyk7Ci0JZ2xUZXhHZW5pKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhHZW5pX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5pdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5pdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhHZW5pdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnRBcnJheSBhcmc3KQotewotCWppbnQgKmxwYXJnNz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4SW1hZ2UxRF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGxwYXJnNyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhJbWFnZTJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcsIGpieXRlQXJyYXkgYXJnOCkKLXsKLQlqYnl0ZSAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGxwYXJnOCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzgpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcmZfRlVOQyk7Ci0JZ2xUZXhQYXJhbWV0ZXJmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJpX0ZVTkMpOwotCWdsVGV4UGFyYW1ldGVyaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhTdWJJbWFnZTFECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTFEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMURfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleFN1YkltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludEFycmF5IGFyZzgpCi17Ci0JamludCAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMkRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZF9GVU5DKTsKLQlnbFRyYW5zbGF0ZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZl9GVU5DKTsKLQlnbFRyYW5zbGF0ZWYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci0JZ2xWZXJ0ZXgyZChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4MmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotCWdsVmVydGV4MmYoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci0JZ2xWZXJ0ZXgyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4Mml2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotCWdsVmVydGV4MnMoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MnN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLQlnbFZlcnRleDNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2R2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JZ2xWZXJ0ZXgzZHYobHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotCWdsVmVydGV4M2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLQlnbFZlcnRleDNpKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xWZXJ0ZXgzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotCWdsVmVydGV4M3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotCWdsVmVydGV4NGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotCWdsVmVydGV4NGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotCWdsVmVydGV4NGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotCWdsVmVydGV4NHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleFBvaW50ZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVmVydGV4UG9pbnRlcihhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgbHBhcmczLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4UG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmlld3BvcnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmlld3BvcnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci0JZ2xWaWV3cG9ydChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmMGExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZmRlZiBfX0FQUExFX18KLSNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KLSNlbHNlCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxHTC9nbC5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2VmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAzMzU7Ci1pbnQgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMzM1XTsKLWNoYXIgKiBHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImdsQWNjdW0iLCAKLQkiZ2xBbHBoYUZ1bmMiLCAKLQkiZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IiwgCi0JImdsQXJyYXlFbGVtZW50IiwgCi0JImdsQmVnaW4iLCAKLQkiZ2xCaW5kVGV4dHVyZSIsIAotCSJnbEJpdG1hcCIsIAotCSJnbEJsZW5kRnVuYyIsIAotCSJnbENhbGxMaXN0IiwgCi0JImdsQ2FsbExpc3RzX19JSV8zQiIsIAotCSJnbENhbGxMaXN0c19fSUlfM0MiLCAKLQkiZ2xDYWxsTGlzdHNfX0lJXzNJIiwgCi0JImdsQ2xlYXIiLCAKLQkiZ2xDbGVhckFjY3VtIiwgCi0JImdsQ2xlYXJDb2xvciIsIAotCSJnbENsZWFyRGVwdGgiLCAKLQkiZ2xDbGVhckluZGV4IiwgCi0JImdsQ2xlYXJTdGVuY2lsIiwgCi0JImdsQ2xpcFBsYW5lIiwgCi0JImdsQ29sb3IzYiIsIAotCSJnbENvbG9yM2J2IiwgCi0JImdsQ29sb3IzZCIsIAotCSJnbENvbG9yM2R2IiwgCi0JImdsQ29sb3IzZiIsIAotCSJnbENvbG9yM2Z2IiwgCi0JImdsQ29sb3IzaSIsIAotCSJnbENvbG9yM2l2IiwgCi0JImdsQ29sb3IzcyIsIAotCSJnbENvbG9yM3N2IiwgCi0JImdsQ29sb3IzdWIiLCAKLQkiZ2xDb2xvcjN1YnYiLCAKLQkiZ2xDb2xvcjN1aSIsIAotCSJnbENvbG9yM3VpdiIsIAotCSJnbENvbG9yM3VzIiwgCi0JImdsQ29sb3IzdXN2IiwgCi0JImdsQ29sb3I0YiIsIAotCSJnbENvbG9yNGJ2IiwgCi0JImdsQ29sb3I0ZCIsIAotCSJnbENvbG9yNGR2IiwgCi0JImdsQ29sb3I0ZiIsIAotCSJnbENvbG9yNGZ2IiwgCi0JImdsQ29sb3I0aSIsIAotCSJnbENvbG9yNGl2IiwgCi0JImdsQ29sb3I0cyIsIAotCSJnbENvbG9yNHViIiwgCi0JImdsQ29sb3I0dWJ2IiwgCi0JImdsQ29sb3I0dWkiLCAKLQkiZ2xDb2xvcjR1aXYiLCAKLQkiZ2xDb2xvcjR1cyIsIAotCSJnbENvbG9yNHVzdiIsIAotCSJnbENvbG9yTWFzayIsIAotCSJnbENvbG9yTWF0ZXJpYWwiLCAKLQkiZ2xDb2xvclBvaW50ZXIiLCAKLQkiZ2xDb3B5UGl4ZWxzIiwgCi0JImdsQ29weVRleEltYWdlMUQiLCAKLQkiZ2xDb3B5VGV4SW1hZ2UyRCIsIAotCSJnbENvcHlUZXhTdWJJbWFnZTFEIiwgCi0JImdsQ29weVRleFN1YkltYWdlMkQiLCAKLQkiZ2xDdWxsRmFjZSIsIAotCSJnbERlbGV0ZUxpc3RzIiwgCi0JImdsRGVsZXRlVGV4dHVyZXMiLCAKLQkiZ2xEZXB0aEZ1bmMiLCAKLQkiZ2xEZXB0aE1hc2siLCAKLQkiZ2xEZXB0aFJhbmdlIiwgCi0JImdsRGlzYWJsZSIsIAotCSJnbERpc2FibGVDbGllbnRTdGF0ZSIsIAotCSJnbERyYXdBcnJheXMiLCAKLQkiZ2xEcmF3QnVmZmVyIiwgCi0JImdsRHJhd0VsZW1lbnRzIiwgCi0JImdsRHJhd1BpeGVscyIsIAotCSJnbEVkZ2VGbGFnIiwgCi0JImdsRWRnZUZsYWdQb2ludGVyIiwgCi0JImdsRWRnZUZsYWd2IiwgCi0JImdsRW5hYmxlIiwgCi0JImdsRW5hYmxlQ2xpZW50U3RhdGUiLCAKLQkiZ2xFbmQiLCAKLQkiZ2xFbmRMaXN0IiwgCi0JImdsRXZhbENvb3JkMWQiLCAKLQkiZ2xFdmFsQ29vcmQxZHYiLCAKLQkiZ2xFdmFsQ29vcmQxZiIsIAotCSJnbEV2YWxDb29yZDFmdiIsIAotCSJnbEV2YWxDb29yZDJkIiwgCi0JImdsRXZhbENvb3JkMmR2IiwgCi0JImdsRXZhbENvb3JkMmYiLCAKLQkiZ2xFdmFsQ29vcmQyZnYiLCAKLQkiZ2xFdmFsTWVzaDEiLCAKLQkiZ2xFdmFsTWVzaDIiLCAKLQkiZ2xFdmFsUG9pbnQxIiwgCi0JImdsRXZhbFBvaW50MiIsIAotCSJnbEZlZWRiYWNrQnVmZmVyIiwgCi0JImdsRmluaXNoIiwgCi0JImdsRmx1c2giLCAKLQkiZ2xGb2dmIiwgCi0JImdsRm9nZnYiLCAKLQkiZ2xGb2dpIiwgCi0JImdsRm9naXYiLCAKLQkiZ2xGcm9udEZhY2UiLCAKLQkiZ2xGcnVzdHVtIiwgCi0JImdsR2VuTGlzdHMiLCAKLQkiZ2xHZW5UZXh0dXJlcyIsIAotCSJnbEdldEJvb2xlYW52IiwgCi0JImdsR2V0Q2xpcFBsYW5lIiwgCi0JImdsR2V0RG91YmxldiIsIAotCSJnbEdldEVycm9yIiwgCi0JImdsR2V0RmxvYXR2IiwgCi0JImdsR2V0SW50ZWdlcnYiLCAKLQkiZ2xHZXRMaWdodGZ2IiwgCi0JImdsR2V0TGlnaHRpdiIsIAotCSJnbEdldE1hcGR2IiwgCi0JImdsR2V0TWFwZnYiLCAKLQkiZ2xHZXRNYXBpdiIsIAotCSJnbEdldE1hdGVyaWFsZnYiLCAKLQkiZ2xHZXRNYXRlcmlhbGl2IiwgCi0JImdsR2V0UGl4ZWxNYXBmdiIsIAotCSJnbEdldFBpeGVsTWFwdWl2IiwgCi0JImdsR2V0UGl4ZWxNYXB1c3YiLCAKLQkiZ2xHZXRQb2ludGVydiIsIAotCSJnbEdldFBvbHlnb25TdGlwcGxlIiwgCi0JImdsR2V0U3RyaW5nIiwgCi0JImdsR2V0VGV4RW52ZnYiLCAKLQkiZ2xHZXRUZXhFbnZpdiIsIAotCSJnbEdldFRleEdlbmR2IiwgCi0JImdsR2V0VGV4R2VuZnYiLCAKLQkiZ2xHZXRUZXhHZW5pdiIsIAotCSJnbEdldFRleEltYWdlIiwgCi0JImdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleExldmVsUGFyYW1ldGVyaXYiLCAKLQkiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleFBhcmFtZXRlcml2IiwgCi0JImdsSGludCIsIAotCSJnbEluZGV4TWFzayIsIAotCSJnbEluZGV4UG9pbnRlciIsIAotCSJnbEluZGV4ZCIsIAotCSJnbEluZGV4ZHYiLCAKLQkiZ2xJbmRleGYiLCAKLQkiZ2xJbmRleGZ2IiwgCi0JImdsSW5kZXhpIiwgCi0JImdsSW5kZXhpdiIsIAotCSJnbEluZGV4cyIsIAotCSJnbEluZGV4c3YiLCAKLQkiZ2xJbml0TmFtZXMiLCAKLQkiZ2xJbnRlcmxlYXZlZEFycmF5cyIsIAotCSJnbElzRW5hYmxlZCIsIAotCSJnbElzTGlzdCIsIAotCSJnbElzVGV4dHVyZSIsIAotCSJnbExpZ2h0TW9kZWxmIiwgCi0JImdsTGlnaHRNb2RlbGZ2IiwgCi0JImdsTGlnaHRNb2RlbGkiLCAKLQkiZ2xMaWdodE1vZGVsaXYiLCAKLQkiZ2xMaWdodGYiLCAKLQkiZ2xMaWdodGZ2IiwgCi0JImdsTGlnaHRpIiwgCi0JImdsTGlnaHRpdiIsIAotCSJnbExpbmVTdGlwcGxlIiwgCi0JImdsTGluZVdpZHRoIiwgCi0JImdsTGlzdEJhc2UiLCAKLQkiZ2xMb2FkSWRlbnRpdHkiLCAKLQkiZ2xMb2FkTWF0cml4ZCIsIAotCSJnbExvYWRNYXRyaXhmIiwgCi0JImdsTG9hZE5hbWUiLCAKLQkiZ2xMb2dpY09wIiwgCi0JImdsTWFwMWQiLCAKLQkiZ2xNYXAxZiIsIAotCSJnbE1hcDJkIiwgCi0JImdsTWFwMmYiLCAKLQkiZ2xNYXBHcmlkMWQiLCAKLQkiZ2xNYXBHcmlkMWYiLCAKLQkiZ2xNYXBHcmlkMmQiLCAKLQkiZ2xNYXBHcmlkMmYiLCAKLQkiZ2xNYXRlcmlhbGYiLCAKLQkiZ2xNYXRlcmlhbGZ2IiwgCi0JImdsTWF0ZXJpYWxpIiwgCi0JImdsTWF0ZXJpYWxpdiIsIAotCSJnbE1hdHJpeE1vZGUiLCAKLQkiZ2xNdWx0TWF0cml4ZCIsIAotCSJnbE11bHRNYXRyaXhmIiwgCi0JImdsTmV3TGlzdCIsIAotCSJnbE5vcm1hbDNiIiwgCi0JImdsTm9ybWFsM2J2IiwgCi0JImdsTm9ybWFsM2QiLCAKLQkiZ2xOb3JtYWwzZHYiLCAKLQkiZ2xOb3JtYWwzZiIsIAotCSJnbE5vcm1hbDNmdiIsIAotCSJnbE5vcm1hbDNpIiwgCi0JImdsTm9ybWFsM2l2IiwgCi0JImdsTm9ybWFsM3MiLCAKLQkiZ2xOb3JtYWwzc3YiLCAKLQkiZ2xOb3JtYWxQb2ludGVyIiwgCi0JImdsT3J0aG8iLCAKLQkiZ2xQYXNzVGhyb3VnaCIsIAotCSJnbFBpeGVsTWFwZnYiLCAKLQkiZ2xQaXhlbE1hcHVpdiIsIAotCSJnbFBpeGVsTWFwdXN2IiwgCi0JImdsUGl4ZWxTdG9yZWYiLCAKLQkiZ2xQaXhlbFN0b3JlaSIsIAotCSJnbFBpeGVsVHJhbnNmZXJmIiwgCi0JImdsUGl4ZWxUcmFuc2ZlcmkiLCAKLQkiZ2xQaXhlbFpvb20iLCAKLQkiZ2xQb2ludFNpemUiLCAKLQkiZ2xQb2x5Z29uTW9kZSIsIAotCSJnbFBvbHlnb25PZmZzZXQiLCAKLQkiZ2xQb2x5Z29uU3RpcHBsZSIsIAotCSJnbFBvcEF0dHJpYiIsIAotCSJnbFBvcENsaWVudEF0dHJpYiIsIAotCSJnbFBvcE1hdHJpeCIsIAotCSJnbFBvcE5hbWUiLCAKLQkiZ2xQcmlvcml0aXplVGV4dHVyZXMiLCAKLQkiZ2xQdXNoQXR0cmliIiwgCi0JImdsUHVzaENsaWVudEF0dHJpYiIsIAotCSJnbFB1c2hNYXRyaXgiLCAKLQkiZ2xQdXNoTmFtZSIsIAotCSJnbFJhc3RlclBvczJkIiwgCi0JImdsUmFzdGVyUG9zMmR2IiwgCi0JImdsUmFzdGVyUG9zMmYiLCAKLQkiZ2xSYXN0ZXJQb3MyZnYiLCAKLQkiZ2xSYXN0ZXJQb3MyaSIsIAotCSJnbFJhc3RlclBvczJpdiIsIAotCSJnbFJhc3RlclBvczJzIiwgCi0JImdsUmFzdGVyUG9zMnN2IiwgCi0JImdsUmFzdGVyUG9zM2QiLCAKLQkiZ2xSYXN0ZXJQb3MzZHYiLCAKLQkiZ2xSYXN0ZXJQb3MzZiIsIAotCSJnbFJhc3RlclBvczNmdiIsIAotCSJnbFJhc3RlclBvczNpIiwgCi0JImdsUmFzdGVyUG9zM2l2IiwgCi0JImdsUmFzdGVyUG9zM3MiLCAKLQkiZ2xSYXN0ZXJQb3Mzc3YiLCAKLQkiZ2xSYXN0ZXJQb3M0ZCIsIAotCSJnbFJhc3RlclBvczRkdiIsIAotCSJnbFJhc3RlclBvczRmIiwgCi0JImdsUmFzdGVyUG9zNGZ2IiwgCi0JImdsUmFzdGVyUG9zNGkiLCAKLQkiZ2xSYXN0ZXJQb3M0aXYiLCAKLQkiZ2xSYXN0ZXJQb3M0cyIsIAotCSJnbFJhc3RlclBvczRzdiIsIAotCSJnbFJlYWRCdWZmZXIiLCAKLQkiZ2xSZWFkUGl4ZWxzIiwgCi0JImdsUmVjdGQiLCAKLQkiZ2xSZWN0ZHYiLCAKLQkiZ2xSZWN0ZiIsIAotCSJnbFJlY3RmdiIsIAotCSJnbFJlY3RpIiwgCi0JImdsUmVjdGl2IiwgCi0JImdsUmVjdHMiLCAKLQkiZ2xSZWN0c3YiLCAKLQkiZ2xSZW5kZXJNb2RlIiwgCi0JImdsUm90YXRlZCIsIAotCSJnbFJvdGF0ZWYiLCAKLQkiZ2xTY2FsZWQiLCAKLQkiZ2xTY2FsZWYiLCAKLQkiZ2xTY2lzc29yIiwgCi0JImdsU2VsZWN0QnVmZmVyIiwgCi0JImdsU2hhZGVNb2RlbCIsIAotCSJnbFN0ZW5jaWxGdW5jIiwgCi0JImdsU3RlbmNpbE1hc2siLCAKLQkiZ2xTdGVuY2lsT3AiLCAKLQkiZ2xUZXhDb29yZDFkIiwgCi0JImdsVGV4Q29vcmQxZHYiLCAKLQkiZ2xUZXhDb29yZDFmIiwgCi0JImdsVGV4Q29vcmQxZnYiLCAKLQkiZ2xUZXhDb29yZDFpIiwgCi0JImdsVGV4Q29vcmQxaXYiLCAKLQkiZ2xUZXhDb29yZDFzIiwgCi0JImdsVGV4Q29vcmQxc3YiLCAKLQkiZ2xUZXhDb29yZDJkIiwgCi0JImdsVGV4Q29vcmQyZHYiLCAKLQkiZ2xUZXhDb29yZDJmIiwgCi0JImdsVGV4Q29vcmQyZnYiLCAKLQkiZ2xUZXhDb29yZDJpIiwgCi0JImdsVGV4Q29vcmQyaXYiLCAKLQkiZ2xUZXhDb29yZDJzIiwgCi0JImdsVGV4Q29vcmQyc3YiLCAKLQkiZ2xUZXhDb29yZDNkIiwgCi0JImdsVGV4Q29vcmQzZHYiLCAKLQkiZ2xUZXhDb29yZDNmIiwgCi0JImdsVGV4Q29vcmQzZnYiLCAKLQkiZ2xUZXhDb29yZDNpIiwgCi0JImdsVGV4Q29vcmQzaXYiLCAKLQkiZ2xUZXhDb29yZDNzIiwgCi0JImdsVGV4Q29vcmQzc3YiLCAKLQkiZ2xUZXhDb29yZDRkIiwgCi0JImdsVGV4Q29vcmQ0ZHYiLCAKLQkiZ2xUZXhDb29yZDRmIiwgCi0JImdsVGV4Q29vcmQ0ZnYiLCAKLQkiZ2xUZXhDb29yZDRpIiwgCi0JImdsVGV4Q29vcmQ0aXYiLCAKLQkiZ2xUZXhDb29yZDRzIiwgCi0JImdsVGV4Q29vcmQ0c3YiLCAKLQkiZ2xUZXhDb29yZFBvaW50ZXIiLCAKLQkiZ2xUZXhFbnZmIiwgCi0JImdsVGV4RW52ZnYiLCAKLQkiZ2xUZXhFbnZpIiwgCi0JImdsVGV4RW52aXYiLCAKLQkiZ2xUZXhHZW5kIiwgCi0JImdsVGV4R2VuZHYiLCAKLQkiZ2xUZXhHZW5mIiwgCi0JImdsVGV4R2VuZnYiLCAKLQkiZ2xUZXhHZW5pIiwgCi0JImdsVGV4R2VuaXYiLCAKLQkiZ2xUZXhJbWFnZTFEIiwgCi0JImdsVGV4SW1hZ2UyRCIsIAotCSJnbFRleFBhcmFtZXRlcmYiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbFRleFBhcmFtZXRlcmkiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJpdiIsIAotCSJnbFRleFN1YkltYWdlMUQiLCAKLQkiZ2xUZXhTdWJJbWFnZTJEIiwgCi0JImdsVHJhbnNsYXRlZCIsIAotCSJnbFRyYW5zbGF0ZWYiLCAKLQkiZ2xWZXJ0ZXgyZCIsIAotCSJnbFZlcnRleDJkdiIsIAotCSJnbFZlcnRleDJmIiwgCi0JImdsVmVydGV4MmZ2IiwgCi0JImdsVmVydGV4MmkiLCAKLQkiZ2xWZXJ0ZXgyaXYiLCAKLQkiZ2xWZXJ0ZXgycyIsIAotCSJnbFZlcnRleDJzdiIsIAotCSJnbFZlcnRleDNkIiwgCi0JImdsVmVydGV4M2R2IiwgCi0JImdsVmVydGV4M2YiLCAKLQkiZ2xWZXJ0ZXgzZnYiLCAKLQkiZ2xWZXJ0ZXgzaSIsIAotCSJnbFZlcnRleDNpdiIsIAotCSJnbFZlcnRleDNzIiwgCi0JImdsVmVydGV4M3N2IiwgCi0JImdsVmVydGV4NGQiLCAKLQkiZ2xWZXJ0ZXg0ZHYiLCAKLQkiZ2xWZXJ0ZXg0ZiIsIAotCSJnbFZlcnRleDRmdiIsIAotCSJnbFZlcnRleDRpIiwgCi0JImdsVmVydGV4NGl2IiwgCi0JImdsVmVydGV4NHMiLCAKLQkiZ2xWZXJ0ZXg0c3YiLCAKLQkiZ2xWZXJ0ZXhQb2ludGVyIiwgCi0JImdsVmlld3BvcnQiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWZlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotI2lmZGVmIE5BVElWRV9TVEFUUwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMX25hdGl2ZUZ1bmN0aW9uTmFtZXNbXTsKLSNkZWZpbmUgR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbHNlCi0jZGVmaW5lIEdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xBY2N1bV9GVU5DLAotCWdsQWxwaGFGdW5jX0ZVTkMsCi0JZ2xBcmVUZXh0dXJlc1Jlc2lkZW50X0ZVTkMsCi0JZ2xBcnJheUVsZW1lbnRfRlVOQywKLQlnbEJlZ2luX0ZVTkMsCi0JZ2xCaW5kVGV4dHVyZV9GVU5DLAotCWdsQml0bWFwX0ZVTkMsCi0JZ2xCbGVuZEZ1bmNfRlVOQywKLQlnbENhbGxMaXN0X0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNJX0ZVTkMsCi0JZ2xDbGVhcl9GVU5DLAotCWdsQ2xlYXJBY2N1bV9GVU5DLAotCWdsQ2xlYXJDb2xvcl9GVU5DLAotCWdsQ2xlYXJEZXB0aF9GVU5DLAotCWdsQ2xlYXJJbmRleF9GVU5DLAotCWdsQ2xlYXJTdGVuY2lsX0ZVTkMsCi0JZ2xDbGlwUGxhbmVfRlVOQywKLQlnbENvbG9yM2JfRlVOQywKLQlnbENvbG9yM2J2X0ZVTkMsCi0JZ2xDb2xvcjNkX0ZVTkMsCi0JZ2xDb2xvcjNkdl9GVU5DLAotCWdsQ29sb3IzZl9GVU5DLAotCWdsQ29sb3IzZnZfRlVOQywKLQlnbENvbG9yM2lfRlVOQywKLQlnbENvbG9yM2l2X0ZVTkMsCi0JZ2xDb2xvcjNzX0ZVTkMsCi0JZ2xDb2xvcjNzdl9GVU5DLAotCWdsQ29sb3IzdWJfRlVOQywKLQlnbENvbG9yM3Vidl9GVU5DLAotCWdsQ29sb3IzdWlfRlVOQywKLQlnbENvbG9yM3Vpdl9GVU5DLAotCWdsQ29sb3IzdXNfRlVOQywKLQlnbENvbG9yM3Vzdl9GVU5DLAotCWdsQ29sb3I0Yl9GVU5DLAotCWdsQ29sb3I0YnZfRlVOQywKLQlnbENvbG9yNGRfRlVOQywKLQlnbENvbG9yNGR2X0ZVTkMsCi0JZ2xDb2xvcjRmX0ZVTkMsCi0JZ2xDb2xvcjRmdl9GVU5DLAotCWdsQ29sb3I0aV9GVU5DLAotCWdsQ29sb3I0aXZfRlVOQywKLQlnbENvbG9yNHNfRlVOQywKLQlnbENvbG9yNHViX0ZVTkMsCi0JZ2xDb2xvcjR1YnZfRlVOQywKLQlnbENvbG9yNHVpX0ZVTkMsCi0JZ2xDb2xvcjR1aXZfRlVOQywKLQlnbENvbG9yNHVzX0ZVTkMsCi0JZ2xDb2xvcjR1c3ZfRlVOQywKLQlnbENvbG9yTWFza19GVU5DLAotCWdsQ29sb3JNYXRlcmlhbF9GVU5DLAotCWdsQ29sb3JQb2ludGVyX0ZVTkMsCi0JZ2xDb3B5UGl4ZWxzX0ZVTkMsCi0JZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DLAotCWdsQ29weVRleEltYWdlMkRfRlVOQywKLQlnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMsCi0JZ2xDb3B5VGV4U3ViSW1hZ2UyRF9GVU5DLAotCWdsQ3VsbEZhY2VfRlVOQywKLQlnbERlbGV0ZUxpc3RzX0ZVTkMsCi0JZ2xEZWxldGVUZXh0dXJlc19GVU5DLAotCWdsRGVwdGhGdW5jX0ZVTkMsCi0JZ2xEZXB0aE1hc2tfRlVOQywKLQlnbERlcHRoUmFuZ2VfRlVOQywKLQlnbERpc2FibGVfRlVOQywKLQlnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DLAotCWdsRHJhd0FycmF5c19GVU5DLAotCWdsRHJhd0J1ZmZlcl9GVU5DLAotCWdsRHJhd0VsZW1lbnRzX0ZVTkMsCi0JZ2xEcmF3UGl4ZWxzX0ZVTkMsCi0JZ2xFZGdlRmxhZ19GVU5DLAotCWdsRWRnZUZsYWdQb2ludGVyX0ZVTkMsCi0JZ2xFZGdlRmxhZ3ZfRlVOQywKLQlnbEVuYWJsZV9GVU5DLAotCWdsRW5hYmxlQ2xpZW50U3RhdGVfRlVOQywKLQlnbEVuZF9GVU5DLAotCWdsRW5kTGlzdF9GVU5DLAotCWdsRXZhbENvb3JkMWRfRlVOQywKLQlnbEV2YWxDb29yZDFkdl9GVU5DLAotCWdsRXZhbENvb3JkMWZfRlVOQywKLQlnbEV2YWxDb29yZDFmdl9GVU5DLAotCWdsRXZhbENvb3JkMmRfRlVOQywKLQlnbEV2YWxDb29yZDJkdl9GVU5DLAotCWdsRXZhbENvb3JkMmZfRlVOQywKLQlnbEV2YWxDb29yZDJmdl9GVU5DLAotCWdsRXZhbE1lc2gxX0ZVTkMsCi0JZ2xFdmFsTWVzaDJfRlVOQywKLQlnbEV2YWxQb2ludDFfRlVOQywKLQlnbEV2YWxQb2ludDJfRlVOQywKLQlnbEZlZWRiYWNrQnVmZmVyX0ZVTkMsCi0JZ2xGaW5pc2hfRlVOQywKLQlnbEZsdXNoX0ZVTkMsCi0JZ2xGb2dmX0ZVTkMsCi0JZ2xGb2dmdl9GVU5DLAotCWdsRm9naV9GVU5DLAotCWdsRm9naXZfRlVOQywKLQlnbEZyb250RmFjZV9GVU5DLAotCWdsRnJ1c3R1bV9GVU5DLAotCWdsR2VuTGlzdHNfRlVOQywKLQlnbEdlblRleHR1cmVzX0ZVTkMsCi0JZ2xHZXRCb29sZWFudl9GVU5DLAotCWdsR2V0Q2xpcFBsYW5lX0ZVTkMsCi0JZ2xHZXREb3VibGV2X0ZVTkMsCi0JZ2xHZXRFcnJvcl9GVU5DLAotCWdsR2V0RmxvYXR2X0ZVTkMsCi0JZ2xHZXRJbnRlZ2Vydl9GVU5DLAotCWdsR2V0TGlnaHRmdl9GVU5DLAotCWdsR2V0TGlnaHRpdl9GVU5DLAotCWdsR2V0TWFwZHZfRlVOQywKLQlnbEdldE1hcGZ2X0ZVTkMsCi0JZ2xHZXRNYXBpdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxmdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxpdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXBmdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXB1aXZfRlVOQywKLQlnbEdldFBpeGVsTWFwdXN2X0ZVTkMsCi0JZ2xHZXRQb2ludGVydl9GVU5DLAotCWdsR2V0UG9seWdvblN0aXBwbGVfRlVOQywKLQlnbEdldFN0cmluZ19GVU5DLAotCWdsR2V0VGV4RW52ZnZfRlVOQywKLQlnbEdldFRleEVudml2X0ZVTkMsCi0JZ2xHZXRUZXhHZW5kdl9GVU5DLAotCWdsR2V0VGV4R2VuZnZfRlVOQywKLQlnbEdldFRleEdlbml2X0ZVTkMsCi0JZ2xHZXRUZXhJbWFnZV9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DLAotCWdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQywKLQlnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMsCi0JZ2xIaW50X0ZVTkMsCi0JZ2xJbmRleE1hc2tfRlVOQywKLQlnbEluZGV4UG9pbnRlcl9GVU5DLAotCWdsSW5kZXhkX0ZVTkMsCi0JZ2xJbmRleGR2X0ZVTkMsCi0JZ2xJbmRleGZfRlVOQywKLQlnbEluZGV4ZnZfRlVOQywKLQlnbEluZGV4aV9GVU5DLAotCWdsSW5kZXhpdl9GVU5DLAotCWdsSW5kZXhzX0ZVTkMsCi0JZ2xJbmRleHN2X0ZVTkMsCi0JZ2xJbml0TmFtZXNfRlVOQywKLQlnbEludGVybGVhdmVkQXJyYXlzX0ZVTkMsCi0JZ2xJc0VuYWJsZWRfRlVOQywKLQlnbElzTGlzdF9GVU5DLAotCWdsSXNUZXh0dXJlX0ZVTkMsCi0JZ2xMaWdodE1vZGVsZl9GVU5DLAotCWdsTGlnaHRNb2RlbGZ2X0ZVTkMsCi0JZ2xMaWdodE1vZGVsaV9GVU5DLAotCWdsTGlnaHRNb2RlbGl2X0ZVTkMsCi0JZ2xMaWdodGZfRlVOQywKLQlnbExpZ2h0ZnZfRlVOQywKLQlnbExpZ2h0aV9GVU5DLAotCWdsTGlnaHRpdl9GVU5DLAotCWdsTGluZVN0aXBwbGVfRlVOQywKLQlnbExpbmVXaWR0aF9GVU5DLAotCWdsTGlzdEJhc2VfRlVOQywKLQlnbExvYWRJZGVudGl0eV9GVU5DLAotCWdsTG9hZE1hdHJpeGRfRlVOQywKLQlnbExvYWRNYXRyaXhmX0ZVTkMsCi0JZ2xMb2FkTmFtZV9GVU5DLAotCWdsTG9naWNPcF9GVU5DLAotCWdsTWFwMWRfRlVOQywKLQlnbE1hcDFmX0ZVTkMsCi0JZ2xNYXAyZF9GVU5DLAotCWdsTWFwMmZfRlVOQywKLQlnbE1hcEdyaWQxZF9GVU5DLAotCWdsTWFwR3JpZDFmX0ZVTkMsCi0JZ2xNYXBHcmlkMmRfRlVOQywKLQlnbE1hcEdyaWQyZl9GVU5DLAotCWdsTWF0ZXJpYWxmX0ZVTkMsCi0JZ2xNYXRlcmlhbGZ2X0ZVTkMsCi0JZ2xNYXRlcmlhbGlfRlVOQywKLQlnbE1hdGVyaWFsaXZfRlVOQywKLQlnbE1hdHJpeE1vZGVfRlVOQywKLQlnbE11bHRNYXRyaXhkX0ZVTkMsCi0JZ2xNdWx0TWF0cml4Zl9GVU5DLAotCWdsTmV3TGlzdF9GVU5DLAotCWdsTm9ybWFsM2JfRlVOQywKLQlnbE5vcm1hbDNidl9GVU5DLAotCWdsTm9ybWFsM2RfRlVOQywKLQlnbE5vcm1hbDNkdl9GVU5DLAotCWdsTm9ybWFsM2ZfRlVOQywKLQlnbE5vcm1hbDNmdl9GVU5DLAotCWdsTm9ybWFsM2lfRlVOQywKLQlnbE5vcm1hbDNpdl9GVU5DLAotCWdsTm9ybWFsM3NfRlVOQywKLQlnbE5vcm1hbDNzdl9GVU5DLAotCWdsTm9ybWFsUG9pbnRlcl9GVU5DLAotCWdsT3J0aG9fRlVOQywKLQlnbFBhc3NUaHJvdWdoX0ZVTkMsCi0JZ2xQaXhlbE1hcGZ2X0ZVTkMsCi0JZ2xQaXhlbE1hcHVpdl9GVU5DLAotCWdsUGl4ZWxNYXB1c3ZfRlVOQywKLQlnbFBpeGVsU3RvcmVmX0ZVTkMsCi0JZ2xQaXhlbFN0b3JlaV9GVU5DLAotCWdsUGl4ZWxUcmFuc2ZlcmZfRlVOQywKLQlnbFBpeGVsVHJhbnNmZXJpX0ZVTkMsCi0JZ2xQaXhlbFpvb21fRlVOQywKLQlnbFBvaW50U2l6ZV9GVU5DLAotCWdsUG9seWdvbk1vZGVfRlVOQywKLQlnbFBvbHlnb25PZmZzZXRfRlVOQywKLQlnbFBvbHlnb25TdGlwcGxlX0ZVTkMsCi0JZ2xQb3BBdHRyaWJfRlVOQywKLQlnbFBvcENsaWVudEF0dHJpYl9GVU5DLAotCWdsUG9wTWF0cml4X0ZVTkMsCi0JZ2xQb3BOYW1lX0ZVTkMsCi0JZ2xQcmlvcml0aXplVGV4dHVyZXNfRlVOQywKLQlnbFB1c2hBdHRyaWJfRlVOQywKLQlnbFB1c2hDbGllbnRBdHRyaWJfRlVOQywKLQlnbFB1c2hNYXRyaXhfRlVOQywKLQlnbFB1c2hOYW1lX0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZF9GVU5DLAotCWdsUmFzdGVyUG9zMmR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZl9GVU5DLAotCWdsUmFzdGVyUG9zMmZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyaV9GVU5DLAotCWdsUmFzdGVyUG9zMml2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Myc19GVU5DLAotCWdsUmFzdGVyUG9zMnN2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZF9GVU5DLAotCWdsUmFzdGVyUG9zM2R2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZl9GVU5DLAotCWdsUmFzdGVyUG9zM2Z2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzaV9GVU5DLAotCWdsUmFzdGVyUG9zM2l2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Mzc19GVU5DLAotCWdsUmFzdGVyUG9zM3N2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0ZF9GVU5DLAotCWdsUmFzdGVyUG9zNGR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0Zl9GVU5DLAotCWdsUmFzdGVyUG9zNGZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0aV9GVU5DLAotCWdsUmFzdGVyUG9zNGl2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0c19GVU5DLAotCWdsUmFzdGVyUG9zNHN2X0ZVTkMsCi0JZ2xSZWFkQnVmZmVyX0ZVTkMsCi0JZ2xSZWFkUGl4ZWxzX0ZVTkMsCi0JZ2xSZWN0ZF9GVU5DLAotCWdsUmVjdGR2X0ZVTkMsCi0JZ2xSZWN0Zl9GVU5DLAotCWdsUmVjdGZ2X0ZVTkMsCi0JZ2xSZWN0aV9GVU5DLAotCWdsUmVjdGl2X0ZVTkMsCi0JZ2xSZWN0c19GVU5DLAotCWdsUmVjdHN2X0ZVTkMsCi0JZ2xSZW5kZXJNb2RlX0ZVTkMsCi0JZ2xSb3RhdGVkX0ZVTkMsCi0JZ2xSb3RhdGVmX0ZVTkMsCi0JZ2xTY2FsZWRfRlVOQywKLQlnbFNjYWxlZl9GVU5DLAotCWdsU2Npc3Nvcl9GVU5DLAotCWdsU2VsZWN0QnVmZmVyX0ZVTkMsCi0JZ2xTaGFkZU1vZGVsX0ZVTkMsCi0JZ2xTdGVuY2lsRnVuY19GVU5DLAotCWdsU3RlbmNpbE1hc2tfRlVOQywKLQlnbFN0ZW5jaWxPcF9GVU5DLAotCWdsVGV4Q29vcmQxZF9GVU5DLAotCWdsVGV4Q29vcmQxZHZfRlVOQywKLQlnbFRleENvb3JkMWZfRlVOQywKLQlnbFRleENvb3JkMWZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDFpX0ZVTkMsCi0JZ2xUZXhDb29yZDFpdl9GVU5DLAotCWdsVGV4Q29vcmQxc19GVU5DLAotCWdsVGV4Q29vcmQxc3ZfRlVOQywKLQlnbFRleENvb3JkMmRfRlVOQywKLQlnbFRleENvb3JkMmR2X0ZVTkMsCi0JZ2xUZXhDb29yZDJmX0ZVTkMsCi0JZ2xUZXhDb29yZDJmdl9GVU5DLAotCWdsVGV4Q29vcmQyaV9GVU5DLAotCWdsVGV4Q29vcmQyaXZfRlVOQywKLQlnbFRleENvb3JkMnNfRlVOQywKLQlnbFRleENvb3JkMnN2X0ZVTkMsCi0JZ2xUZXhDb29yZDNkX0ZVTkMsCi0JZ2xUZXhDb29yZDNkdl9GVU5DLAotCWdsVGV4Q29vcmQzZl9GVU5DLAotCWdsVGV4Q29vcmQzZnZfRlVOQywKLQlnbFRleENvb3JkM2lfRlVOQywKLQlnbFRleENvb3JkM2l2X0ZVTkMsCi0JZ2xUZXhDb29yZDNzX0ZVTkMsCi0JZ2xUZXhDb29yZDNzdl9GVU5DLAotCWdsVGV4Q29vcmQ0ZF9GVU5DLAotCWdsVGV4Q29vcmQ0ZHZfRlVOQywKLQlnbFRleENvb3JkNGZfRlVOQywKLQlnbFRleENvb3JkNGZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDRpX0ZVTkMsCi0JZ2xUZXhDb29yZDRpdl9GVU5DLAotCWdsVGV4Q29vcmQ0c19GVU5DLAotCWdsVGV4Q29vcmQ0c3ZfRlVOQywKLQlnbFRleENvb3JkUG9pbnRlcl9GVU5DLAotCWdsVGV4RW52Zl9GVU5DLAotCWdsVGV4RW52ZnZfRlVOQywKLQlnbFRleEVudmlfRlVOQywKLQlnbFRleEVudml2X0ZVTkMsCi0JZ2xUZXhHZW5kX0ZVTkMsCi0JZ2xUZXhHZW5kdl9GVU5DLAotCWdsVGV4R2VuZl9GVU5DLAotCWdsVGV4R2VuZnZfRlVOQywKLQlnbFRleEdlbmlfRlVOQywKLQlnbFRleEdlbml2X0ZVTkMsCi0JZ2xUZXhJbWFnZTFEX0ZVTkMsCi0JZ2xUZXhJbWFnZTJEX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaV9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaXZfRlVOQywKLQlnbFRleFN1YkltYWdlMURfRlVOQywKLQlnbFRleFN1YkltYWdlMkRfRlVOQywKLQlnbFRyYW5zbGF0ZWRfRlVOQywKLQlnbFRyYW5zbGF0ZWZfRlVOQywKLQlnbFZlcnRleDJkX0ZVTkMsCi0JZ2xWZXJ0ZXgyZHZfRlVOQywKLQlnbFZlcnRleDJmX0ZVTkMsCi0JZ2xWZXJ0ZXgyZnZfRlVOQywKLQlnbFZlcnRleDJpX0ZVTkMsCi0JZ2xWZXJ0ZXgyaXZfRlVOQywKLQlnbFZlcnRleDJzX0ZVTkMsCi0JZ2xWZXJ0ZXgyc3ZfRlVOQywKLQlnbFZlcnRleDNkX0ZVTkMsCi0JZ2xWZXJ0ZXgzZHZfRlVOQywKLQlnbFZlcnRleDNmX0ZVTkMsCi0JZ2xWZXJ0ZXgzZnZfRlVOQywKLQlnbFZlcnRleDNpX0ZVTkMsCi0JZ2xWZXJ0ZXgzaXZfRlVOQywKLQlnbFZlcnRleDNzX0ZVTkMsCi0JZ2xWZXJ0ZXgzc3ZfRlVOQywKLQlnbFZlcnRleDRkX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZHZfRlVOQywKLQlnbFZlcnRleDRmX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZnZfRlVOQywKLQlnbFZlcnRleDRpX0ZVTkMsCi0JZ2xWZXJ0ZXg0aXZfRlVOQywKLQlnbFZlcnRleDRzX0ZVTkMsCi0JZ2xWZXJ0ZXg0c3ZfRlVOQywKLQlnbFZlcnRleFBvaW50ZXJfRlVOQywKLQlnbFZpZXdwb3J0X0ZVTkMsCi19IEdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDkwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTk2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2luY2x1ZGUgImdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNzA3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNkZWZpbmUgR0xVX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTFVfIyNmdW5jCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5DdXJ2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCZWdpbkN1cnZlX0ZVTkMpOwotCWdsdUJlZ2luQ3VydmUoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5DdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luUG9seWdvbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luUG9seWdvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLQlnbHVCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luU3VyZmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luU3VyZmFjZV9GVU5DKTsKLQlnbHVCZWdpblN1cmZhY2UoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5TdXJmYWNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5UcmltCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QmVnaW5UcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QmVnaW5UcmltX0ZVTkMpOwotCWdsdUJlZ2luVHJpbSgoR0xVbnVyYnMgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVCZWdpblRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVCdWlsZDFETWlwbWFwcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJ1aWxkMURNaXBtYXBzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QnVpbGQxRE1pcG1hcHNfRlVOQyk7Ci0JcmMgPSAoamludClnbHVCdWlsZDFETWlwbWFwcyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCAoY29uc3Qgdm9pZCAqKWFyZzUpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMURNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJ1aWxkMkRNaXBtYXBzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QnVpbGQyRE1pcG1hcHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamJ5dGVBcnJheSBhcmc2KQotewotCWpieXRlICpscGFyZzY9TlVMTDsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCdWlsZDJETWlwbWFwc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JfQotCXJjID0gKGppbnQpZ2x1QnVpbGQyRE1pcG1hcHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUN5bGluZGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1Q3lsaW5kZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1Q3lsaW5kZXJfRlVOQyk7Ci0JZ2x1Q3lsaW5kZXIoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVDeWxpbmRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdURlbGV0ZU51cmJzUmVuZGVyZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVEZWxldGVOdXJic1JlbmRlcmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl9GVU5DKTsKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyKChHTFVudXJicyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZU51cmJzUmVuZGVyZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVRdWFkcmljCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlUXVhZHJpYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci0JZ2x1RGVsZXRlUXVhZHJpYygoR0xVcXVhZHJpYyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVUZXNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlVGVzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci0JZ2x1RGVsZXRlVGVzcygoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEaXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLQlnbHVEaXNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZEN1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RW5kQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLQlnbHVFbmRDdXJ2ZSgoR0xVbnVyYnNPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRQb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kUG9seWdvbl9GVU5DKTsKLQlnbHVFbmRQb2x5Z29uKChHTFV0cmlhbmd1bGF0b3JPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1RW5kU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVuZFN1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRTdXJmYWNlX0ZVTkMpOwotCWdsdUVuZFN1cmZhY2UoKEdMVW51cmJzT2JqICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RW5kU3VyZmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFRyaW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRUcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kVHJpbV9GVU5DKTsKLQlnbHVFbmRUcmltKChHTFVudXJic09iaiAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVuZFRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVFcnJvclN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVycm9yU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFcnJvclN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUVycm9yU3RyaW5nKGFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVycm9yU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUdldE51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXROdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1R2V0TnVyYnNQcm9wZXJ0eSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVHZXRTdHJpbmcKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldFN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUdldFN0cmluZyhhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRTdHJpbmdfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1R2V0VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1R2V0VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlQXJyYXkgYXJnMikKLXsKLQlqZG91YmxlICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1R2V0VGVzc1Byb3BlcnR5X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbHVHZXRUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXMoKEdMVW51cmJzICopYXJnMCwgbHBhcmcxLCBscGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TG9va0F0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TG9va0F0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMywgamRvdWJsZSBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamRvdWJsZSBhcmc3LCBqZG91YmxlIGFyZzgpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUxvb2tBdF9GVU5DKTsKLQlnbHVMb29rQXQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TG9va0F0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3TnVyYnNSZW5kZXJlcgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld051cmJzUmVuZGVyZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdOdXJic1JlbmRlcmVyX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3TnVyYnNSZW5kZXJlcigpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld051cmJzUmVuZGVyZXJfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3UXVhZHJpYwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1F1YWRyaWMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdRdWFkcmljX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3UXVhZHJpYygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1F1YWRyaWNfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3VGVzcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1Rlc3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdUZXNzX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3VGVzcygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1Rlc3NfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV4dENvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOZXh0Q29udG91cikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TmV4dENvbnRvdXJfRlVOQyk7Ci0JZ2x1TmV4dENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOZXh0Q29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzQ2FsbGJhY2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic0NhbGxiYWNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1TnVyYnNDYWxsYmFjaygoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCAoR0x2b2lkKCopKWFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic0N1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TnVyYnNDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqZmxvYXRBcnJheSBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWpmbG9hdCAqbHBhcmc0PU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNDdXJ2ZSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIsIGFyZzMsIGxwYXJnNCwgYXJnNSwgYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TnVyYnNDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TnVyYnNQcm9wZXJ0eV9GVU5DKTsKLQlnbHVOdXJic1Byb3BlcnR5KChHTFVudXJicyAqKWFyZzAsIGFyZzEsIGFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic1N1cmZhY2UKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1N1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIsIGppbnQgYXJnMywgamZsb2F0QXJyYXkgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGpmbG9hdEFycmF5IGFyZzcsIGppbnQgYXJnOCwgamludCBhcmc5LCBqaW50IGFyZzEwKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JamZsb2F0ICpscGFyZzQ9TlVMTDsKLQlqZmxvYXQgKmxwYXJnNz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNTdXJmYWNlKChHTFVudXJic09iaiAqKWFyZzAsIGFyZzEsIGxwYXJnMiwgYXJnMywgbHBhcmc0LCBhcmc1LCBhcmc2LCBscGFyZzcsIGFyZzgsIGFyZzksIGFyZzEwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVPcnRobzJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1T3J0aG8yRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU9ydGhvMkRfRlVOQyk7Ci0JZ2x1T3J0aG8yRChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVPcnRobzJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UGFydGlhbERpc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQYXJ0aWFsRGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamRvdWJsZSBhcmc1LCBqZG91YmxlIGFyZzYpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVBhcnRpYWxEaXNrX0ZVTkMpOwotCWdsdVBhcnRpYWxEaXNrKChHTFVxdWFkcmljICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGFydGlhbERpc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQZXJzcGVjdGl2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVBlcnNwZWN0aXZlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci0JZ2x1UGVyc3BlY3RpdmUoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQaWNrTWF0cml4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UGlja01hdHJpeCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVQaWNrTWF0cml4X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCX0KLQlnbHVQaWNrTWF0cml4KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVBpY2tNYXRyaXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQcm9qZWN0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JcmMgPSAoamludClnbHVQcm9qZWN0KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMywgbHBhcmc0LCBscGFyZzUsIGxwYXJnNiwgbHBhcmc3LCBscGFyZzgpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UHdsQ3VydmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQd2xDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UHdsQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1UHdsQ3VydmUoKEdMVW51cmJzICopYXJnMCwgYXJnMSwgbHBhcmcyLCBhcmczLCBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVQd2xDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1UXVhZHJpY0NhbGxiYWNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljRHJhd1N0eWxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY0RyYXdTdHlsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLQlnbHVRdWFkcmljRHJhd1N0eWxlKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNOb3JtYWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY05vcm1hbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMpOwotCWdsdVF1YWRyaWNOb3JtYWxzKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY05vcm1hbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljT3JpZW50YXRpb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVRdWFkcmljT3JpZW50YXRpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNPcmllbnRhdGlvbl9GVU5DKTsKLQlnbHVRdWFkcmljT3JpZW50YXRpb24oKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljT3JpZW50YXRpb25fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljVGV4dHVyZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNUZXh0dXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamJvb2xlYW4gYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY1RleHR1cmVfRlVOQyk7Ci0JZ2x1UXVhZHJpY1RleHR1cmUoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVNjYWxlSW1hZ2UKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVTY2FsZUltYWdlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U2NhbGVJbWFnZV9GVU5DKTsKLQlyYyA9IChqaW50KWdsdVNjYWxlSW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKGNvbnN0IHZvaWQgKilhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCAodm9pZCAqKWFyZzgpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNjYWxlSW1hZ2VfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1U3BoZXJlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1U3BoZXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U3BoZXJlX0ZVTkMpOwotCWdsdVNwaGVyZSgoR0xVcXVhZHJpYyAqKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNwaGVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpbkNvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Db250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLQlnbHVUZXNzQmVnaW5Db250b3VyKChHTFV0ZXNzZWxhdG9yICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpblBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Qb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQmVnaW5Qb2x5Z29uX0ZVTkMpOwotCWdsdVRlc3NCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IgKilhcmcwLCAoR0x2b2lkICopYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1VGVzc0NhbGxiYWNrKChHTFV0ZXNzZWxhdG9yICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzRW5kQ29udG91cgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NFbmRDb250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0VuZENvbnRvdXJfRlVOQyk7Ci0JZ2x1VGVzc0VuZENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzRW5kQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NFbmRQb2x5Z29uCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc0VuZFBvbHlnb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzRW5kUG9seWdvbl9GVU5DKTsKLQlnbHVUZXNzRW5kUG9seWdvbigoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc05vcm1hbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NOb3JtYWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotCWdsdVRlc3NOb3JtYWwoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NQcm9wZXJ0eV9GVU5DKTsKLQlnbHVUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzVmVydGV4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1ZlcnRleCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxLCBqaW50IGFyZzIpCi17Ci0JamRvdWJsZSAqbHBhcmcxPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NWZXJ0ZXhfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsdVRlc3NWZXJ0ZXgoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBscGFyZzEsIChHTHZvaWQgKilhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc1ZlcnRleF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVVuUHJvamVjdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVVuUHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVVuUHJvamVjdF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlyYyA9IChqaW50KWdsdVVuUHJvamVjdChhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMsIGxwYXJnNCwgbHBhcmc1LCBscGFyZzYsIGxwYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVVblByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8T3BlbkdML2dsdS5oPgotI2Vsc2UKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPEdML2dsdS5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZmMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50ID0gNTE7Ci1pbnQgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzUxXTsKLWNoYXIgKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbHVCZWdpbkN1cnZlIiwgCi0JImdsdUJlZ2luUG9seWdvbiIsIAotCSJnbHVCZWdpblN1cmZhY2UiLCAKLQkiZ2x1QmVnaW5UcmltIiwgCi0JImdsdUJ1aWxkMURNaXBtYXBzIiwgCi0JImdsdUJ1aWxkMkRNaXBtYXBzIiwgCi0JImdsdUN5bGluZGVyIiwgCi0JImdsdURlbGV0ZU51cmJzUmVuZGVyZXIiLCAKLQkiZ2x1RGVsZXRlUXVhZHJpYyIsIAotCSJnbHVEZWxldGVUZXNzIiwgCi0JImdsdURpc2siLCAKLQkiZ2x1RW5kQ3VydmUiLCAKLQkiZ2x1RW5kUG9seWdvbiIsIAotCSJnbHVFbmRTdXJmYWNlIiwgCi0JImdsdUVuZFRyaW0iLCAKLQkiZ2x1RXJyb3JTdHJpbmciLCAKLQkiZ2x1R2V0TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVHZXRTdHJpbmciLCAKLQkiZ2x1R2V0VGVzc1Byb3BlcnR5IiwgCi0JImdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIiwgCi0JImdsdUxvb2tBdCIsIAotCSJnbHVOZXdOdXJic1JlbmRlcmVyIiwgCi0JImdsdU5ld1F1YWRyaWMiLCAKLQkiZ2x1TmV3VGVzcyIsIAotCSJnbHVOZXh0Q29udG91ciIsIAotCSJnbHVOdXJic0NhbGxiYWNrIiwgCi0JImdsdU51cmJzQ3VydmUiLCAKLQkiZ2x1TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVOdXJic1N1cmZhY2UiLCAKLQkiZ2x1T3J0aG8yRCIsIAotCSJnbHVQYXJ0aWFsRGlzayIsIAotCSJnbHVQZXJzcGVjdGl2ZSIsIAotCSJnbHVQaWNrTWF0cml4IiwgCi0JImdsdVByb2plY3QiLCAKLQkiZ2x1UHdsQ3VydmUiLCAKLQkiZ2x1UXVhZHJpY0NhbGxiYWNrIiwgCi0JImdsdVF1YWRyaWNEcmF3U3R5bGUiLCAKLQkiZ2x1UXVhZHJpY05vcm1hbHMiLCAKLQkiZ2x1UXVhZHJpY09yaWVudGF0aW9uIiwgCi0JImdsdVF1YWRyaWNUZXh0dXJlIiwgCi0JImdsdVNjYWxlSW1hZ2UiLCAKLQkiZ2x1U3BoZXJlIiwgCi0JImdsdVRlc3NCZWdpbkNvbnRvdXIiLCAKLQkiZ2x1VGVzc0JlZ2luUG9seWdvbiIsIAotCSJnbHVUZXNzQ2FsbGJhY2siLCAKLQkiZ2x1VGVzc0VuZENvbnRvdXIiLCAKLQkiZ2x1VGVzc0VuZFBvbHlnb24iLCAKLQkiZ2x1VGVzc05vcm1hbCIsIAotCSJnbHVUZXNzUHJvcGVydHkiLCAKLQkiZ2x1VGVzc1ZlcnRleCIsIAotCSJnbHVVblByb2plY3QiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTFVfMUdldEZ1bmN0aW9uQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlyZXR1cm4gR0xVX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci19Ci0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMVV8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xVX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xVXzFHZXRGdW5jdGlvbkNhbGxDb3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWdsdUJlZ2luQ3VydmVfRlVOQywKLQlnbHVCZWdpblBvbHlnb25fRlVOQywKLQlnbHVCZWdpblN1cmZhY2VfRlVOQywKLQlnbHVCZWdpblRyaW1fRlVOQywKLQlnbHVCdWlsZDFETWlwbWFwc19GVU5DLAotCWdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMsCi0JZ2x1Q3lsaW5kZXJfRlVOQywKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyX0ZVTkMsCi0JZ2x1RGVsZXRlUXVhZHJpY19GVU5DLAotCWdsdURlbGV0ZVRlc3NfRlVOQywKLQlnbHVEaXNrX0ZVTkMsCi0JZ2x1RW5kQ3VydmVfRlVOQywKLQlnbHVFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1RW5kU3VyZmFjZV9GVU5DLAotCWdsdUVuZFRyaW1fRlVOQywKLQlnbHVFcnJvclN0cmluZ19GVU5DLAotCWdsdUdldE51cmJzUHJvcGVydHlfRlVOQywKLQlnbHVHZXRTdHJpbmdfRlVOQywKLQlnbHVHZXRUZXNzUHJvcGVydHlfRlVOQywKLQlnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DLAotCWdsdUxvb2tBdF9GVU5DLAotCWdsdU5ld051cmJzUmVuZGVyZXJfRlVOQywKLQlnbHVOZXdRdWFkcmljX0ZVTkMsCi0JZ2x1TmV3VGVzc19GVU5DLAotCWdsdU5leHRDb250b3VyX0ZVTkMsCi0JZ2x1TnVyYnNDYWxsYmFja19GVU5DLAotCWdsdU51cmJzQ3VydmVfRlVOQywKLQlnbHVOdXJic1Byb3BlcnR5X0ZVTkMsCi0JZ2x1TnVyYnNTdXJmYWNlX0ZVTkMsCi0JZ2x1T3J0aG8yRF9GVU5DLAotCWdsdVBhcnRpYWxEaXNrX0ZVTkMsCi0JZ2x1UGVyc3BlY3RpdmVfRlVOQywKLQlnbHVQaWNrTWF0cml4X0ZVTkMsCi0JZ2x1UHJvamVjdF9GVU5DLAotCWdsdVB3bEN1cnZlX0ZVTkMsCi0JZ2x1UXVhZHJpY0NhbGxiYWNrX0ZVTkMsCi0JZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DLAotCWdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMsCi0JZ2x1UXVhZHJpY09yaWVudGF0aW9uX0ZVTkMsCi0JZ2x1UXVhZHJpY1RleHR1cmVfRlVOQywKLQlnbHVTY2FsZUltYWdlX0ZVTkMsCi0JZ2x1U3BoZXJlX0ZVTkMsCi0JZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DLAotCWdsdVRlc3NCZWdpblBvbHlnb25fRlVOQywKLQlnbHVUZXNzQ2FsbGJhY2tfRlVOQywKLQlnbHVUZXNzRW5kQ29udG91cl9GVU5DLAotCWdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1VGVzc05vcm1hbF9GVU5DLAotCWdsdVRlc3NQcm9wZXJ0eV9GVU5DLAotCWdsdVRlc3NWZXJ0ZXhfRlVOQywKLQlnbHVVblByb2plY3RfRlVOQywKLX0gR0xVX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwY2U0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTFhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlICJnbHUuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAic3d0LmgiCi0KLWludCBJU19KTklfMV8yID0gMDsKLQotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7Ci0JSVNfSk5JXzFfMiA9IDE7Ci0JcmV0dXJuIEpOSV9WRVJTSU9OXzFfMjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI5MDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5DX3N3dF9ICi0jZGVmaW5lIElOQ19zd3RfSAotCi0jaW5jbHVkZSAiam5pLmgiCi0KLS8qIEZvciBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGKHgpCi0vKiNkZWZpbmUgREVCVUdfUFJJTlRGKHgpIHByaW50ZiB4OyAqLwotCi0vKiBkZWZpbmUgdGhpcyB0byBwcmludCBvdXQgZGVidWcgc3RhdGVtZW50cyAqLwotLyogI2RlZmluZSBERUJVR19DQUxMX1BSSU5UUyAqLwotLyogI2RlZmluZSBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMgKi8KLQotI2lmZGVmIERFQlVHX0NBTExfUFJJTlRTCi0jZGVmaW5lIERFQlVHX0NBTEwoZnVuYykgZnByaW50ZihzdGRlcnIsIGZ1bmMpOwotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0FMTChmdW5jKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpIFwKLQlpZiAoYWRkcmVzcyA9PSAwKSB7IFwKLQkJamNsYXNzIGNsYXp6ID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAib3JnL2VjbGlwc2Uvc3d0L1NXVEVycm9yIik7IFwKLQkJaWYgKGNsYXp6ICE9IE5VTEwpIHsgXAotCQkJKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCAiQXJndW1lbnQgY2Fubm90IGJlIE5VTEwiKTsgXAotCQl9IFwKLQkJcmV0dXJuOyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpCi0jZW5kaWYKLQotI2RlZmluZSBERUNMX0dMT0IocFN5bSkKLSNkZWZpbmUgUEdMT0IoeCkgeAotCi0jZGVmaW5lIE5BVElWRV9FTlRFUihlbnYsY2xhenosZnVuYykKLSNkZWZpbmUgTkFUSVZFX0VYSVQoZW52LGNsYXp6LGZ1bmMpCi0KLSNlbmRpZiAvKiBpZm5kZWYgSU5DX3N3dF9IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFhNGZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi1wdWJsaWMgY2xhc3MgR0wgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSU0lPTl8xXzEgPSAxOwotCi0JLyogQWNjdW1PcCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNID0gMHgwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPQUQgPSAweDAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVUVVJOID0gMHgwMTAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFQgPSAweDAxMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREID0gMHgwMTA0OwotCi0JLyogQWxwaGFGdW5jdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSID0gMHgwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgPSAweDAyMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwgPSAweDAyMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMID0gMHgwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgPSAweDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9URVFVQUwgPSAweDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VRVUFMID0gMHgwMjA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMV0FZUyA9IDB4MDIwNzsKLQotCS8qIEF0dHJpYk1hc2sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0JJVCA9IDB4MDAwMDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0JJVCA9IDB4MDAwMDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9CSVQgPSAweDAwMDAwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgPSAweDAwMDAwMDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01PREVfQklUID0gMHgwMDAwMDAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElOR19CSVQgPSAweDAwMDAwMDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19CSVQgPSAweDAwMDAwMDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgPSAweDAwMDAwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNX0JVRkZFUl9CSVQgPSAweDAwMDAwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCA9IDB4MDAwMDA0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlRfQklUID0gMHgwMDAwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUkFOU0ZPUk1fQklUID0gMHgwMDAwMTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTkFCTEVfQklUID0gMHgwMDAwMjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9CVUZGRVJfQklUID0gMHgwMDAwNDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ISU5UX0JJVCA9IDB4MDAwMDgwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVZBTF9CSVQgPSAweDAwMDEwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfQklUID0gMHgwMDAyMDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJVCA9IDB4MDAwNDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CSVQgPSAweDAwMDgwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMTF9BVFRSSUJfQklUUyA9IDB4MDAwZmZmZmY7Ci0KLQkvKiBCZWdpbk1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgPSAweDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9MT09QID0gMHgwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTID0gMHgwMDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQID0gMHgwMDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX0ZBTiA9IDB4MDAwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEUyA9IDB4MDAwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEX1NUUklQID0gMHgwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT04gPSAweDAwMDk7Ci0KLQkvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiA9IDB4MDMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SID0gMHgwMzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQSA9IDB4MDMwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBID0gMHgwMzAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQSA9IDB4MDMwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBID0gMHgwMzA1OwotCi0JLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLQkvKiAgICAgIEdMX1pFUk8gKi8KLQkvKiAgICAgIEdMX09ORSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiA9IDB4MDMwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SID0gMHgwMzA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSA9IDB4MDMwODsKLQkvKiAgICAgIEdMX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0JLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCi0KLQkvKiBCb29sZWFuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFMU0UgPSAwOwotCi0JLyogQ2xlYXJCdWZmZXJNYXNrICovCi0JLyogICAgICBHTF9DT0xPUl9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9BQ0NVTV9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KLQkvKiAgICAgIEdMX0RFUFRIX0JVRkZFUl9CSVQgKi8KLQotCS8qIENsaWVudEFycmF5VHlwZSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0KLQkvKiBDbGlwUGxhbmVOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTAgPSAweDMwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTEgPSAweDMwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTIgPSAweDMwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTMgPSAweDMwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTQgPSAweDMwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTUgPSAweDMwMDU7Ci0KLQkvKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9BTUJJRU5UICovCi0JLyogICAgICBHTF9ESUZGVVNFICovCi0JLyogICAgICBHTF9TUEVDVUxBUiAqLwotCS8qICAgICAgR0xfRU1JU1NJT04gKi8KLQkvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotCS8qIENvbG9yUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX0JZVEUgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9VTlNJR05FRF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9VTlNJR05FRF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIEN1bGxGYWNlTW9kZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBEYXRhVHlwZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUgPSAweDE0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURSA9IDB4MTQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSE9SVCA9IDB4MTQwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVCA9IDB4MTQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlQgPSAweDE0MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfSU5UID0gMHgxNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUID0gMHgxNDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzJfQllURVMgPSAweDE0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfM19CWVRFUyA9IDB4MTQwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF80X0JZVEVTID0gMHgxNDA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVUJMRSA9IDB4MTQwQTsKLQotCS8qIERlcHRoRnVuY3Rpb24gKi8KLQkvKiAgICAgIEdMX05FVkVSICovCi0JLyogICAgICBHTF9MRVNTICovCi0JLyogICAgICBHTF9FUVVBTCAqLwotCS8qICAgICAgR0xfTEVRVUFMICovCi0JLyogICAgICBHTF9HUkVBVEVSICovCi0JLyogICAgICBHTF9OT1RFUVVBTCAqLwotCS8qICAgICAgR0xfR0VRVUFMICovCi0JLyogICAgICBHTF9BTFdBWVMgKi8KLQotCS8qIERyYXdCdWZmZXJNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfTEVGVCA9IDB4MDQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9SSUdIVCA9IDB4MDQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLX0xFRlQgPSAweDA0MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkFDS19SSUdIVCA9IDB4MDQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVCA9IDB4MDQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLID0gMHgwNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFRlQgPSAweDA0MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUklHSFQgPSAweDA0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgPSAweDA0MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMCA9IDB4MDQwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVVgxID0gMHgwNDBBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVWDIgPSAweDA0MEI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMyA9IDB4MDQwQzsKLQotCS8qIEVuYWJsZSAqLwotCS8qICAgICAgR0xfRk9HICovCi0JLyogICAgICBHTF9MSUdIVElORyAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8xRCAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCS8qICAgICAgR0xfTElORV9TVElQUExFICovCi0JLyogICAgICBHTF9QT0xZR09OX1NUSVBQTEUgKi8KLQkvKiAgICAgIEdMX0NVTExfRkFDRSAqLwotCS8qICAgICAgR0xfQUxQSEFfVEVTVCAqLwotCS8qICAgICAgR0xfQkxFTkQgKi8KLQkvKiAgICAgIEdMX0lOREVYX0xPR0lDX09QICovCi0JLyogICAgICBHTF9DT0xPUl9MT0dJQ19PUCAqLwotCS8qICAgICAgR0xfRElUSEVSICovCi0JLyogICAgICBHTF9TVEVOQ0lMX1RFU1QgKi8KLQkvKiAgICAgIEdMX0RFUFRIX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUwICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FMSAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTIgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUzICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FNCAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTUgKi8KLQkvKiAgICAgIEdMX0xJR0hUMCAqLwotCS8qICAgICAgR0xfTElHSFQxICovCi0JLyogICAgICBHTF9MSUdIVDIgKi8KLQkvKiAgICAgIEdMX0xJR0hUMyAqLwotCS8qICAgICAgR0xfTElHSFQ0ICovCi0JLyogICAgICBHTF9MSUdIVDUgKi8KLQkvKiAgICAgIEdMX0xJR0hUNiAqLwotCS8qICAgICAgR0xfTElHSFQ3ICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9TICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9UICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9SICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9RICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAxX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDFfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDFfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCS8qICAgICAgR0xfTUFQMl9DT0xPUl80ICovCi0JLyogICAgICBHTF9NQVAyX0lOREVYICovCi0JLyogICAgICBHTF9NQVAyX05PUk1BTCAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USCAqLwotCS8qICAgICAgR0xfTElORV9TTU9PVEggKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fU01PT1RIICovCi0JLyogICAgICBHTF9TQ0lTU09SX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NPTE9SX01BVEVSSUFMICovCi0JLyogICAgICBHTF9OT1JNQUxJWkUgKi8KLQkvKiAgICAgIEdMX0FVVE9fTk9STUFMICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVkgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWSAqLwotCS8qICAgICAgR0xfQ09MT1JfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVkgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0KLQkvKiBFcnJvckNvZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNID0gMHgwNTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUgPSAweDA1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gPSAweDA1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgPSAweDA1MDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfVU5ERVJGTE9XID0gMHgwNTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgPSAweDA1MDU7Ci0KLQkvKiBGZWVkQmFja01vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8yRCA9IDB4MDYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRCA9IDB4MDYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUiA9IDB4MDYwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUl9URVhUVVJFID0gMHgwNjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzREX0NPTE9SX1RFWFRVUkUgPSAweDA2MDQ7Ci0KLQkvKiBGZWVkQmFja1Rva2VuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFTU19USFJPVUdIX1RPS0VOID0gMHgwNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1RPS0VOID0gMHgwNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfVE9LRU4gPSAweDA3MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9UT0tFTiA9IDB4MDcwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CSVRNQVBfVE9LRU4gPSAweDA3MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19QSVhFTF9UT0tFTiA9IDB4MDcwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZX1BJWEVMX1RPS0VOID0gMHgwNzA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfUkVTRVRfVE9LRU4gPSAweDA3MDc7Ci0KLQkvKiBGb2dNb2RlICovCi0JLyogICAgICBHTF9MSU5FQVIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAgPSAweDA4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQMiA9IDB4MDgwMTsKLQotCS8qIEZvZ1BhcmFtZXRlciAqLwotCS8qICAgICAgR0xfRk9HX0NPTE9SICovCi0JLyogICAgICBHTF9GT0dfREVOU0lUWSAqLwotCS8qICAgICAgR0xfRk9HX0VORCAqLwotCS8qICAgICAgR0xfRk9HX0lOREVYICovCi0JLyogICAgICBHTF9GT0dfTU9ERSAqLwotCS8qICAgICAgR0xfRk9HX1NUQVJUICovCi0KLQkvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyA9IDB4MDkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgPSAweDA5MDE7Ci0KLQkvKiBHZXRNYXBUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0VGRiA9IDB4MEEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUkRFUiA9IDB4MEEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET01BSU4gPSAweDBBMDI7Ci0KLQkvKiBHZXRQaXhlbE1hcCAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fSSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1NfVE9fUyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1JfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0dfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0JfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0FfVE9fQSAqLwotCi0JLyogR2V0UG9pbnRlclRhcmdldCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSICovCi0KLQkvKiBHZXRUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0NPTE9SID0gMHgwQjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfSU5ERVggPSAweDBCMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgPSAweDBCMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyA9IDB4MEIwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUiA9IDB4MEIwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWCA9IDB4MEIwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyA9IDB4MEIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTiA9IDB4MEIwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRCA9IDB4MEIwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSA9IDB4MEIwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEggPSAweDBCMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRSA9IDB4MEIxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX1JBTkdFID0gMHgwQjEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgPSAweDBCMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEggPSAweDBCMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCA9IDB4MEIyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1dJRFRIX1JBTkdFID0gMHgwQjIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkgPSAweDBCMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TVElQUExFID0gMHgwQjI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOID0gMHgwQjI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgPSAweDBCMjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9NT0RFID0gMHgwQjMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSVNUX05FU1RJTkcgPSAweDBCMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9CQVNFID0gMHgwQjMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfSU5ERVggPSAweDBCMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9NT0RFID0gMHgwQjQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIID0gMHgwQjQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRSA9IDB4MEI0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUcgPSAweDBCNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFID0gMHgwQjQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFID0gMHgwQjQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UX0ZBQ0UgPSAweDBCNDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRJTkcgPSAweDBCNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSID0gMHgwQjUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFID0gMHgwQjUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgPSAweDBCNTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVfTU9ERUwgPSAweDBCNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUxfRkFDRSA9IDB4MEI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIgPSAweDBCNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUwgPSAweDBCNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HID0gMHgwQjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19JTkRFWCA9IDB4MEI2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWSA9IDB4MEI2MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfU1RBUlQgPSAweDBCNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0VORCA9IDB4MEI2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfTU9ERSA9IDB4MEI2NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfQ09MT1IgPSAweDBCNjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfUkFOR0UgPSAweDBCNzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCA9IDB4MEI3MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9XUklURU1BU0sgPSAweDBCNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgPSAweDBCNzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyA9IDB4MEI3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9DTEVBUl9WQUxVRSA9IDB4MEI4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgPSAweDBCOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSA9IDB4MEI5MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZVTkMgPSAweDBCOTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLID0gMHgwQjkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRkFJTCA9IDB4MEI5NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCA9IDB4MEI5NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyA9IDB4MEI5NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRiA9IDB4MEI5NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyA9IDB4MEI5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfTU9ERSA9IDB4MEJBMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxJWkUgPSAweDBCQTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgPSAweDBCQTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIID0gMHgwQkEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBCQTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCA9IDB4MEJBNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYID0gMHgwQkE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYID0gMHgwQkE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYID0gMHgwQkE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUVFJJQl9TVEFDS19ERVBUSCA9IDB4MEJCMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwQkIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QgPSAweDBCQzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DID0gMHgwQkMxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfUkVGID0gMHgwQkMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiA9IDB4MEJEMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1QgPSAweDBCRTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDID0gMHgwQkUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EID0gMHgwQkUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QX01PREUgPSAweDBCRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTE9HSUNfT1AgPSAweDBCRjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgPSAweDBCRjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYX0JVRkZFUlMgPSAweDBDMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19CVUZGRVIgPSAweDBDMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVBRF9CVUZGRVIgPSAweDBDMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CT1ggPSAweDBDMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9URVNUID0gMHgwQzExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0NMRUFSX1ZBTFVFID0gMHgwQzIwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX1dSSVRFTUFTSyA9IDB4MEMyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSA9IDB4MEMyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sgPSAweDBDMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTU9ERSA9IDB4MEMzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBX01PREUgPSAweDBDMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFQlVGRkVSID0gMHgwQzMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURVJFTyA9IDB4MEMzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJfTU9ERSA9IDB4MEM0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgPSAweDBDNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgPSAweDBDNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEhfSElOVCA9IDB4MEM1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UID0gMHgwQzUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UID0gMHgwQzU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1MgPSAweDBDNjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9HRU5fVCA9IDB4MEM2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9SID0gMHgwQzYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1EgPSAweDBDNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fSSA9IDB4MEM3MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfU19UT19TID0gMHgwQzcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1IgPSAweDBDNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fRyA9IDB4MEM3MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19CID0gMHgwQzc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0EgPSAweDBDNzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1JfVE9fUiA9IDB4MEM3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfR19UT19HID0gMHgwQzc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0IgPSAweDBDNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0FfVE9fQSA9IDB4MEM3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgPSAweDBDQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1NfVE9fU19TSVpFID0gMHgwQ0IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRSA9IDB4MENCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgPSAweDBDQjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fQl9TSVpFID0gMHgwQ0I0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRSA9IDB4MENCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgPSAweDBDQjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0dfVE9fR19TSVpFID0gMHgwQ0I3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRSA9IDB4MENCODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgPSAweDBDQjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX1NXQVBfQllURVMgPSAweDBDRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX0xTQl9GSVJTVCA9IDB4MENGMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCA9IDB4MENGMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfU0tJUF9ST1dTID0gMHgwQ0YzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19TS0lQX1BJWEVMUyA9IDB4MENGNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwQ0Y1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfU1dBUF9CWVRFUyA9IDB4MEQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0xTQl9GSVJTVCA9IDB4MEQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX1JPV19MRU5HVEggPSAweDBEMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1JPV1MgPSAweDBEMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1BJWEVMUyA9IDB4MEQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0FMSUdOTUVOVCA9IDB4MEQwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVBfQ09MT1IgPSAweDBEMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQX1NURU5DSUwgPSAweDBEMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfU0hJRlQgPSAweDBEMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfT0ZGU0VUID0gMHgwRDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9TQ0FMRSA9IDB4MEQxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRURfQklBUyA9IDB4MEQxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aT09NX1ggPSAweDBEMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWk9PTV9ZID0gMHgwRDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX1NDQUxFID0gMHgwRDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJQVMgPSAweDBEMTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9TQ0FMRSA9IDB4MEQxQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTFVFX0JJQVMgPSAweDBEMUI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfU0NBTEUgPSAweDBEMUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfQklBUyA9IDB4MEQxRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9TQ0FMRSA9IDB4MEQxRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSUFTID0gMHgwRDFGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FVkFMX09SREVSID0gMHgwRDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSUdIVFMgPSAweDBEMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSVBfUExBTkVTID0gMHgwRDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgPSAweDBEMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BJWEVMX01BUF9UQUJMRSA9IDB4MEQzNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwRDM1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggPSAweDBEMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX05BTUVfU1RBQ0tfREVQVEggPSAweDBEMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBEMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggPSAweDBEMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBEM0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggPSAweDBEM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyA9IDB4MEQ1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9CSVRTID0gMHgwRDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9CSVRTID0gMHgwRDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJVFMgPSAweDBENTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTID0gMHgwRDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgPSAweDBENTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQklUUyA9IDB4MEQ1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMgPSAweDBENTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fUkVEX0JJVFMgPSAweDBENTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fR1JFRU5fQklUUyA9IDB4MEQ1OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9CTFVFX0JJVFMgPSAweDBENUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fQUxQSEFfQklUUyA9IDB4MEQ1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OQU1FX1NUQUNLX0RFUFRIID0gMHgwRDcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVVE9fTk9STUFMID0gMHgwRDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfQ09MT1JfNCA9IDB4MEQ5MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0lOREVYID0gMHgwRDkxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfTk9STUFMID0gMHgwRDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8xID0gMHgwRDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8yID0gMHgwRDk0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8zID0gMHgwRDk1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF80ID0gMHgwRDk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVkVSVEVYXzMgPSAweDBEOTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9WRVJURVhfNCA9IDB4MEQ5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0NPTE9SXzQgPSAweDBEQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9JTkRFWCA9IDB4MERCMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX05PUk1BTCA9IDB4MERCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSA9IDB4MERCMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMiA9IDB4MERCNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyA9IDB4MERCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCA9IDB4MERCNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1ZFUlRFWF8zID0gMHgwREI3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDJfVkVSVEVYXzQgPSAweDBEQjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9HUklEX0RPTUFJTiA9IDB4MEREMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0dSSURfU0VHTUVOVFMgPSAweDBERDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9HUklEX0RPTUFJTiA9IDB4MEREMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0dSSURfU0VHTUVOVFMgPSAweDBERDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV8xRCA9IDB4MERFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFXzJEID0gMHgwREUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSID0gMHgwREYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFID0gMHgwREYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFID0gMHgwREYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUiA9IDB4MERGMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1RJT05fQlVGRkVSX1NJWkUgPSAweDBERjQ7Ci0JLyogICAgICBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVlfU0laRSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICovCi0KLQkvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XSURUSCA9IDB4MTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0hFSUdIVCA9IDB4MTAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVCA9IDB4MTAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiA9IDB4MTAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUiA9IDB4MTAwNTsKLQkvKiAgICAgIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfR1JFRU5fU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9CTFVFX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQUxQSEFfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9QUklPUklUWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9SRVNJREVOVCAqLwotCi0JLyogSGludE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET05UX0NBUkUgPSAweDExMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFTVEVTVCA9IDB4MTEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QgPSAweDExMDI7Ci0KLQkvKiBIaW50VGFyZ2V0ICovCi0JLyogICAgICBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9MSU5FX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9GT0dfSElOVCAqLwotCS8qICAgICAgR0xfUEhPTkdfSElOVCAqLwotCi0JLyogSW5kZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0JLyogICAgICBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLwotCi0JLyogTGlnaHROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQwID0gMHg0MDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMSA9IDB4NDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIgPSAweDQwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQzID0gMHg0MDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNCA9IDB4NDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUgPSAweDQwMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ2ID0gMHg0MDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNyA9IDB4NDAwNzsKLQotCS8qIExpZ2h0UGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVCA9IDB4MTIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESUZGVVNFID0gMHgxMjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQRUNVTEFSID0gMHgxMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPU0lUSU9OID0gMHgxMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRElSRUNUSU9OID0gMHgxMjA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRVhQT05FTlQgPSAweDEyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9DVVRPRkYgPSAweDEyMDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gPSAweDEyMDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OID0gMHgxMjA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiA9IDB4MTIwOTsKLQotCS8qIEludGVybGVhdmVkQXJyYXlzICovCi0JLyogICAgICBHTF9WMkYgKi8KLQkvKiAgICAgIEdMX1YzRiAqLwotCS8qICAgICAgR0xfQzRVQl9WMkYgKi8KLQkvKiAgICAgIEdMX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9DM0ZfVjNGICovCi0JLyogICAgICBHTF9OM0ZfVjNGICovCi0JLyogICAgICBHTF9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX1Y0RiAqLwotCS8qICAgICAgR0xfVDJGX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9UMkZfQzNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX04zRl9WM0YgKi8KLQkvKiAgICAgIEdMX1QyRl9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX0M0Rl9OM0ZfVjRGICovCi0KLQkvKiBMaXN0TW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBJTEUgPSAweDEzMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUElMRV9BTkRfRVhFQ1VURSA9IDB4MTMwMTsKLQotCS8qIExpc3ROYW1lVHlwZSAqLwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMXzJfQllURVMgKi8KLQkvKiAgICAgIEdMXzNfQllURVMgKi8KLQkvKiAgICAgIEdMXzRfQllURVMgKi8KLQotCS8qIExvZ2ljT3AgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEVBUiA9IDB4MTUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQgPSAweDE1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX1JFVkVSU0UgPSAweDE1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09QWSA9IDB4MTUwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkRfSU5WRVJURUQgPSAweDE1MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUCA9IDB4MTUwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9YT1IgPSAweDE1MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1IgPSAweDE1MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9SID0gMHgxNTA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUlWID0gMHgxNTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCA9IDB4MTUwQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUl9SRVZFUlNFID0gMHgxNTBCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQgPSAweDE1MEM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQgPSAweDE1MEQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkFORCA9IDB4MTUwRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRVQgPSAweDE1MEY7Ci0KLQkvKiBNYXBUYXJnZXQgKi8KLQkvKiAgICAgIEdMX01BUDFfQ09MT1JfNCAqLwotCS8qICAgICAgR0xfTUFQMV9JTkRFWCAqLwotCS8qICAgICAgR0xfTUFQMV9OT1JNQUwgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF80ICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAyX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDJfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDJfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCi0JLyogTWF0ZXJpYWxGYWNlICovCi0JLyogICAgICBHTF9GUk9OVCAqLwotCS8qICAgICAgR0xfQkFDSyAqLwotCS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotCS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04gPSAweDE2MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTID0gMHgxNjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgPSAweDE2MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVhFUyA9IDB4MTYwMzsKLQkvKiAgICAgIEdMX0FNQklFTlQgKi8KLQkvKiAgICAgIEdMX0RJRkZVU0UgKi8KLQkvKiAgICAgIEdMX1NQRUNVTEFSICovCi0KLQkvKiBNYXRyaXhNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXID0gMHgxNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT04gPSAweDE3MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSA9IDB4MTcwMjsKLQotCS8qIE1lc2hNb2RlMSAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQotCS8qIE1lc2hNb2RlMiAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQkvKiAgICAgIEdMX0ZJTEwgKi8KLQotCS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0JLyogICAgICBHTF9CWVRFICovCi0JLyogICAgICBHTF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9GTE9BVCAqLwotCS8qICAgICAgR0xfRE9VQkxFICovCi0KLQkvKiBQaXhlbENvcHlUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1IgPSAweDE4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEggPSAweDE4MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTCA9IDB4MTgwMjsKLQotCS8qIFBpeGVsRm9ybWF0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVggPSAweDE5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWCA9IDB4MTkwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEID0gMHgxOTAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOID0gMHgxOTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMVUUgPSAweDE5MDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEEgPSAweDE5MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCID0gMHgxOTA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEgPSAweDE5MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFID0gMHgxOTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSA9IDB4MTkwQTsKLQotCS8qIFBpeGVsTWFwICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19JICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfU19UT19TICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19BICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfUl9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfR19UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQl9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQV9UT19BICovCi0KLQkvKiBQaXhlbFN0b3JlICovCi0JLyogICAgICBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfVU5QQUNLX1JPV19MRU5HVEggKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0FMSUdOTUVOVCAqLwotCS8qICAgICAgR0xfUEFDS19TV0FQX0JZVEVTICovCi0JLyogICAgICBHTF9QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfUEFDS19ST1dfTEVOR1RIICovCi0JLyogICAgICBHTF9QQUNLX1NLSVBfUk9XUyAqLwotCS8qICAgICAgR0xfUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfUEFDS19BTElHTk1FTlQgKi8KLQotCS8qIFBpeGVsVHJhbnNmZXIgKi8KLQkvKiAgICAgIEdMX01BUF9DT0xPUiAqLwotCS8qICAgICAgR0xfTUFQX1NURU5DSUwgKi8KLQkvKiAgICAgIEdMX0lOREVYX1NISUZUICovCi0JLyogICAgICBHTF9JTkRFWF9PRkZTRVQgKi8KLQkvKiAgICAgIEdMX1JFRF9TQ0FMRSAqLwotCS8qICAgICAgR0xfUkVEX0JJQVMgKi8KLQkvKiAgICAgIEdMX0dSRUVOX1NDQUxFICovCi0JLyogICAgICBHTF9HUkVFTl9CSUFTICovCi0JLyogICAgICBHTF9CTFVFX1NDQUxFICovCi0JLyogICAgICBHTF9CTFVFX0JJQVMgKi8KLQkvKiAgICAgIEdMX0FMUEhBX1NDQUxFICovCi0JLyogICAgICBHTF9BTFBIQV9CSUFTICovCi0JLyogICAgICBHTF9ERVBUSF9TQ0FMRSAqLwotCS8qICAgICAgR0xfREVQVEhfQklBUyAqLwotCi0JLyogUGl4ZWxUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQklUTUFQID0gMHgxQTAwOwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQotCS8qIFBvbHlnb25Nb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlQgPSAweDFCMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORSA9IDB4MUIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSUxMID0gMHgxQjAyOwotCi0JLyogUmVhZEJ1ZmZlck1vZGUgKi8KLQkvKiAgICAgIEdMX0ZST05UX0xFRlQgKi8KLQkvKiAgICAgIEdMX0ZST05UX1JJR0hUICovCi0JLyogICAgICBHTF9CQUNLX0xFRlQgKi8KLQkvKiAgICAgIEdMX0JBQ0tfUklHSFQgKi8KLQkvKiAgICAgIEdMX0ZST05UICovCi0JLyogICAgICBHTF9CQUNLICovCi0JLyogICAgICBHTF9MRUZUICovCi0JLyogICAgICBHTF9SSUdIVCAqLwotCS8qICAgICAgR0xfQVVYMCAqLwotCS8qICAgICAgR0xfQVVYMSAqLwotCS8qICAgICAgR0xfQVVYMiAqLwotCS8qICAgICAgR0xfQVVYMyAqLwotCi0JLyogUmVuZGVyaW5nTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUiA9IDB4MUMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GRUVEQkFDSyA9IDB4MUMwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1QgPSAweDFDMDI7Ci0KLQkvKiBTaGFkaW5nTW9kZWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTEFUID0gMHgxRDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USCA9IDB4MUQwMTsKLQotCS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotCS8qICAgICAgR0xfTkVWRVIgKi8KLQkvKiAgICAgIEdMX0xFU1MgKi8KLQkvKiAgICAgIEdMX0VRVUFMICovCi0JLyogICAgICBHTF9MRVFVQUwgKi8KLQkvKiAgICAgIEdMX0dSRUFURVIgKi8KLQkvKiAgICAgIEdMX05PVEVRVUFMICovCi0JLyogICAgICBHTF9HRVFVQUwgKi8KLQkvKiAgICAgIEdMX0FMV0FZUyAqLwotCi0JLyogU3RlbmNpbE9wICovCi0JLyogICAgICBHTF9aRVJPICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCA9IDB4MUUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBMQUNFID0gMHgxRTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IgPSAweDFFMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiA9IDB4MUUwMzsKLQkvKiAgICAgIEdMX0lOVkVSVCAqLwotCi0JLyogU3RyaW5nTmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFTkRPUiA9IDB4MUYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiA9IDB4MUYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OID0gMHgxRjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgPSAweDFGMDM7Ci0KLQkvKiBUZXh0dXJlQ29vcmROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUyA9IDB4MjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UID0gMHgyMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IgPSAweDIwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUSA9IDB4MjAwMzsKLQotCS8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIFRleHR1cmVFbnZNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9EVUxBVEUgPSAweDIxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDQUwgPSAweDIxMDE7Ci0JLyogICAgICBHTF9CTEVORCAqLwotCS8qICAgICAgR0xfUkVQTEFDRSAqLwotCi0JLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgPSAweDIyMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlZfQ09MT1IgPSAweDIyMDE7Ci0KLQkvKiBUZXh0dXJlRW52VGFyZ2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlYgPSAweDIzMDA7Ci0KLQkvKiBUZXh0dXJlR2VuTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9MSU5FQVIgPSAweDI0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX0xJTkVBUiA9IDB4MjQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUEhFUkVfTUFQID0gMHgyNDAyOwotCi0JLyogVGV4dHVyZUdlblBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgPSAweDI1MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX1BMQU5FID0gMHgyNTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9QTEFORSA9IDB4MjUwMjsKLQotCS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUID0gMHgyNjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUiA9IDB4MjYwMTsKLQotCS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLQkvKiAgICAgIEdMX05FQVJFU1QgKi8KLQkvKiAgICAgIEdMX0xJTkVBUiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgPSAweDI3MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUID0gMHgyNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMzsKLQotCS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiA9IDB4MjgwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfUyA9IDB4MjgwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwMzsKLQkvKiAgICAgIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SICovCi0JLyogICAgICBHTF9URVhUVVJFX1BSSU9SSVRZICovCi0KLQkvKiBUZXh0dXJlVGFyZ2V0ICovCi0JLyogICAgICBHTF9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9URVhUVVJFXzJEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzJEICovCi0KLQkvKiBUZXh0dXJlV3JhcE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEFNUCA9IDB4MjkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBFQVQgPSAweDI5MDE7Ci0KLQkvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogQ2xpZW50QXR0cmliTWFzayAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQgPSAweDAwMDAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTID0gMHhmZmZmZmZmZjsKLQotCS8qIHBvbHlnb25fb2Zmc2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SID0gMHg4MDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTID0gMHgyQTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UID0gMHgyQTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgPSAweDJBMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCA9IDB4ODAzNzsKLQotCS8qIHRleHR1cmUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQTQgPSAweDgwM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEE4ID0gMHg4MDNDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBMTIgPSAweDgwM0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEExNiA9IDB4ODAzRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0U0ID0gMHg4MDNGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTggPSAweDgwNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTIgPSAweDgwNDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTYgPSAweDgwNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNF9BTFBIQTQgPSAweDgwNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNl9BTFBIQTIgPSAweDgwNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFOF9BTFBIQTggPSAweDgwNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTJfQUxQSEE0ID0gMHg4MDQ2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTEyX0FMUEhBMTIgPSAweDgwNDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTZfQUxQSEExNiA9IDB4ODA0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFkgPSAweDgwNDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URU5TSVRZNCA9IDB4ODA0QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFk4ID0gMHg4MDRCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTEyID0gMHg4MDRDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTE2ID0gMHg4MDREOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IzX0czX0IyID0gMHgyQTEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjQgPSAweDgwNEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNSA9IDB4ODA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I4ID0gMHg4MDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEwID0gMHg4MDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEyID0gMHg4MDUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjE2ID0gMHg4MDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEyID0gMHg4MDU1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0ID0gMHg4MDU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTEgPSAweDgwNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTggPSAweDgwNTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCMTBfQTIgPSAweDgwNTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTEyID0gMHg4MDVBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkExNiA9IDB4ODA1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFRF9TSVpFID0gMHg4MDVDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR1JFRU5fU0laRSA9IDB4ODA1RDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JMVUVfU0laRSA9IDB4ODA1RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0FMUEhBX1NJWkUgPSAweDgwNUY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSA9IDB4ODA2MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFID0gMHg4MDYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST1hZX1RFWFRVUkVfMUQgPSAweDgwNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPWFlfVEVYVFVSRV8yRCA9IDB4ODA2NDsKLQotCS8qIHRleHR1cmVfb2JqZWN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9QUklPUklUWSA9IDB4ODA2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFU0lERU5UID0gMHg4MDY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR18xRCA9IDB4ODA2ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgPSAweDgwNjk7Ci0KLQkvKiB2ZXJ0ZXhfYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVkgPSAweDgwNzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZID0gMHg4MDc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZID0gMHg4MDc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZID0gMHg4MDc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFID0gMHg4MDdBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9UWVBFID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgPSAweDgwN0M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgPSAweDgwN0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSA9IDB4ODA3RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFID0gMHg4MDgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1RZUEUgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFID0gMHg4MDgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1RZUEUgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFID0gMHg4MDg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgPSAweDgwODk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgPSAweDgwOEE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERSA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSID0gMHg4MDkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1BPSU5URVIgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSID0gMHg4MDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSID0gMHg4MDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1YyRiA9IDB4MkEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WM0YgPSAweDJBMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WMkYgPSAweDJBMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WM0YgPSAweDJBMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzNGX1YzRiA9IDB4MkEyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OM0ZfVjNGID0gMHgyQTI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0M0Rl9OM0ZfVjNGID0gMHgyQTI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1QyRl9WM0YgPSAweDJBMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDRGX1Y0RiA9IDB4MkEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UMkZfQzRVQl9WM0YgPSAweDJBMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0MzRl9WM0YgPSAweDJBMkE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX04zRl9WM0YgPSAweDJBMkI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0M0Rl9OM0ZfVjNGID0gMHgyQTJDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1Q0Rl9DNEZfTjNGX1Y0RiA9IDB4MkEyRDsKLQotCS8qIEV4dGVuc2lvbnMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfdmVydGV4X2FycmF5ID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfYmdyYSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zd2FwX2hpbnQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9kcmF3X3JhbmdlX2VsZW1lbnRzID0gMTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XSU5fcGhvbmdfc2hhZGluZyAgICAgICAgICAgICAgPSAxOwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zcGVjdWxhcl9mb2cgICAgICAgICAgICAgICA9IDE7Ci0KLQkvKiBFWFRfdmVydGV4X2FycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX0VYVCA9IDB4ODA3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfRVhUID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0VYVCA9IDB4ODA3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9FWFQgPSAweDgwNzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9FWFQgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCA9IDB4ODA3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgPSAweDgwN0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwN0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRV9FWFQgPSAweDgwODE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUID0gMHg4MDg5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0NPVU5UX0VYVCA9IDB4ODA4QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUID0gMHg4MDhEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA5MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFX0VYVCA9IEdMX0RPVUJMRTsKLQotCS8qIEVYVF9iZ3JhICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkdSX0VYVCA9IDB4ODBFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CR1JBX0VYVCA9IDB4ODBFMTsKLQotCS8qIEVYVF9wYWxldHRlZF90ZXh0dXJlICovCi0KLQkvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBHTF9DT0xPUl9UQUJMRV8qX1NHSSBlbnVtZXJhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfRk9STUFUX0VYVCA9IDB4ODBEODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9UQUJMRV9XSURUSF9FWFQgPSAweDgwRDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfRVhUID0gMHg4MERBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfRVhUID0gMHg4MERCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9FWFQgPSAweDgwREM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9FWFQgPSAweDgwREQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfRVhUID0gMHg4MERFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX0VYVCA9IDB4ODBERjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYMV9FWFQgPSAweDgwRTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgyX0VYVCA9IDB4ODBFMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9JTkRFWDRfRVhUID0gMHg4MEU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYOF9FWFQgPSAweDgwRTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxMl9FWFQgPSAweDgwRTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxNl9FWFQgPSAweDgwRTc7Ci0KLQkvKiBXSU5fZHJhd19yYW5nZV9lbGVtZW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFU19XSU4gPSAweDgwRTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVNfV0lOID0gMHg4MEU5OwotCi0JLyogV0lOX3Bob25nX3NoYWRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSE9OR19XSU4gPSAweDgwRUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEhPTkdfSElOVF9XSU4gPSAweDgwRUI7Ci0KLQkvKiBXSU5fc3BlY3VsYXJfZm9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOID0gMHg4MEVDOwotCi0JLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuR0wgdjEuMCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QID0gR0xfSU5ERVhfTE9HSUNfT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT01QT05FTlRTID0gR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQWNjdW0gKGludCBvcCwgZmxvYXQgdmFsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xBbHBoYUZ1bmMgKGludCBmdW5jLCBmbG9hdCByZWYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGJvb2xlYW5bXSByZXNpZGVuY2VzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQXJyYXlFbGVtZW50IChpbnQgaW5kZXgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xCZWdpbiAoaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFbmQgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpbmRUZXh0dXJlIChpbnQgdGFyZ2V0LCBpbnQgdGV4dHVyZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpdG1hcCAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCB4b3JpZywgZmxvYXQgeW9yaWcsIGZsb2F0IHhtb3ZlLCBmbG9hdCB5bW92ZSwgYnl0ZVtdIGJpdG1hcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuYyAoaW50IHNmYWN0b3IsIGludCBkZmFjdG9yKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3QgKGludCBsaXN0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3RzIChpbnQgbiwgaW50IHR5cGUsIGJ5dGVbXSBsaXN0cyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENhbGxMaXN0cyAoaW50IG4sIGludCB0eXBlLCBjaGFyW10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDYWxsTGlzdHMgKGludCBuLCBpbnQgdHlwZSwgaW50W10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhciAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhckFjY3VtIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3IgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJEZXB0aCAoZG91YmxlIGRlcHRoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJJbmRleCAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyU3RlbmNpbCAoaW50IHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmUgKGludCBwbGFuZSwgZG91YmxlW10gZXF1YXRpb24pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNiIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZCAoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM2YgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNpIChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzcyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3ViIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjN1cyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRkIChkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUsIGludCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNHMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1aSAoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWJ2IChieXRlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0aXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hc2sgKGJvb2xlYW4gcmVkLCBib29sZWFuIGdyZWVuLCBib29sZWFuIGJsdWUsIGJvb2xlYW4gYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hdGVyaWFsIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclBvaW50ZXIgKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3JUYWJsZUVYVCAoaW50IHRhcmdldCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBkYXRhKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclN1YlRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGZvcm1hdCwgaW50IHR5cGUsIGludFtdIGRhdGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5UGl4ZWxzIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHR5cGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4SW1hZ2UxRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxGb3JtYXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgYm9yZGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29weVRleEltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCk7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ3VsbEZhY2UgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVsZXRlTGlzdHMgKGludCBsaXN0LCBpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhGdW5jIChpbnQgZnVuYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERlcHRoTWFzayAoYm9vbGVhbiBmbGFnKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhSYW5nZSAoZG91YmxlIHpuZWFyLCBkb3VibGUgemZhcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMgKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdCdWZmZXIgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRHJhd0VsZW1lbnRzIChpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgdHlwZSwgaW50W10gaW5kaWNlcyk7IC8qIE1VTFRJUExFUyBUWVBFUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEcmF3UGl4ZWxzIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRWRnZUZsYWcgKGJvb2xlYW4gZmxhZyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVkZ2VGbGFndiAoYm9vbGVhbltdIGZsYWcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFZGdlRmxhZ1BvaW50ZXIgKGludCBzdHJpZGUsIGJvb2xlYW5bXSBwb2ludGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRW5hYmxlIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGlzYWJsZSAoaW50IGNhcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlIChpbnQgYXJyYXkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKGludCBhcnJheSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFkIChkb3VibGUgdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFmIChmbG9hdCB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMmQgKGRvdWJsZSB1LCBkb3VibGUgdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDJmIChmbG9hdCB1LCBmbG9hdCB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWR2IChkb3VibGVbXSB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWZ2IChmbG9hdFtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZHYgKGRvdWJsZVtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZnYgKGZsb2F0W10gdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxNZXNoMSAoaW50IG1vZGUsIGludCBpMSwgaW50IGkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbE1lc2gyIChpbnQgbW9kZSwgaW50IGkxLCBpbnQgaTIsIGludCBqMSwgaW50IGoyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbFBvaW50MSAoaW50IGkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsUG9pbnQyIChpbnQgaSwgaW50IGopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGZWVkYmFja0J1ZmZlciAoaW50IHNpemUsIGludCB0eXBlLCBmbG9hdFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZpbmlzaCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRmx1c2ggKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2YgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGb2dpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2Z2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRm9naXYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRnJvbnRGYWNlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZydXN0dW0gKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3AsIGRvdWJsZSB6bmVhciwgZG91YmxlIHpmYXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbEdlbkxpc3RzIChpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZW5UZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYgKGludCBwbmFtZSwgYm9vbGVhbltdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldERvdWJsZXYgKGludCBwbmFtZSwgZG91YmxlW10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0RmxvYXR2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0SW50ZWdlcnYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5lIChpbnQgcGxhbmUsIGRvdWJsZVtdIGVxdWF0aW9uKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gZGF0YSk7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRFcnJvciAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldE1hcGR2IChpbnQgdGFnZXJ0LCBpbnQgcXVlcnksIGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBmdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBpdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWxmdiAoaW50IGZhY2UsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXRlcmlhbGl2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcGZ2IChpbnQgbWFwLCBmbG9hdFtdIHZhbHVlcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFBpeGVsTWFwdWl2IChpbnQgbWFwLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcHVzdiAoaW50IG1hcCwgc2hvcnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQb2ludGVydiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCS8qIFRFU1QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0UG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRTdHJpbmcgKGludCBuYW1lKTsKLQkvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleEVudmZ2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhJbWFnZSAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyaXYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEhpbnQgKGludCB0YXJnZXQsIGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhkIChkb3VibGUgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4ZiAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4aSAoaW50IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleHMgKHNob3J0IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleGR2IChkb3VibGVbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhmdiAoZmxvYXRbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhpdiAoaW50W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4c3YgKHNob3J0W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4TWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsKLQkvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5pdE5hbWVzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbnRlcmxlYXZlZEFycmF5cyAoaW50IGZvcm1hdCwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLyogQ0hFQ0sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNFbmFibGVkIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNMaXN0IChpbnQgbGlzdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbElzVGV4dHVyZSAoaW50IHRleHR1cmUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0aSAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGZ2IChpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRNb2RlbGYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZnYgKGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxpdiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpbmVTdGlwcGxlIChpbnQgZmFjdG9yLCBzaG9ydCBwYXR0ZXJuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoIChmbG9hdCB3aWR0aCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpc3RCYXNlIChpbnQgYmFzZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExvYWRJZGVudGl0eSAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGQgKGRvdWJsZVtdIG0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZiAoZmxvYXRbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE5hbWUgKGludCBuYW1lKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9naWNPcCAoaW50IG9wY29kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE1hcDFkIChpbnQgdGFyZ2V0LCBkb3VibGUgdTEsIGRvdWJsZSB1MiwgaW50IHN0cmlkZSwgaW50IG9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAxZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgc3RyaWRlLCBpbnQgb3JkZXIsIGZsb2F0W10gcG9pbnRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwMmQgKGludCB0YXJnZXQsIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZG91YmxlIHYxLCBkb3VibGUgdjIsIGludCB2c3RyaWRlLCBpbnQgdm9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAyZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZmxvYXQgdjEsIGZsb2F0IHYyLCBpbnQgdnN0cmlkZSwgaW50IHZvcmRlciwgZmxvYXRbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWQgKGludCB1biwgZG91YmxlIHUxLCBkb3VibGUgdTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWYgKGludCB1biwgZmxvYXQgdTEsIGZsb2F0IHUyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJkIChpbnQgdW4sIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdm0sIGRvdWJsZSB2MSwgZG91YmxlIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJmIChpbnQgdW4sIGZsb2F0IHUxLCBmbG9hdCB1MiwgaW50IHZtLCBmbG9hdCB2MSwgZmxvYXQgdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGYgKGludCBmYWNlLCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpIChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGZ2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpdiAoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXhkIChkb3VibGVbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYgKGZsb2F0W10gbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5ld0xpc3QgKGludCBsaXN0LCBpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuZExpc3QgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNiIChieXRlIG54LCBieXRlIG55LCBieXRlIG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2QgKGRvdWJsZSBueCwgZG91YmxlIG55LCBkb3VibGUgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzZiAoZmxvYXQgbngsIGZsb2F0IG55LCBmbG9hdCBueik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNpIChpbnQgbngsIGludCBueSwgaW50IG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM3MgKHNob3J0IG54LCBzaG9ydCBueSwgc2hvcnQgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE9ydGhvIChkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLCBkb3VibGUgdG9wLCBkb3VibGUgem5lYXIsIGRvdWJsZSB6ZmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGFzc1Rocm91Z2ggKGZsb2F0IHRva2VuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXBmdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIGZsb2F0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXB1aXYgKGludCBtYXAsIGludCBtYXBzaXplLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbE1hcHVzdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIHNob3J0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxTdG9yZWYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFN0b3JlaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFRyYW5zZmVyZiAoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsVHJhbnNmZXJpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsWm9vbSAoZmxvYXQgeGZhY3RvciwgZmxvYXQgeWZhY3Rvcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvaW50U2l6ZSAoZmxvYXQgc2l6ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvbHlnb25Nb2RlIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0IChmbG9hdCBmYWN0b3IsIGZsb2F0IHVuaXRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHJpb3JpdGl6ZVRleHR1cmVzIChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGZsb2F0W10gcHJpb3JpdGllcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFB1c2hBdHRyaWIgKGludCBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wQXR0cmliICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoQ2xpZW50QXR0cmliIChpbnQgbWFzayk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvcENsaWVudEF0dHJpYiAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHVzaE1hdHJpeCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wTWF0cml4ICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoTmFtZSAoaW50IG5hbWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb3BOYW1lICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZCAoZG91YmxlIHgsIGRvdWJsZSB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMmYgKGZsb2F0IHgsIGZsb2F0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyaSAoaW50IHgsIGludCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMnMgKHNob3J0IHgsIHNob3J0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczNmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2kgKGludCB4LCBpbnQgeSwgaW50IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzcyAoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGkgKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHMgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3Mzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWFkQnVmZmVyIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlYWRQaXhlbHMgKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RkIChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZiAoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aSAoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdHMgKHNob3J0IHgxLCBzaG9ydCB5MSwgc2hvcnQgeDIsIHNob3J0IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdGR2IChkb3VibGVbXSB2MSwgZG91YmxlW10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZnYgKGZsb2F0W10gdjEsIGZsb2F0W10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aXYgKGludFtdIHYxLCBpbnRbXSB2Mik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RzdiAoc2hvcnRbXSB2LCBzaG9ydFtdIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xSZW5kZXJNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWQgKGRvdWJsZSBhbmdsZSwgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWYgKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2Npc3NvciAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludCBidWZmZXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTaGFkZU1vZGVsIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxGdW5jIChpbnQgZnVuYywgaW50IHJlZiwgaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsT3AgKGludCBmYWlsLCBpbnQgemZhaWwsIGludCB6cGFzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWQgKGRvdWJsZSBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZiAoZmxvYXQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWkgKGludCBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxcyAoc2hvcnQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmQgKGRvdWJsZSBzLCBkb3VibGUgdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmYgKGZsb2F0IHMsIGZsb2F0IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJpIChpbnQgcywgaW50IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJzIChzaG9ydCBzLCBzaG9ydCB0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZCAoZG91YmxlIHMsIGRvdWJsZSB0LCBkb3VibGUgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2YgKGZsb2F0IHMsIGZsb2F0IHQsIGZsb2F0IHIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDNpIChpbnQgcywgaW50IHQsIGludCByKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzcyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGQgKGRvdWJsZSBzLCBkb3VibGUgdCwgZG91YmxlIHIsIGRvdWJsZSBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZiAoZmxvYXQgcywgZmxvYXQgdCwgZmxvYXQgciwgZmxvYXQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGkgKGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0cyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgciwgc2hvcnQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMml2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0c3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkUG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLypNVUxUSVBMRVMgQVJSQVlTIC0gQ0hFQ0sgTVNESywgQ09VTlQgUEFSQU0gTUlTU0lORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEVudml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEdlbmQgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGUgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mIChpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5pIChpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTJEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIHBpeGVscyk7IC8qIE1VTFRJUExFUyBBUlJBWVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmkgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRyYW5zbGF0ZWQgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUcmFuc2xhdGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmQgKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJmIChmbG9hdCB4LCBmbG9hdCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmkgKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJzIChzaG9ydCB4LCBzaG9ydCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2QgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgzZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNpIChpbnQgeCwgaW50IHksIGludCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3MgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpIChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzIChzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB6LCBzaG9ydCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmZ2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3N2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4UG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWaWV3cG9ydCAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0xVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMxZTMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi0KLXB1YmxpYyBjbGFzcyBHTFUgewotCi0JLyogVmVyc2lvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJTSU9OXzFfMSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1ZFUlNJT05fMV8yID0gMTsKLQkKLQkvKiBFcnJvcnM6IChyZXR1cm4gdmFsdWUgMCA9IG5vIGVycm9yKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlZBTElEX0VOVU0gPSAxMDA5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOVkFMSURfVkFMVUUgPSAxMDA5MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVF9PRl9NRU1PUlkgPSAxMDA5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOQ09NUEFUSUJMRV9HTF9WRVJTSU9OID0gMTAwOTAzOwotCQotCS8qIFN0cmluZ05hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVkVSU0lPTiA9IDEwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURU5TSU9OUyA9IDEwMDgwMTsKLQkKLQkKLQkvKioqKiAgICAgICAgICAgUXVhZHJpYyBjb25zdGFudHMgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIFF1YWRyaWNOb3JtYWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU01PT1RIID0gMTAwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9GTEFUID0gMTAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OT05FID0gMTAwMDAyOwotCQotCS8qIFF1YWRyaWNEcmF3U3R5bGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUE9JTlQgPSAxMDAwMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0xJTkUgPSAxMDAwMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0ZJTEwgPSAxMDAwMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1NJTEhPVUVUVEUgPSAxMDAwMTM7Ci0JCi0JLyogUXVhZHJpY09yaWVudGF0aW9uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVFNJREUgPSAxMDAwMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOU0lERSA9IDEwMDAyMTsKLQkKLQkvKiBDYWxsYmFjayB0eXBlczogKi8KLQkvKiAgICAgIEdMVV9FUlJPUiAgICAgICAgICAgICAgIDEwMDEwMyAqLwotCQotCQotCS8qKioqICAgICAgICAgICBUZXNzZWxhdGlvbiBjb25zdGFudHMgICAgICAgICAgICoqKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgR0xVX1RFU1NfTUFYX0NPT1JEID0gMS4wZTE1MDsKLQkKLQkvKiBUZXNzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX1JVTEUgPSAxMDAxNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQk9VTkRBUllfT05MWSA9IDEwMDE0MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19UT0xFUkFOQ0UgPSAxMDAxNDI7Ci0JCi0JLyogVGVzc1dpbmRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX09ERCA9IDEwMDEzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05PTlpFUk8gPSAxMDAxMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfV0lORElOR19QT1NJVElWRSA9IDEwMDEzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05FR0FUSVZFID0gMTAwMTMzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1dJTkRJTkdfQUJTX0dFUV9UV08gPSAxMDAxMzQ7Ci0JCi0JLyogVGVzc0NhbGxiYWNrICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQkVHSU4gPSAxMDAxMDA7ICAvKiB2b2lkIChDQUxMQkFDSyopKEdMZW51bSAgICB0eXBlKSAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19WRVJURVggPSAxMDAxMDE7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQgICAgICAqZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FTkQgPSAxMDAxMDI7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQpICAgICAgICAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUiA9IDEwMDEwMzsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xlbnVtICAgIGVycm5vKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBRyA9IDEwMDEwNDsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xib29sZWFuIGJvdW5kYXJ5RWRnZSkgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09NQklORSA9IDEwMDEwNTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0KSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19CRUdJTl9EQVRBID0gMTAwMTA2OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgdHlwZSwgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1ZFUlRFWF9EQVRBID0gMTAwMTA3OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKmRhdGEsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VORF9EQVRBID0gMTAwMTA4OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKnBvbHlnb25fZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUl9EQVRBID0gMTAwMTA5OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgZXJybm8sIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBR19EQVRBID0gMTAwMTEwOyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGJvb2xlYW4gYm91bmRhcnlFZGdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0NPTUJJTkVfREFUQSA9IDEwMDExMTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCQotCS8qIFRlc3NFcnJvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SMSA9IDEwMDE1MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjIgPSAxMDAxNTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1IzID0gMTAwMTUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNCA9IDEwMDE1NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjUgPSAxMDAxNTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1I2ID0gMTAwMTU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNyA9IDEwMDE1NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjggPSAxMDAxNTg7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfTUlTU0lOR19CRUdJTl9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfQkVHSU5fQ09OVE9VUiA9IEdMVV9URVNTX0VSUk9SMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19NSVNTSU5HX0VORF9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfRU5EX0NPTlRPVVIgPSBHTFVfVEVTU19FUlJPUjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09PUkRfVE9PX0xBUkdFID0gR0xVX1RFU1NfRVJST1I1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX05FRURfQ09NQklORV9DQUxMQkFDSyA9IEdMVV9URVNTX0VSUk9SNjsKLQkKLQkvKioqKiAgICAgICAgICAgTlVSQlMgY29uc3RhbnRzICAgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIE51cmJzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQVVUT19MT0FEX01BVFJJWCA9IDEwMDIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ1VMTElORyA9IDEwMDIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU0FNUExJTkdfVE9MRVJBTkNFID0gMTAwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9ESVNQTEFZX01PREUgPSAxMDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfVE9MRVJBTkNFID0gMTAwMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9TQU1QTElOR19NRVRIT0QgPSAxMDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VfU1RFUCA9IDEwMDIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVl9TVEVQID0gMTAwMjA3OwotCQotCS8qIE51cmJzU2FtcGxpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUEFUSF9MRU5HVEggPSAxMDAyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfRVJST1IgPSAxMDAyMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0RPTUFJTl9ESVNUQU5DRSA9IDEwMDIxNzsKLQkKLQkKLQkvKiBOdXJic1RyaW0gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTUFQMV9UUklNXzIgPSAxMDAyMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX01BUDFfVFJJTV8zID0gMTAwMjExOwotCQotCS8qIE51cmJzRGlzcGxheSAqLwotCS8qICAgICAgR0xVX0ZJTEwgICAgICAgICAgICAgICAgMTAwMDEyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVExJTkVfUE9MWUdPTiA9IDEwMDI0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfT1VUTElORV9QQVRDSCA9IDEwMDI0MTsKLQkKLQkvKiBOdXJic0NhbGxiYWNrICovCi0JLyogICAgICBHTFVfRVJST1IgICAgICAgICAgICAgICAxMDAxMDMgKi8KLQkKLQkvKiBOdXJic0Vycm9ycyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEgPSAxMDAyNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SMiA9IDEwMDI1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1IzID0gMTAwMjUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjQgPSAxMDAyNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SNSA9IDEwMDI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I2ID0gMTAwMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjcgPSAxMDAyNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SOCA9IDEwMDI1ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I5ID0gMTAwMjU5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEwID0gMTAwMjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjExID0gMTAwMjYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEyID0gMTAwMjYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEzID0gMTAwMjYzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE0ID0gMTAwMjY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE1ID0gMTAwMjY1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE2ID0gMTAwMjY2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE3ID0gMTAwMjY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE4ID0gMTAwMjY4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE5ID0gMTAwMjY5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIwID0gMTAwMjcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIxID0gMTAwMjcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIyID0gMTAwMjcyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIzID0gMTAwMjczOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI0ID0gMTAwMjc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI1ID0gMTAwMjc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI2ID0gMTAwMjc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI3ID0gMTAwMjc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI4ID0gMTAwMjc4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI5ID0gMTAwMjc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMwID0gMTAwMjgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMxID0gMTAwMjgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMyID0gMTAwMjgyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMzID0gMTAwMjgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM0ID0gMTAwMjg0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM1ID0gMTAwMjg1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM2ID0gMTAwMjg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM3ID0gMTAwMjg3OwotCQotCS8qIENvbnRvdXJzIHR5cGVzIC0tIG9ic29sZXRlISAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9DVyA9IDEwMDEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ0NXID0gMTAwMTIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlRFUklPUiA9IDEwMDEyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURVJJT1IgPSAxMDAxMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VOS05PV04gPSAxMDAxMjQ7Ci0JCi0JLyogTmFtZXMgd2l0aG91dCAiVEVTU18iIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9CRUdJTiA9IEdMVV9URVNTX0JFR0lOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJURVggPSBHTFVfVEVTU19WRVJURVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0VORCA9IEdMVV9URVNTX0VORDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVJST1IgPSBHTFVfVEVTU19FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRURHRV9GTEFHID0gR0xVX1RFU1NfRURHRV9GTEFHOwotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5DdXJ2ZSAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kQ3VydmUgKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUJlZ2luUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5TdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVFbmRTdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVCZWdpblRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUVuZFRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQxRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50IGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQyRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUN5bGluZGVyIChpbnQgcW9iaiwgZG91YmxlIGJhc2VSYWRpdXMsIGRvdWJsZSB0b3BSYWRpdXMsIGRvdWJsZSBoZWlnaHQsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlciAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlUXVhZHJpYyAoaW50IHFvYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlVGVzcyAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGlzayAoaW50IHFvYmosIGRvdWJsZSBpbm5lclJhZGl1cywgZG91YmxlIG91dGVyUmFkaXVzLCBpbnQgc2xpY2VzLCBpbnQgbG9vcHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVFcnJvclN0cmluZyAoaW50IGVyckNvZGUpOyAgLyogU0hPVUxEIFJFVFVSTiBBIFNUUklORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1R2V0TnVyYnNQcm9wZXJ0eSAoaW50IG5vYmosIGludCBwcm9wZXJ0eSwgZmxvYXRbXSB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdUdldFN0cmluZyAoaW50IG5hbWUpOyAvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVHZXRUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGRvdWJsZVtdIHZhbHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIChpbnQgbm9iaiwgZmxvYXRbXSBtb2RlbE1hdHJpeCwgZmxvYXRbXSBwcm9qTWF0cml4LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVMb29rQXQgKGRvdWJsZSBleWV4LCBkb3VibGUgZXlleSwgZG91YmxlIGV5ZXosIGRvdWJsZSBjZW50ZXJ4LCBkb3VibGUgY2VudGVyeSwgZG91YmxlIGNlbnRlcnosIGRvdWJsZSB1cHgsIGRvdWJsZSB1cHksIGRvdWJsZSB1cHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdOdXJic1JlbmRlcmVyICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdRdWFkcmljICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdUZXNzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TmV4dENvbnRvdXIgKGludCB0ZXNzLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic0NhbGxiYWNrIChpbnQgbm9iaiwgaW50IHdoaWNoLCBpbnQgZm4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TnVyYnNDdXJ2ZSAoaW50IG5vYmosIGludCBua25vdHMsIGZsb2F0W10ga25vdCwgaW50IHN0cmlkZSwgZmxvYXRbXSBjdGxhcnJheSwgaW50IG9yZGVyLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1Byb3BlcnR5IChpbnQgbm9iaiwgaW50IHByb3BlcnR5LCBmbG9hdCB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1N1cmZhY2UgKGludCBub2JqLCBpbnQgc2tub3RfY291bnQsIGZsb2F0W10gc2tub3QsIGludCB0a25vdF9jb3VudCwgZmxvYXRbXSB0a25vdCwgaW50IHNfc3RyaWRlLCBpbnQgdF9zdHJpZGUsIGZsb2F0W10gY3RsYXJyYXksIGludCBzb3JkZXIsIGludCB0b3JkZXIsIGludCB0eXBlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdU9ydGhvMkQgKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3ApOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGFydGlhbERpc2sgKGludCBxb2JqLCBkb3VibGUgaW5uZXJSYWRpdXMsIGRvdWJsZSBvdXRlclJhZGl1cywgaW50IHNsaWNlcywgaW50IGxvb3BzLCBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIHN3ZWVwQW5nbGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGVyc3BlY3RpdmUgKGRvdWJsZSBmb3Z5LCBkb3VibGUgYXNwZWN0LCBkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVBpY2tNYXRyaXggKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVByb2plY3QgKGRvdWJsZSBvYmp4LCBkb3VibGUgb2JqeSwgZG91YmxlIG9ianosZG91YmxlW10gbW9kZWxNYXRyaXgsIGRvdWJsZVtdIHByb2pNYXRyaXgsIGludFtdIHZpZXdwb3J0LCBkb3VibGVbXSB3aW54LCBkb3VibGVbXSB3aW55LCBkb3VibGVbXSB3aW56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVB3bEN1cnZlIChpbnQgbm9iaiwgaW50IGNvdW50LCBmbG9hdFtdIGFycmF5LCBpbnQgc3RyaWRlLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljQ2FsbGJhY2sgKGludCBxb2JqLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljRHJhd1N0eWxlIChpbnQgcW9iaiwgaW50IGRyYXdTdHlsZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljTm9ybWFscyAoaW50IHFvYmosIGludCBub3JtYWxzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVF1YWRyaWNPcmllbnRhdGlvbiAoaW50IHFvYmosIGludCBvcmllbnRhdGlvbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljVGV4dHVyZSAoaW50IHFvYmosIGJvb2xlYW4gdGV4dHVyZUNvb3Jkcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVNjYWxlSW1hZ2UgKGludCBmb3JtYXQsIGludCB3aWR0aGluLCBpbnQgaGVpZ2h0aW4sIGludCB0eXBlaW4sIGludCBkYXRhaW4sIGludCB3aWR0aG91dCwgaW50IGhlaWdodG91dCwgaW50IHR5cGVvdXQsIGludCBkYXRhb3V0KTsgLypNVUxUSVBMRVMgVFlQRVMgQVJSQVlTKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVNwaGVyZSAoaW50IHFvYmosIGRvdWJsZSByYWRpdXMsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0JlZ2luQ29udG91ciAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0VuZENvbnRvdXIgKGludCB0ZXNzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NCZWdpblBvbHlnb24gKGludCB0ZXNzLCBpbnQgcG9seWdvbl9kYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NFbmRQb2x5Z29uIChpbnQgdGVzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzQ2FsbGJhY2sgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzTm9ybWFsIChpbnQgdGVzcywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgcHJvcGVydHksIGRvdWJsZSB2YWx1ZSk7IC8qIENIRUNLIE1TRE4sIFZBTFVFJ1MgVFlQRSBJUyBET1VCTEUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NWZXJ0ZXggKGludCB0ZXNzLCBkb3VibGVbXSBjb29yZHMsIGludCBkYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1VW5Qcm9qZWN0IChkb3VibGUgd2lueCwgZG91YmxlIHdpbnksIGRvdWJsZSB3aW56LCBkb3VibGVbXSBtb2RlbE1hdHJpeCwgZG91YmxlW10gcHJvak1hdHJpeCwgaW50W10gdmlld3BvcnQsIGRvdWJsZVtdIG9iangsIGRvdWJsZVtdIG9ianksIGRvdWJsZVtdIG9ianopOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmMTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotLyoqCi0gKiBUaGUgR0xEYXRhIGNsYXNzIGlzIGEgZGV2aWNlLWluZGVwZW5kZW50IGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgcGl4ZWwgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBHTCBkcmF3YWJsZS4KLSAqCi0gKiBAc2VlIEdMQ2FudmFzCi0gKi8KLQotcHVibGljIGNsYXNzIEdMRGF0YSB7Ci0JLyoqCi0JICogU3BlY2lmaWVzIGEgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dAotCSAqIGNyZWF0aW9uLCBvbmx5IGRvdWJsZS1idWZmZXJlZCBmb3JtYXRzIGFyZSBjb25zaWRlcmVkCi0JICogd2hlbiBzZXQgdG8gdHJ1ZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG91YmxlQnVmZmVyOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGEgc3RlcmVvIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwKLQkgKiBvbmx5IHN0ZXJlbyBmb3JtYXRzIGFyZSBjb25zaWRlcmVkIHdoZW4gc2V0IHRvIHRydWUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0ZXJlbzsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIHJlZCBjaGFubmVsLgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGdyZWVuIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGJsdWUgY2hhbm5lbC4KLQkgKiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlIG1pbmltdW0KLQkgKiByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBibHVlU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGFscGhhIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFscGhhU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGRlcHRoIGJ1ZmZlci4gIER1cmluZyBjb250ZXh0Ci0JICogY3JlYXRpb24sIHRoZSBzbWFsbGVzdCBkZXB0aCBidWZmZXIgb2YgYXQgbGVhc3QgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3Igbm8gZGVwdGgKLQkgKiBidWZmZXIuCi0JICovCi0JcHVibGljIGludCBkZXB0aFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgZGVzaXJlZCBudW1iZXIgb2Ygc3RlbmNpbCBiaXRwbGFuZXMuICBEdXJpbmcKLQkgKiBjb250ZXh0IGNyZWF0aW9uLCB0aGUgc21hbGxlc3Qgc3RlbmNpbCBidWZmZXIgb2YgYXQKLQkgKiBsZWFzdCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3IKLQkgKiBubyBzdGVuY2lsIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgaW50IHN0ZW5jaWxTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIHJlZAotCSAqIGNoYW5uZWwuIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUKLQkgKiBtaW5pbXVtIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgYWNjdW1SZWRTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGdyZWVuCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtR3JlZW5TaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGJsdWUKLQkgKiBjaGFubmVsLiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlCi0JICogbWluaW11bSByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBhY2N1bUJsdWVTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGFscGhhCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtQWxwaGFTaXplOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHVzZWQgYnkgdGhpcyBjb250ZXh0LgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgaW50IHNhbXBsZUJ1ZmZlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYWNjZXB0ZWQgaW4gdGhlIG11bHRpc2FtcGxlIGJ1ZmZlci4KLQkgKiBEdXJpbmcgY3JlYXRpb24sIHBpeGVsIGZvcm1hdHMgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCi0JICogc2FtcGxlcyB0aGF0IG1lZXRzIG9yIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBtaW5pbXVtIG51bWJlcgotCSAqIGFyZSBwcmVmZXJyZWQuCi0JICovCi0JcHVibGljIGludCBzYW1wbGVzOwotCQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gKGRvdWJsZUJ1ZmZlciA/ICJkb3VibGVCdWZmZXIsIiA6ICIiKSArCi0JCShzdGVyZW8gPyAic3RlcmVvLCIgOiAiIikgKwotCQkicjoiICsgcmVkU2l6ZSArICIgZzoiICsgZ3JlZW5TaXplICsgIiBiOiIgKyBibHVlU2l6ZSArICIgYToiICsgYWxwaGFTaXplICsgIiwiICsKLQkJImRlcHRoOiIgKyBkZXB0aFNpemUgKyAiLHN0ZW5jaWw6IiArIHN0ZW5jaWxTaXplICsKLQkJIixhY2N1bSByOiIgKyBhY2N1bVJlZFNpemUgKyAiZzoiICsgYWNjdW1HcmVlblNpemUgKyAiYjoiICsgYWNjdW1CbHVlU2l6ZSArICJhOiIgKyBhY2N1bUFscGhhU2l6ZSArCi0JCSIsc2FtcGxlQnVmZmVyczoiICsgc2FtcGxlQnVmZmVycyArICIsc2FtcGxlczoiICsgc2FtcGxlczsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvSW1hZ2VEYXRhVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY5MDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCQkvLyBwYWxldHRlIGluZGV4ZWQgY29sb3IgZm9ybWF0cwotCQlUWVBFX0lOREVYXzggPSA2LAotCQlUWVBFX0lOREVYXzQgPSA3LAotCQlUWVBFX0lOREVYXzIgPSA4LAotCQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQkJVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIExpYnJhcnkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbG9hZExpYnJhcnkgKFN0cmluZyBuYW1lKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtICgpOwkKLQl0cnkgewotCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUgKyAnLScgKyBwbGF0Zm9ybTsKLQkJU3lzdGVtLmxvYWRMaWJyYXJ5IChuZXdOYW1lKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUxKSB7CQkKLQkJdGhyb3cgZTE7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI2ZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotaWYgWyAiJHtPU30iID0gIiIgXTsgdGhlbgotCU9TPWB1bmFtZSAtc2AKLWZpCi0KLWNhc2UgJE9TIGluCi0JIkxpbnV4IikKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCBHVEsgdmVyc2lvbiBvZiBTV1QgT3BlbkdMIgotCQk7OwotCSopCi0JCWVjaG8gIioqKiBVbmtub3duIE9TIDwke09TfT4iCi0JCTs7Ci1lc2FjCi0KLWV4cG9ydCBKQVZBX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJHsxKyIkQCJ9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjE1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbHhfc3RhdHMuaCIKLQotI2RlZmluZSBHTFhfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfR0xYXyMjZnVuYwotCi0jaWZuZGVmIE5PX2dsWENob29zZVZpc3VhbAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYyA9IDA7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWENob29zZVZpc3VhbF9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGppbnQpZ2xYQ2hvb3NlVmlzdWFsKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENvcHlDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYQ29weUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLQlnbFhDb3B5Q29udGV4dChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENyZWF0ZUNvbnRleHQKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxLCBqaW50IGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSBnZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsICZfYXJnMSkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWENyZWF0ZUNvbnRleHQoYXJnMCwgbHBhcmcxLCBhcmcyLCBhcmczKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhDcmVhdGVHTFhQaXhtYXAKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDcmVhdGVHTFhQaXhtYXBfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamludClnbFhDcmVhdGVHTFhQaXhtYXAoYXJnMCwgbHBhcmcxLCBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWERlc3Ryb3lDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYRGVzdHJveUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotCWdsWERlc3Ryb3lDb250ZXh0KGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYRGVzdHJveUdMWFBpeG1hcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lHTFhQaXhtYXBfRlVOQyk7Ci0JZ2xYRGVzdHJveUdMWFBpeG1hcChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYR2V0Q2xpZW50U3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q2xpZW50U3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDbGllbnRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDbGllbnRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldENvbmZpZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldENvbmZpZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDb25maWdfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzMpIGlmICgobHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWEdldENvbmZpZyhhcmcwLCBscGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci1mYWlsOgotCWlmIChhcmczICYmIGxwYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q29uZmlnX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnRDb250ZXh0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50Q29udGV4dCgpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYSXNEaXJlY3QKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYSXNEaXJlY3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbFhJc0RpcmVjdChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhNYWtlQ3VycmVudAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xYX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYTWFrZUN1cnJlbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbl9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCWlmIChhcmcyKSBpZiAoKGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYUXVlcnlFeHRlbnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25fRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFF1ZXJ5U2VydmVyU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeVNlcnZlclN0cmluZyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhRdWVyeVZlcnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlWZXJzaW9uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMj1OVUxMOwotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCWlmIChhcmcxKSBpZiAoKGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeVZlcnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFN3YXBCdWZmZXJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotCWdsWFN3YXBCdWZmZXJzKGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYVXNlWEZvbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xYX05BVElWRShnbFhVc2VYRm9udCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYV2FpdEdMCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRHTF9GVU5DKTsKLQlnbFhXYWl0R0woKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhXYWl0R0xfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhXYWl0WAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWFdhaXRYKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRYX0ZVTkMpOwotCWdsWFdhaXRYKCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYV2FpdFhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19tZW1tb3ZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUobWVtbW92ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIG1lbW1vdmVfRlVOQyk7Ci0JaWYgKGFyZzApIGlmICgobHBhcmcwID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCAmX2FyZzApKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JbWVtbW92ZShscGFyZzAsIGFyZzEsIGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMCAmJiBscGFyZzApIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMCwgbHBhcmcwKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBtZW1tb3ZlX0ZVTkMpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyOWVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotI2luY2x1ZGUgPEdML2dseC5oPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFkMTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50ID0gMjE7Ci1pbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzIxXTsKLWNoYXIgKiBHTFhfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbFhDaG9vc2VWaXN1YWwiLAotCSJnbFhDb3B5Q29udGV4dCIsCi0JImdsWENyZWF0ZUNvbnRleHQiLAotCSJnbFhDcmVhdGVHTFhQaXhtYXAiLAotCSJnbFhEZXN0cm95Q29udGV4dCIsCi0JImdsWERlc3Ryb3lHTFhQaXhtYXAiLAotCSJnbFhHZXRDbGllbnRTdHJpbmciLAotCSJnbFhHZXRDb25maWciLAotCSJnbFhHZXRDdXJyZW50Q29udGV4dCIsCi0JImdsWEdldEN1cnJlbnREcmF3YWJsZSIsCi0JImdsWElzRGlyZWN0IiwKLQkiZ2xYTWFrZUN1cnJlbnQiLAotCSJnbFhRdWVyeUV4dGVuc2lvbiIsCi0JImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyIsCi0JImdsWFF1ZXJ5U2VydmVyU3RyaW5nIiwKLQkiZ2xYUXVlcnlWZXJzaW9uIiwKLQkiZ2xYU3dhcEJ1ZmZlcnMiLAotCSJnbFhVc2VYRm9udCIsCi0JImdsWFdhaXRHTCIsCi0JImdsWFdhaXRYIiwKLQkibWVtbW92ZSIsCi19OwotCi0jZGVmaW5lIFNUQVRTX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF90b29sc19pbnRlcm5hbF9OYXRpdmVTdGF0c18jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xYXzFHZXRGdW5jdGlvbkNvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JcmV0dXJuIEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTFhfMUdldEZ1bmN0aW9uTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW2luZGV4XSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMWF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2luZGV4XTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzE2OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLWV4dGVybiBpbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci1leHRlcm4gaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW107Ci0jZGVmaW5lIEdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSBHTFhfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgCi0jZWxzZQotI2RlZmluZSBHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgCi0jZGVmaW5lIEdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMsCi0JZ2xYQ29weUNvbnRleHRfRlVOQywKLQlnbFhDcmVhdGVDb250ZXh0X0ZVTkMsCi0JZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMsCi0JZ2xYRGVzdHJveUNvbnRleHRfRlVOQywKLQlnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMsCi0JZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMsCi0JZ2xYR2V0Q29uZmlnX0ZVTkMsCi0JZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQywKLQlnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQywKLQlnbFhJc0RpcmVjdF9GVU5DLAotCWdsWE1ha2VDdXJyZW50X0ZVTkMsCi0JZ2xYUXVlcnlFeHRlbnNpb25fRlVOQywKLQlnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQywKLQlnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DLAotCWdsWFF1ZXJ5VmVyc2lvbl9GVU5DLAotCWdsWFN3YXBCdWZmZXJzX0ZVTkMsCi0JZ2xYVXNlWEZvbnRfRlVOQywKLQlnbFhXYWl0R0xfRlVOQywKLQlnbFhXYWl0WF9GVU5DLAotCW1lbW1vdmVfRlVOQywKLX0gR0xYX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3M2MxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLQotI2lmbmRlZiBOT19YVmlzdWFsSW5mbwotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotCi1YVmlzdWFsSW5mb19GSURfQ0FDSEUgWFZpc3VhbEluZm9GYzsKLQotdm9pZCBjYWNoZVhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KQotewotCWlmIChYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgcmV0dXJuOwotCVhWaXN1YWxJbmZvRmMuY2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCVhWaXN1YWxJbmZvRmMudmlzdWFsID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJ2aXN1YWxpZCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmRlcHRoID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjY2xhc3MiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMucmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuZ3JlZW5fbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJibHVlX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JaWYgKCFYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGxwT2JqZWN0KTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCk7Ci0JbHBTdHJ1Y3QtPnZpc3VhbGlkID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmRlcHRoKTsKLQlscFN0cnVjdC0+Y2NsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmNjbGFzcyk7Ci0JbHBTdHJ1Y3QtPnJlZF9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayk7Ci0JbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCWlmICghWFZpc3VhbEluZm9GYy5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoZW52LCBscE9iamVjdCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkLCAoamludClscFN0cnVjdC0+dmlzdWFsaWQpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY2NsYXNzLCAoamludClscFN0cnVjdC0+Y2NsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMucmVkX21hc2ssIChqaW50KWxwU3RydWN0LT5yZWRfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuYmx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSwgKGppbnQpbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGYwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdseC5oIgotCi0jaWZuZGVmIE5PX1hWaXN1YWxJbmZvCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOwotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLSNkZWZpbmUgWFZpc3VhbEluZm9fc2l6ZW9mKCkgc2l6ZW9mKFhWaXN1YWxJbmZvKQotI2Vsc2UKLSNkZWZpbmUgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhhLGIpCi0jZGVmaW5lIGdldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKSBOVUxMCi0jZGVmaW5lIHNldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKQotI2RlZmluZSBYVmlzdWFsSW5mb19zaXplb2YoKSAwCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU5NTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9tYWtlX2xpbnV4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi1DQz1nY2MKLUxEPWdjYwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1XU19QUkVGSVggICA9IGd0awotR0xfUFJFRklYICAgPSBnbAotR0xfRExMICAgICAgPSBsaWIkKEdMX1BSRUZJWCktJChXU19QUkVGSVgpLnNvCi1HTF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1HTF9MSUIgICAgICA9IC1zaGFyZWQgLUwvdXNyL1gxMVI2L2xpYiAtbEdMIC1sR0xVIC1sbQotCi1DRkxBR1MgPSAtTzIgLVdhbGwgLUkuCi0KLWFsbDogbWFrZV9nbAotCi1tYWtlX2dsOiAkKEdMX0RMTCkKLQkkKExEKSAkKEdMX0xJQikgLW8gJChHTF9ETEwpICQoR0xfT0JKKQotCi0kKEdMX0RMTCk6ICQoR0xfT0JKKQotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBnbHguYwotCi1jbGVhbjoKLQlybSAtZiAqLnNvICoubwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgInN0cnVjdHMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotdHlwZWRlZiBYVmlzdWFsSW5mb19GSURfQ0FDSEUgKlBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci0KLVhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBYVmlzdWFsSW5mb0ZjOwotCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT52aXN1YWwgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JbHBDYWNoZS0+dmlzdWFsaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbGlkIiwgIkkiKTsKLQlscENhY2hlLT5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInNjcmVlbiIsICJJIik7Ci0JbHBDYWNoZS0+ZGVwdGggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlscENhY2hlLT5jY2xhc3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNjbGFzcyIsICJJIik7Ci0JbHBDYWNoZS0+cmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInJlZF9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ibHVlX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJsdWVfbWFzayIsICJJIik7Ci0JbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY29sb3JtYXBfc2l6ZSIsICJJIik7Ci0JbHBDYWNoZS0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLVhWaXN1YWxJbmZvICpnZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKFZpc3VhbCAqKSgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsKTsKLQlscFN0cnVjdC0+dmlzdWFsaWQgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4pOwotCWxwU3RydWN0LT5kZXB0aCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgpOwotCWxwU3RydWN0LT5jbGFzcyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y2NsYXNzKTsKLQlscFN0cnVjdC0+cmVkX21hc2sgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzayk7Ci0JbHBTdHJ1Y3QtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrKTsKLQlscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Yml0c19wZXJfcmdiKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCkKLXsKLQlQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUgPSAmWFZpc3VhbEluZm9GYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwsIChqaW50KWxwU3RydWN0LT52aXN1YWwpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQsIChqaW50KWxwU3RydWN0LT52aXN1YWxpZCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgsIChqaW50KWxwU3RydWN0LT5kZXB0aCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MsIChqaW50KWxwU3RydWN0LT5jbGFzcyk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5yZWRfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPnJlZF9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJsdWVfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmJsdWVfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplLCAoamludClscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9ndGsvR0xYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1MDc5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBHTFggewotCQotc3RhdGljIHsKLQlMaWJyYXJ5LmxvYWRMaWJyYXJ5KCJnbCIpOwotfQotCi0vKgotKiogVmlzdWFsIENvbmZpZyBBdHRyaWJ1dGVzIChnbFhHZXRDb25maWcsIGdsWEdldEZCQ29uZmlnQXR0cmliKQotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9VU0VfR0wJCQkJPSAxOwkvKiBzdXBwb3J0IEdMWCByZW5kZXJpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CVUZGRVJfU0laRQkJCT0gMjsJLyogZGVwdGggb2YgdGhlIGNvbG9yIGJ1ZmZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0xFVkVMCQkJCT0gMzsJLyogbGV2ZWwgaW4gcGxhbmUgc3RhY2tpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBCQkJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJCT0gNTsJLyogZG91YmxlIGJ1ZmZlcmluZyBzdXBwb3J0ZWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVSRU8JCQkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQkJPSA3OwkvKiBudW1iZXIgb2YgYXV4IGJ1ZmZlcnMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRURfU0laRQkJCT0gODsJLyogbnVtYmVyIG9mIHJlZCBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0dSRUVOX1NJWkUJCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJCT0gMTA7CS8qIG51bWJlciBvZiBibHVlIGNvbXBvbmVudCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUxQSEFfU0laRQkJCT0gMTE7CS8qIG51bWJlciBvZiBhbHBoYSBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX1NJWkUJCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQkJPSAxMzsJLyogbnVtYmVyIG9mIHN0ZW5jaWwgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX1JFRF9TSVpFCQk9IDE0OwkvKiBudW1iZXIgb2YgcmVkIGFjY3VtIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9HUkVFTl9TSVpFCT0gMTU7CS8qIG51bWJlciBvZiBncmVlbiBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQkxVRV9TSVpFCQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJPSAweDIzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCT0gMHgyNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJPSAweDI1OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCT0gMHgyNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCT0gMHgyNzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRQk9IDB4Mjg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRFJBV0FCTEVfVFlQRQkJPSAweDgwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUkVOREVSX1RZUEUJCQk9IDB4ODAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9YX1JFTkRFUkFCTEUJCT0gMHg4MDEyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkJPSAweDgwMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfV0lEVEgJPSAweDgwMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwk9IDB4ODAxODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSUQJCQk9IDB4ODAwQjsKLQotLyoKLSoqIEVycm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieQotKiogYSB2YWx1ZSBvZiAwLgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfU0NSRUVOCQk9IDE7CS8qIHNjcmVlbiAjIGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9BVFRSSUJVVEUJPSAyOwkvKiBhdHRyaWJ1dGUgdG8gZ2V0IGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PX0VYVEVOU0lPTgk9IDM7CS8qIG5vIGdseCBleHRlbnNpb24gb24gc2VydmVyICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZJU1VBTAkJPSA0OwkvKiB2aXN1YWwgIyBub3Qga25vd24gYnkgR0xYICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX0NPTlRFWFQJCT0gNTsJLyogcmV0dXJuZWQgb25seSBieSBpbXBvcnRfY29udGV4dCBFWFQ/ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZBTFVFCQk9IDY7CS8qIHJldHVybmVkIG9ubHkgYnkgZ2xYU3dhcEludGVydmFsU0dJPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9FTlVNCQk9IDc7CS8qIHVudXNlZD8gKi8KLQotLyogRkJDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLwotCi0vKgotKiogR2VuZXJpYyAiZG9uJ3QgY2FyZSIgdmFsdWUgZm9yIGdsWCBDaG9vc2VGQkNvbmZpZyBhdHRyaWJ1dGVzIChleGNlcHQKLSoqIEdMWF9MRVZFTCkKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRE9OVF9DQVJFCQkJPSAweEZGRkZGRkZGOwotCi0vKiBHTFhfUkVOREVSX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkFfQklUCQkJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTE9SX0lOREVYX0JJVAkJPSAweDAwMDAwMDAyOwotCi0vKiBHTFhfRFJBV0FCTEVfVFlQRSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QSVhNQVBfQklUCQkJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfQklUCQkJPSAweDAwMDAwMDA0OwotCi0vKiBHTFhfQ09ORklHX0NBVkVBVCBhdHRyaWJ1dGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORQkJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCT0gMHg4MDA5OwotCi0vKiBnbFhDcmVhdGVHTFhQYnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QUkVTRVJWRURfQ09OVEVOVFMJPSAweDgwMUI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTEFSR0VTVF9QQlVGRkVSCQk9IDB4ODAxQzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0hFSUdIVAkJPSAweDgwNDA7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfV0lEVEgJCT0gMHg4MDQxOwkvKiBOZXcgZm9yIEdMWCAxLjMgKi8KLQotLyogZ2xYUXVlcnlHTFhQQnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9XSURUSAkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQk9IDB4ODAxRTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FVkVOVF9NQVNLCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCT0gMHg4MDE1OwotCi0vKiBnbFhRdWVyeUNvbnRleHQgYXR0cmlidXRlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkgIDB4ODAxMyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkgIDB4ODAxMSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NDUkVFTgkJCT0gMHg4MDBDOwotCi0vKiBnbFhTZWxlY3RFdmVudCBldmVudCBtYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0NMT0JCRVJfTUFTSwk9IDB4MDgwMDAwMDA7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZXZlbnRfdHlwZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9EQU1BR0VECQkJPSAweDgwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0FWRUQJCQk9IDB4ODAyMTsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBkcmF3X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XCQkJPSAweDgwMjI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUgkJCT0gMHg4MDIzOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGJ1ZmZlcl9tYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTX0JJVAkJPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDA0MDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9CVUZGRVJfQklUCQk9IDB4MDAwMDAwODA7Ci0KLS8qCi0qKiBFeHRlbnNpb24gcmV0dXJuIHZhbHVlcyBmcm9tIGdsWEdldENvbmZpZy4gIFRoZXNlIGFyZSBhbHNvCi0qKiBhY2NlcHRlZCBhcyBwYXJhbWV0ZXIgdmFsdWVzIGZvciBnbFhDaG9vc2VWaXN1YWwuCi0qLwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRV9FWFQgPSAweDIyOwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEVfRVhUID0gMHgyMzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfRVhUID0gMHgyNDsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0VYVAk9IDB4MjU7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0VYVCA9IDB4MjY7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfRVhUCT0gMHgyNzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfRVhUID0gMHgyODsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdmlzdWFsX3R5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUlVFX0NPTE9SX0VYVAk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1JfRVhUCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUl9FWFQJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SX0VYVAk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFX0VYVAk9IDB4ODAwNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEFUSUNfR1JBWV9FWFQJPSAweDgwMDc7Ci0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT05FX0VYVAkJPSAweDgwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkdCX0VYVAkJPSAweDgwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfRVhUCT0gMHg4MDA5OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF9yYXRpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVAkJPSAweDIwOyAgLyogdmlzdWFsX3JhdGluZyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NMT1dfVklTVUFMX0VYVAkJPSAweDgwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9OX0NPTkZPUk1BTlRfVklTVUFMX0VYVAk9IDB4ODAwRDsKLQotLyoKLSoqIE5hbWVzIGZvciBhdHRyaWJ1dGVzIHRvIGdsWEdldENsaWVudFN0cmluZy4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVORE9SCQk9IDB4MTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OCQk9IDB4MjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRFTlNJT05TCT0gMHgzOwotCi0vKgotKiogTmFtZXMgZm9yIGF0dHJpYnV0ZXMgdG8gZ2xYUXVlcnlDb250ZXh0SW5mb0VYVC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0hBUkVfQ09OVEVYVF9FWFQgPSAweDgwMEE7CS8qIGlkIG9mIHNoYXJlIGNvbnRleHQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSURfRVhUID0gMHg4MDBCOwkvKiBpZCBvZiBjb250ZXh0J3MgdmlzdWFsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0NSRUVOX0VYVCA9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKgotKiBHTFggMS40IAotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVfQlVGRkVSUyA9IDEwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVTID0gMTAwMDAxOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ2hvb3NlVmlzdWFsKGludCBkcHksIGludCBzY3JlZW4sIGludFtdIGF0dHJpYkxpc3QpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhDb3B5Q29udGV4dChpbnQgZHB5LCBpbnQgc3JjLCBpbnQgZHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMzk2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9YVmlzdWFsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ3RrOwotCi0gCi1wdWJsaWMgY2xhc3MgWFZpc3VhbEluZm8gewotCXB1YmxpYyBpbnQgdmlzdWFsOwotCXB1YmxpYyBpbnQgdmlzdWFsaWQ7Ci0JcHVibGljIGludCBzY3JlZW47Ci0JcHVibGljIGludCBkZXB0aDsKLQlwdWJsaWMgaW50IGNjbGFzczsKLQlwdWJsaWMgaW50IHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7Ci0JcHVibGljIGludCBjb2xvcm1hcF9zaXplOwotCXB1YmxpYyBpbnQgYml0c19wZXJfcmdiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDQwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzZjNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotCi0vKioKLSAqIEdMQ2FudmFzIGlzIGEgd2lkZ2V0IGNhcGFibGUgb2YgZGlzcGxheWluZyBPcGVuR0wgY29udGVudC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR0xDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCWludCAvKmxvbmcqLyB4ZGlzcGxheTsKLQlpbnQgLypsb25nKi8geGlkOwotCWludCAvKmxvbmcqLyBjb250ZXh0OwotCWludCAvKmxvbmcqLyBnbFdpbmRvdzsKLQlYVmlzdWFsSW5mbyB2aW5mbzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVRUUklCVVRFUyA9IDMyOwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsJCi0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaW50IGdseEF0dHJpYiBbXSA9IG5ldyBpbnQgW01BWF9BVFRSSUJVVEVTXTsKLQlpbnQgcG9zID0gMDsKLQotCU9TLmd0a193aWRnZXRfcmVhbGl6ZSAoaGFuZGxlKTsKLQlpbnQgLypsb25nKi8gd2luZG93ID0gT1MuR1RLX1dJREdFVF9XSU5ET1cgKGhhbmRsZSk7Ci0JeGRpc3BsYXkgPSBPUy5nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheSAod2luZG93KTsKLQlpbnQgeHNjcmVlbiA9IE9TLlhEZWZhdWx0U2NyZWVuICh4ZGlzcGxheSk7Ci0KLQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfUkdCQTsKLQlpZiAoZGF0YS5kb3VibGVCdWZmZXIpIGdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFUkVPOwotCWlmIChkYXRhLnJlZFNpemUgPiAwKSB7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9SRURfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnJlZFNpemU7Ci0JfQotCWlmIChkYXRhLmdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5ncmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmJsdWVTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQkxVRV9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFscGhhU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FMUEhBX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hbHBoYVNpemU7Ci0JfQotCWlmIChkYXRhLmRlcHRoU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0RFUFRIX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5kZXB0aFNpemU7Ci0JfQotCWlmIChkYXRhLnN0ZW5jaWxTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFTkNJTF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuc3RlbmNpbFNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtUmVkU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1SZWRTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUdyZWVuU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1CbHVlU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0JMVUVfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQWxwaGFTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQUNDVU1fQUxQSEFfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFX0JVRkZFUlM7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5zYW1wbGVCdWZmZXJzOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFUzsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWdseEF0dHJpYiBbcG9zKytdID0gMDsKLQlpbnQgaW5mb1B0ciA9IEdMWC5nbFhDaG9vc2VWaXN1YWwgKHhkaXNwbGF5LCB4c2NyZWVuLCBnbHhBdHRyaWIpOwotCWlmIChpbmZvUHRyID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLQl2aW5mbyA9IG5ldyBYVmlzdWFsSW5mbyAoKTsKLQlHTFgubWVtbW92ZSAodmluZm8sIGluZm9QdHIsIFhWaXN1YWxJbmZvLnNpemVvZik7Ci0JT1MuWEZyZWUgKGluZm9QdHIpOwotCWludCAvKmxvbmcqLyBzY3JlZW4gPSBPUy5nZGtfc2NyZWVuX2dldF9kZWZhdWx0ICgpOwotCWludCAvKmxvbmcqLyBnZGt2aXN1YWwgPSBPUy5nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsIChzY3JlZW4sIHZpbmZvLnZpc3VhbGlkKTsKLQkvL2NvbnRleHQgPSBHTFguZ2xYQ3JlYXRlQ29udGV4dCAoeGRpc3BsYXksIGluZm8sIHNoYXJlID09IG51bGwgPyAwIDogc2hhcmUuY29udGV4dCwgdHJ1ZSk7Ci0JY29udGV4dCA9IEdMWC5nbFhDcmVhdGVDb250ZXh0ICh4ZGlzcGxheSwgdmluZm8sIDAsIHRydWUpOwotCWlmIChjb250ZXh0ID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCUdka1dpbmRvd0F0dHIgYXR0cnMgPSBuZXcgR2RrV2luZG93QXR0ciAoKTsKLQlhdHRycy53aWR0aCA9IDE7Ci0JYXR0cnMuaGVpZ2h0ID0gMTsKLQlhdHRycy5ldmVudF9tYXNrID0gT1MuR0RLX0tFWV9QUkVTU19NQVNLIHwgT1MuR0RLX0tFWV9SRUxFQVNFX01BU0sgfAotCQlPUy5HREtfRk9DVVNfQ0hBTkdFX01BU0sgfCBPUy5HREtfUE9JTlRFUl9NT1RJT05fTUFTSyB8Ci0JCU9TLkdES19CVVRUT05fUFJFU1NfTUFTSyB8IE9TLkdES19CVVRUT05fUkVMRUFTRV9NQVNLIHwKLQkJT1MuR0RLX0VOVEVSX05PVElGWV9NQVNLIHwgT1MuR0RLX0xFQVZFX05PVElGWV9NQVNLIHwKLQkJT1MuR0RLX0VYUE9TVVJFX01BU0sgfCBPUy5HREtfVklTSUJJTElUWV9OT1RJRllfTUFTSzsKLQlhdHRycy53aW5kb3dfdHlwZSA9IE9TLkdES19XSU5ET1dfQ0hJTEQ7Ci0JYXR0cnMudmlzdWFsID0gZ2RrdmlzdWFsOwotCWdsV2luZG93ID0gT1MuZ2RrX3dpbmRvd19uZXcgKHdpbmRvdywgYXR0cnMsIE9TLkdES19XQV9WSVNVQUwpOwotCU9TLmdka193aW5kb3dfc2V0X3VzZXJfZGF0YSAoZ2xXaW5kb3csIGhhbmRsZSk7Ci0JeGlkID0gT1MuZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkIChnbFdpbmRvdyk7Ci0JT1MuZ2RrX3dpbmRvd19zaG93IChnbFdpbmRvdyk7Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5QYWludDoKLQkJCQkvKioKLQkJCQkqIEJ1ZyBpbiBNRVNBLiAgTUVTQSBkb2VzIHNvbWUgbmFzdHkgc29ydCBvZiBwb2xsaW5nIHRvIHRyeQotCQkJCSogYW5kIGVuc3VyZSB0aGF0IHRoZWlyIGJ1ZmZlciBzaXplcyBtYXRjaCB0aGUgY3VycmVudCBYIHN0YXRlLgotCQkJCSogVGhpcyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCB1c2luZyBnbFZpZXdwb3J0KCkuCi0JCQkJKiBGSVhNRTogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzLgotCQkJCSovCi0JCQkJaW50IFtdIHZpZXdwb3J0ID0gbmV3IGludCBbNF07Ci0JCQkJR0wuZ2xHZXRJbnRlZ2VydiAoR0wuR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKLQkJCQlHTC5nbFZpZXdwb3J0ICh2aWV3cG9ydCBbMF0sdmlld3BvcnQgWzFdLHZpZXdwb3J0IFsyXSx2aWV3cG9ydCBbM10pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCU9TLmdka193aW5kb3dfbW92ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQkJCQlPUy5nZGtfd2luZG93X3Jlc2l6ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJaWYgKGNvbnRleHQgIT0gMCkgewotCQkJCQlpZiAoR0xYLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQpIHsKLQkJCQkJCUdMWC5nbFhNYWtlQ3VycmVudCh4ZGlzcGxheSwgMCwgMCk7Ci0JCQkJCX0KLQkJCQkJR0xYLmdsWERlc3Ryb3lDb250ZXh0ICh4ZGlzcGxheSwgY29udGV4dCk7Ci0JCQkJCWNvbnRleHQgPSAwOwotCQkJCX0KLQkJCQlpZiAoZ2xXaW5kb3cgIT0gMCkgewotCQkJCQlPUy5nZGtfd2luZG93X2Rlc3Ryb3kgKGdsV2luZG93KTsKLQkJCQkJZ2xXaW5kb3cgPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9TQU1QTEVfQlVGRkVSUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlQnVmZmVycyA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU0FNUExFUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlcyA9IHZhbHVlIFswXTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIEdMWC5nbFhHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBjb250ZXh0OwotfQotCi0vKioKLSAqIFNldHMgdGhlIE9wZW5HTCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdMQ2FudmFzIHRvIGJlIHRoZQotICogY3VycmVudCBHTCBjb250ZXh0LgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChHTFguZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gY29udGV4dCkgcmV0dXJuOwotCUdMWC5nbFhNYWtlQ3VycmVudCAoeGRpc3BsYXksIHhpZCwgY29udGV4dCk7Ci19Ci0KLS8qKgotICogU3dhcHMgdGhlIGZyb250IGFuZCBiYWNrIGNvbG9yIGJ1ZmZlcnMuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc3dhcEJ1ZmZlcnMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMWC5nbFhTd2FwQnVmZmVycyAoeGRpc3BsYXksIHhpZCk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9idWlsZC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVjMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgICAgIFRvbSBUcm9tZXkgKFJlZCBIYXQsIEluYy4pCi0jICAgICBTcmlkaGFyIEJpZGlnYWx1IChJQ1MpCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1jZCBgZGlybmFtZSAkMGAKLQotIyBEZXRlcm1pbmUgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYmVpbmcgYnVpbHQKLW1ha2VmaWxlPSIiCi1PUz1gdW5hbWUgLXNgCi1NT0RFTD1gdW5hbWUgLW1gCi0KLWNhc2UgJE9TIGluCi0JIkFJWCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvYWl4ajkKLQkJTU9USUZfSE9NRT0vdXNyCi0JCUNERV9IT01FPS91c3IvZHQKLQkJbWFrZWZpbGU9Im1ha2VfYWl4Lm1hayIKLQkJZWNobyAiQnVpbGRpbmcgQUlYIHZlcnNpb24gb2YgU1dUIgotCQk7OwotCSJMaW51eCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvSUJNSmF2YTItMTQxCi0JCU1PVElGX0hPTUU9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL21vdGlmMjEKLQkJUVRfSE9NRT0kUVRESVIKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiU3VuT1MiKQotCQlKQVZBX0hPTUU9L3Vzci9qYXZhCi0JCU1PVElGX0hPTUU9L3Vzci9kdAotCQlDREVfSE9NRT0vdXNyL2R0Ci0JCVBBVEg9L29wdC9TVU5Xc3Byby9iaW46JFBBVEgKLQkJZXhwb3J0IFBBVEgJCQotCQltYWtlZmlsZT0ibWFrZV9zb2xhcmlzLm1hayIKLQkJZWNobyAiQnVpbGRpbmcgU29sYXJpcyB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiSFAtVVgiKQotCQlKQVZBX0hPTUU9L29wdC9qZGsxNDEwMQotCQlNT1RJRl9IT01FPS91c3IKLQkJQ0RFX0hPTUU9L3Vzci9kdAotCQljYXNlICRNT0RFTCBpbgotCQkJImlhNjQiKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfaWE2NC5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCBpYTY0IHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCQkqKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfUEFfUklTQy5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCByaXNjIHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQotCSopCi0JCWVjaG8gIlVua25vd24gT1MgLS0gYnVpbGQgYWJvcnRlZCIKLQkJOzsKLWVzYWMKLQotZXhwb3J0IEpBVkFfSE9NRSBNT1RJRl9IT01FIENERV9IT01FIFFUX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJDEgJDIgJDMgJDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9nbHguYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhlMTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFhHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENob29zZVZpc3VhbFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqaW50KWdsWENob29zZVZpc3VhbCgoRGlzcGxheSAqKWFyZzAsIGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYQ29weUNvbnRleHRcbiIpCi0KLQlnbFhDb3B5Q29udGV4dCgoRGlzcGxheSAqKWFyZzAsIChHTFhDb250ZXh0KWFyZzEsIChHTFhDb250ZXh0KWFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqYm9vbGVhbiBhcmczKQotewotCVhWaXN1YWxJbmZvIF9hcmcxLCAqbHBhcmcxPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENyZWF0ZUNvbnRleHRcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlQ29udGV4dCgoRGlzcGxheSAqKWFyZzAsIGxwYXJnMSwgKEdMWENvbnRleHQpYXJnMiwgYXJnMyk7Ci0JaWYgKGFyZzEpIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhDcmVhdGVHTFhQaXhtYXBcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlR0xYUGl4bWFwKChEaXNwbGF5ICopYXJnMCwgbHBhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMSkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCBscGFyZzEpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWERlc3Ryb3lDb250ZXh0XG4iKQotCi0JZ2xYRGVzdHJveUNvbnRleHQoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYRGVzdHJveUdMWFBpeG1hcFxuIikKLQotCWdsWERlc3Ryb3lHTFhQaXhtYXAoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldENsaWVudFN0cmluZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhHZXRDbGllbnRTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q2xpZW50U3RyaW5nKChEaXNwbGF5ICopYXJnMCwgYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhHZXRDb25maWcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiZ2xYR2V0Q29uZmlnXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9IGdldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgJl9hcmcxKTsKLQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JcmMgPSAoamludClnbFhHZXRDb25maWcoKERpc3BsYXkgKilhcmcwLCBscGFyZzEsIGFyZzIsIChpbnQgKilscGFyZzMpOwotCWlmIChhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYR2V0Q3VycmVudENvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWEdldEN1cnJlbnREcmF3YWJsZVxuIikKLQotCXJldHVybiAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhJc0RpcmVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhJc0RpcmVjdFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pZ2xYSXNEaXJlY3QoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoImdsWE1ha2VDdXJyZW50XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbilnbFhNYWtlQ3VycmVudCgoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxLCAoR0xYQ29udGV4dClhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeUV4dGVuc2lvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnRBcnJheSBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeUV4dGVuc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZ1xuIikKLQotCXJldHVybiAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFF1ZXJ5U2VydmVyU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxLCBhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeVZlcnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhRdWVyeVZlcnNpb25cbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCXJjID0gKGpib29sZWFuKWdsWFF1ZXJ5VmVyc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYU3dhcEJ1ZmZlcnNcbiIpCi0KLQlnbFhTd2FwQnVmZmVycygoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFVzZVhGb250KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlERUJVR19DQUxMKCJnbFhVc2VYRm9udFxuIikKLQotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYV2FpdEdMXG4iKQotCi0JZ2xYV2FpdEdMKCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhXYWl0WCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWFdhaXRYXG4iKQotCi0JZ2xYV2FpdFgoKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKG1lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hWaXN1YWxJbmZvXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJtZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF9tb3RpZl9YVmlzdWFsSW5mb18ySUlcbiIpCi0KLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCW1lbW1vdmUoKHZvaWQgKilscGFyZzAsIChjb25zdCB2b2lkICopYXJnMSwgKHNpemVfdClhcmcyKTsKLQlpZiAoYXJnMCkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI3YjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfYWl4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi0jICAgIEpBVkFfSE9NRSAgLSBUaGUgSkRLID4gMS4zCi1KQVZBX0hPTUUgICA9IC91c3IvamF2YTEzMQotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBzd3QKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ibm9lbnRyeSAtbGNfciAtbENfciAtbG0gLWJleHBhbGwgLWxNcm0gLWxYMTEgLWxYZXh0IC1saWNvbnYgLWxHTCAtbEdMVQotCi0jCi0jIFRoZSBmb2xsb3dpbmcgQ0ZMQUdTIGFyZSBmb3IgY29tcGlsaW5nIHRoZSBTV1QgT3BlbkdMIGxpYnJhcnkuCi0jCi1DRkxBR1MgPSAtTyAtcyBcCi0JLURBSVggXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLXEgbWJjcyAtcWxhbmdsdmw9ZXh0ZW5kZWQgLXFtYXhtZW09ODE5MiBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAkKFNXVF9MSUIpIC1vICQoU1dUX0RMTCkgJChTV1RfT0JKKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKi5zbyAqLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX2hwdXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICA9IC9vcHQvamF2YTEuMwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBnbAotV1NfUFJFRklYICAgID0gbW90aWYKLVNXVF9ETEwgICAgICA9IGxpYiQoU1dUX1BSRUZJWCktJChXU19QUkVGSVgpLnNsCi1TV1RfT0JKICAgICAgPSBzd3QubyBnbC5vIGdsdS5vIHN0cnVjdHMubyBnbHgubwotU1dUX0xJQiAgICAgID0gLUwvdXNyL2xpYiAtTC9vcHQvZ3JhcGhpY3MvT3BlbkdML2xpYiAtRyAtbEdMIC1sR0xVIC1sYyAtbGRsZCAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLiBJZiB0aGlzIGZsYWcgaXMgbm90Ci0jCi1DRkxBR1MgPSAtQWUgK3ogXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLURfSFBVWCAtRF9QT1NJWF9DX1NPVVJDRT0xOTk1MDZMIFwKLQktSS4vIFwKLQktSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvaHAtdXggXAotCS1JL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtYiAteiAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbCAqLm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTk1YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICAgPSAvYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvaXZlL2JpbgotCi0KLSMgRGVmaW5lIHRoZSB2YXJpb3VzIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgbWFkZS4KLVNXVF9QUkVGSVggICA9IGdsCi1XU19QUkVGSVggICAgPSBtb3RpZgotU1dUX0RMTCAgICAgID0gbGliJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuc28KLVNXVF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1TV1RfTElCICAgICAgPSAtc2hhcmVkIC1ML3Vzci9YMTFSNi9saWIgLWxHTCAtbEdMVSAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS1JLi8gXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUKLQotYWxsOiBtYWtlX3N3dAotCi1tYWtlX3N3dDogJChTV1RfRExMKQotCi0kKFNXVF9ETEwpOiAkKFNXVF9PQkopCi0JbGQgLW8gJEAgJChTV1RfT0JKKSAkKFNXVF9MSUIpCi0KLWNsZWFuOgotCXJtIC1mICouc28gKi5vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9zb2xhcmlzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MTBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBEZWZpbmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBmb3IgdmFyaW91cyBwcm9kdWN0cy4KLUpBVkFfSE9NRSAgID0gL2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2l2ZS9iaW4KLQotIyBEZWZpbmUgdGhlIHZhcmlvdXMgc2hhcmVkIGxpYnJhcmllcyB0byBiZSBtYWRlLgotU1dUX1BSRUZJWCAgID0gZ2wKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ML3Vzci9saWIgLWxtIC1sR0wgLWxHTFUKLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS14YXJjaD1nZW5lcmljIFwKLQktS1BJQyBcCi0JLUkuLyBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbyAqLm8KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi10eXBlZGVmIHN0cnVjdCBYVmlzdWFsSW5mb19GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHZpc3VhbCwgdmlzdWFsaWQsIHNjcmVlbiwgZGVwdGgsIGNjbGFzcywgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzaywgY29sb3JtYXBfc2l6ZSwgYml0c19wZXJfcmdiOwotfSBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci10eXBlZGVmIFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSAqUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRTsKLQotWFZpc3VhbEluZm9fRklEX0NBQ0hFIFhWaXN1YWxJbmZvRmM7Ci0KLXZvaWQgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSkKLXsKLQlpZiAobHBDYWNoZS0+Y2FjaGVkKSByZXR1cm47Ci0JbHBDYWNoZS0+Y2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCWxwQ2FjaGUtPnZpc3VhbCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsIiwgIkkiKTsKLQlscENhY2hlLT52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsaWQiLCAiSSIpOwotCWxwQ2FjaGUtPnNjcmVlbiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlscENhY2hlLT5kZXB0aCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZGVwdGgiLCAiSSIpOwotCWxwQ2FjaGUtPmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY2NsYXNzIiwgIkkiKTsKLQlscENhY2hlLT5yZWRfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmdyZWVuX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdyZWVuX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiYmx1ZV9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlscENhY2hlLT5iaXRzX3Blcl9yZ2IgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJpdHNfcGVyX3JnYiIsICJJIik7Ci0JbHBDYWNoZS0+Y2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBscENhY2hlID0gJlhWaXN1YWxJbmZvRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCWxwU3RydWN0LT52aXN1YWwgPSAoVmlzdWFsICopKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwpOwotCWxwU3RydWN0LT52aXN1YWxpZCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQpOwotCWxwU3RydWN0LT5zY3JlZW4gPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCk7Ci0JbHBTdHJ1Y3QtPmNsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MpOwotCWxwU3RydWN0LT5yZWRfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+cmVkX21hc2spOwotCWxwU3RydWN0LT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ibHVlX21hc2spOwotCWxwU3RydWN0LT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplKTsKLQlscFN0cnVjdC0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWxpZCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbGlkKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbiwgKGppbnQpbHBTdHJ1Y3QtPnNjcmVlbik7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNjbGFzcywgKGppbnQpbHBTdHJ1Y3QtPmNsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrLCAoamludClscFN0cnVjdC0+cmVkX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmdyZWVuX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNvbG9ybWFwX3NpemUsIChqaW50KWxwU3RydWN0LT5jb2xvcm1hcF9zaXplKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJpdHNfcGVyX3JnYiwgKGppbnQpbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi1YVmlzdWFsSW5mbyAqZ2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCk7Ci12b2lkIHNldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRmNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLm1vdGlmLio7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gYXJlIHVzZWQgdG8gZHJhdyBvbiBzd3QgPGNvZGU+RHJhd2FibGU8L2NvZGU+cyAKLSAqIHRocm91Z2ggaW52b2NhdGlvbnMgb2YgcHJvdmlkZWQgT3BlbkdMIGZ1bmN0aW9ucy4KLSAqIDxwPgotICogQXBwbGljYXRpb24gY29kZSBtdXN0IGV4cGxpY2l0bHkgaW52b2tlIHRoZSA8Y29kZT5HTENvbnRleHQuZGlzcG9zZSAoKTwvY29kZT4gCi0gKiBtZXRob2QgdG8gcmVsZWFzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgbWFuYWdlZCBieSBlYWNoIGluc3RhbmNlCi0gKiB3aGVuIHRob3NlIGluc3RhbmNlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGlzIGlzIDxlbT5wYXJ0aWN1bGFybHk8L2VtPgotICogaW1wb3J0YW50IG9uIFdpbmRvd3M5NSBhbmQgV2luZG93czk4IHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGhhcyBhIGxpbWl0ZWQKLSAqIG51bWJlciBvZiBkZXZpY2UgY29udGV4dHMgYXZhaWxhYmxlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgR0xDb250ZXh0IHsKLQlpbnQgaGFuZGxlOwotCWludCBnYzsKLQlHQ0RhdGEgZGF0YTsKLQlEcmF3YWJsZSBkcmF3YWJsZTsKLQlpbnQgc2VsZWN0QnVmZmVyUHRyID0gMDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2hpY2ggaGFzIGJlZW4KLQkgKiBjb25maWd1cmVkIHRvIGRyYXcgb24gdGhlIHNwZWNpZmllZCBkcmF3YWJsZS4KLQkgKiA8cD4KLQkgKiBZb3UgbXVzdCBkaXNwb3NlIHRoZSA8Y29kZT5HTENvbnRleHQ8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRyYXdhYmxlIHRoZSBkcmF3YWJsZSB0byBkcmF3IG9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGRyYXdhYmxlIGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05PX0hBTkRMRVMgaWYgYSBoYW5kbGUgY291bGQgbm90IGJlIG9idGFpbmVkIGZvciBnYyBjcmVhdGlvbjwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGN1cnJlbnQgZGlzcGxheSBkZXB0aCBpcyBub3Qgc3VwcG9ydGVkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBHTENvbnRleHQgKERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0JCWlmIChkcmF3YWJsZSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJdGhpcy5kcmF3YWJsZSA9IGRyYXdhYmxlOwotCQl0aGlzLmRhdGEgPSBuZXcgR0NEYXRhICgpOwotCQlnYyA9IGRyYXdhYmxlLmludGVybmFsX25ld19HQyAoZGF0YSk7Ci0JCWlmIChnYyA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQkJaW50IHhEaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwotCQlpbnQgc2NyZWVuID0gT1MuWERlZmF1bHRTY3JlZW4gKHhEaXNwbGF5KTsKLQkJaW50IGRlcHRoID0gT1MuWERlZmF1bHREZXB0aE9mU2NyZWVuIChPUy5YRGVmYXVsdFNjcmVlbk9mRGlzcGxheSAoeERpc3BsYXkpKTsKLQkJaW50IGF0dHJpYiBbXSA9IHsKLQkJCVhHTC5HTFhfTEVWRUwsCi0JCQkwLAotCQkJWEdMLkdMWF9SR0JBLAotCQkJWEdMLkdMWF9ET1VCTEVCVUZGRVIsCi0vLwkJCVhHTC5HTFhfREVQVEhfU0laRSwKLS8vCQkJZGVwdGgsCi0JCQkwCi0JCX07Ci0JCWludCBpbmZvUHRyID0gWEdMLmdsWENob29zZVZpc3VhbCAoeERpc3BsYXksIHNjcmVlbiwgYXR0cmliKTsKLQkJaWYgKGluZm9QdHIgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotCQlYVmlzdWFsSW5mbyBpbmZvID0gbmV3IFhWaXN1YWxJbmZvICgpOwotCQlYR0wubWVtbW92ZSAoaW5mbywgaW5mb1B0ciwgWFZpc3VhbEluZm8uc2l6ZW9mKTsKLQkJT1MuWEZyZWUgKGluZm9QdHIpOwotCQloYW5kbGUgPSBYR0wuZ2xYQ3JlYXRlQ29udGV4dCAoeERpc3BsYXksIGluZm8sIDAsIGZhbHNlKTsKLQkJaWYgKGhhbmRsZSA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSByZWNlaXZlci4gQXBwbGljYXRpb25zIG11c3QgZGlzcG9zZSBvZiBhbGwgPGNvZGU+R0xDb250ZXh0PC9jb2RlPnMKLQkgKiB0aGF0IHRoZXkgYWxsb2NhdGUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSAoKSB7Ci0JCWlmIChoYW5kbGUgPT0gMCkgcmV0dXJuOwotCQlpbnQgeERpc3BsYXkgPSBkYXRhLmRpc3BsYXk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSB7Ci0JCQlYR0wuZ2xYTWFrZUN1cnJlbnQgKHhEaXNwbGF5LCAwLCAwKTsKLQkJfQotCQlpZiAoc2VsZWN0QnVmZmVyUHRyICE9IDApIE9TLlh0RnJlZSAoc2VsZWN0QnVmZmVyUHRyKTsKLQkJWEdMLmdsWERlc3Ryb3lDb250ZXh0ICh4RGlzcGxheSwgaGFuZGxlKTsKLQkJaGFuZGxlID0gMDsKLQkJLy8gZHJhd2FibGUgbWF5IGJlIGRpc3Bvc2VkCi0JCXRyeSB7Ci0JCQlkcmF3YWJsZS5pbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZ2MgPSAwOwotCQlkYXRhLmRpc3BsYXkgPSBkYXRhLmRyYXdhYmxlID0gZGF0YS5jb2xvcm1hcCA9IDA7Ci0JCS8qZGF0YS5mb250TGlzdCA9Ki8gZGF0YS5jbGlwUmduID0gZGF0YS5yZW5kZXJUYWJsZSA9IDA7Ci0JCWRyYXdhYmxlID0gbnVsbDsKLQkJZGF0YS5kZXZpY2UgPSBudWxsOwotCQlkYXRhLmltYWdlID0gbnVsbDsKLQkJLy9kYXRhLmNvZGVQYWdlID0gbnVsbDsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIGludFtdIGdldFNlbGVjdEJ1ZmZlciAoaW50IHNlbGVjdEJ1ZmZlclB0ciwgaW50W10gc2VsZWN0QnVmZmVyKSB7Ci0JCU9TLm1lbW1vdmUgKHNlbGVjdEJ1ZmZlciwgc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCXJldHVybiBzZWxlY3RCdWZmZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3RCdWZmZXJQdHIgKGludFtdIHNlbGVjdEJ1ZmZlcikgewotCQlpZiAoc2VsZWN0QnVmZmVyUHRyID09IDApIHsKLQkJCXNlbGVjdEJ1ZmZlclB0ciA9IE9TLlh0TWFsbG9jIChzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCX0KLQkJT1MubWVtbW92ZSAoc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIsIHNlbGVjdEJ1ZmZlci5sZW5ndGggKiA0KTsKLQkJcmV0dXJuIHNlbGVjdEJ1ZmZlclB0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIHRoZSBjdXJyZW50Ci0JICogPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgY3VycmVudCA8Y29kZT5HTENvbnRleHQ8L2NvZGU+LAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotCSAqICAgIDxsaT5FUlJPUl9HUkFQSElDX0RJU1BPU0VEIGlmIHRoZSByZWNlaXZlciBpcyBkaXNwb3NlZDwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgCVNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlyZXR1cm4gWEdMLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gaGFzIGJlZW4KLQkgKiBkaXNwb3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBnZXRzIHRoZSBkaXNwb3NlIHN0YXRlIGZvciB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiBXaGVuIGEgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgaXMgYW4gZXJyb3IgdG8KLQkgKiBpbnZva2UgYW55IG90aGVyIG1ldGhvZCB1c2luZyB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBpcyBkaXNwb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCAoKSB7Ci0JCXJldHVybiBoYW5kbGUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBmb250LgotCSAqIAotCSAqIEBwYXJhbSBmZGF0YQotCSAqIEBwYXJhbSBkZXZpY2UKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBmaXJzdAotCSAqIEBwYXJhbSBjb3VudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRCaXRtYXBGb250IChGb250RGF0YSBmZGF0YSwgRGV2aWNlIGRldmljZSwgaW50IGJhc2UsIGludCBzdGFydEluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCS8qIFRlbXBvcmFyeSBjb2RlLCBkdWUgc29tZSBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gVVRGLTggbG9hZEJpdG1hcEZvbnQgKCkKLQkJICogaXMgcmVzdHJpY3QgdG8gd29ya3Mgb25seSBmb3IgYXNjaWkuIAotCQkgKiBOb3RlOiBlbl9VUy5JU084ODU5LTEgYWxzbyBjb2RlIGJlIHVzZWQuCi0JCSAqLwotCQlmZGF0YS5zZXRMb2NhbGUgKCJDIik7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250IChkZXZpY2UsIGZkYXRhKTsKLQkJaW50IGZvbnRMaXN0ID0gZm9udC5oYW5kbGU7Ci0JCWludFtdIGJ1ZmZlciA9IG5ldyBpbnQgWzFdOwotCQlpZiAoIU9TLlhtRm9udExpc3RJbml0Rm9udENvbnRleHQgKGJ1ZmZlciwgZm9udExpc3QpKSByZXR1cm47Ci0JCWludCBjb250ZXh0ID0gYnVmZmVyIFswXTsKLQkJWEZvbnRTdHJ1Y3QgZm9udFN0cnVjdCA9IG5ldyBYRm9udFN0cnVjdCAoKTsKLQkJaW50IGZvbnRMaXN0RW50cnk7Ci0JCWludFtdIGZvbnRTdHJ1Y3RQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50W10gZm9udE5hbWVQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50IHhmb250ID0gMDsKLQkJLy8gZ28gdGhyb3VnaCBlYWNoIGVudHJ5IGluIHRoZSBmb250IGxpc3QKLQkJd2hpbGUgKChmb250TGlzdEVudHJ5ID0gT1MuWG1Gb250TGlzdE5leHRFbnRyeSAoY29udGV4dCkpICE9IDApIHsKLQkJCWludCBmb250UHRyID0gT1MuWG1Gb250TGlzdEVudHJ5R2V0Rm9udCAoZm9udExpc3RFbnRyeSwgYnVmZmVyKTsKLQkJCWlmIChidWZmZXIgWzBdID09IE9TLlhtRk9OVF9JU19GT05UKSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBzaW5nbGUgZm9udAotCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRQdHIsIDIwICogNCk7Ci0JCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBmb250U2V0Ci0JCQkJaW50IG5Gb250cyA9IE9TLlhGb250c09mRm9udFNldCAoZm9udFB0ciwgZm9udFN0cnVjdFB0ciwgZm9udE5hbWVQdHIpOwotCQkJCWludFtdIGZvbnRTdHJ1Y3RzID0gbmV3IGludCBbbkZvbnRzXTsKLQkJCQlPUy5tZW1tb3ZlIChmb250U3RydWN0cywgZm9udFN0cnVjdFB0ciBbMF0sIG5Gb250cyAqIDQpOwotCQkJCS8vIEdvIHRocm91Z2ggZWFjaCBmb250U3RydWN0IGluIHRoZSBmb250IHNldC4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSsrKSB7Ci0JCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRTdHJ1Y3RzIFtpXSwgWEZvbnRTdHJ1Y3Quc2l6ZW9mKTsKLQkJCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHhmb250ICE9IDApIHsKLQkJCVhHTC5nbFhVc2VYRm9udCAoeGZvbnQsIHN0YXJ0SW5kZXgsIGxlbmd0aCwgYmFzZSk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlICgpOwotCQlPUy5YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0IChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIG91dGxpbmUgZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRhdGEKLQkgKiBAcGFyYW0gZGV2aWNlCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZmlyc3QKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcGFyYW0gZGV2aWF0aW9uCi0JICogQHBhcmFtIGV4dHJ1c2lvbgotCSAqIEBwYXJhbSBmb3JtYXQKLQkgKiBAcGFyYW0gbHBnbWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3V0bGluZUZvbnQgKEZvbnREYXRhIGZkYXRhLCBEZXZpY2UgZGV2aWNlLCBpbnQgYmFzZSwgaW50IGZpcnN0LAotCWludCBjb3VudCwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIEdMWVBITUVUUklDU0ZMT0FUW10gbHBnbWYpIHsKLQkJLy8gc3R1YgotCX0KLQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzaXplIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDE7Ci0JCUdMLmdsVmlld3BvcnQgKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX1BST0pFQ1RJT04pOwotCQlHTC5nbExvYWRJZGVudGl0eSAoKTsKLQkJR0xVLmdsdVBlcnNwZWN0aXZlICg0NS4wZiwgKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0LCAwLjFmLCAxMDAuMGYpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX01PREVMVklFVyk7Ci0JCUdMLmdsTG9hZElkZW50aXR5ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlY2VpdmVyIHRvIGJlIHRoZSBjdXJyZW50IDxjb2RlPkdMQ29udGV4dDwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgU1dULmVycm9yIChTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSByZXR1cm47Ci0JCVhHTC5nbFhNYWtlQ3VycmVudCAoZGF0YS5kaXNwbGF5LCBkYXRhLmRyYXdhYmxlLCBoYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSByZWNlaXZlcidzIGJ1ZmZlcnMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQkJaWYgKGlzRGlzcG9zZWQgKCkpIFNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlYR0wuZ2xYU3dhcEJ1ZmZlcnMgKGRhdGEuZGlzcGxheSwgZGF0YS5kcmF3YWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvbW90aWYvWEdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhM2U1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuTGlicmFyeTsKLQotcHVibGljIGNsYXNzIFhHTCB7Ci0JCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OXzFfMSA9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTl8xXzIgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFUlNJT05fMV8zID0gMTsKLQotLyoKLSoqIFZpc3VhbCBDb25maWcgQXR0cmlidXRlcyAoZ2xYR2V0Q29uZmlnLCBnbFhHZXRGQkNvbmZpZ0F0dHJpYikKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVVNFX0dMCQk9IDE7CS8qIHN1cHBvcnQgR0xYIHJlbmRlcmluZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JVRkZFUl9TSVpFCQk9IDI7CS8qIGRlcHRoIG9mIHRoZSBjb2xvciBidWZmZXIgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MRVZFTAkJPSAzOwkvKiBsZXZlbCBpbiBwbGFuZSBzdGFja2luZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkEJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJPSA1OwkvKiBkb3VibGUgYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURVJFTwkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQk9IDc7CS8qIG51bWJlciBvZiBhdXggYnVmZmVycyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFRF9TSVpFCQk9IDg7CS8qIG51bWJlciBvZiByZWQgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkVFTl9TSVpFCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJPSAxMDsJLyogbnVtYmVyIG9mIGJsdWUgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BTFBIQV9TSVpFCQk9IDExOwkvKiBudW1iZXIgb2YgYWxwaGEgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9TSVpFCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQk9IDEzOwkvKiBudW1iZXIgb2Ygc3RlbmNpbCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fUkVEX1NJWkUJPSAxNDsJLyogbnVtYmVyIG9mIHJlZCBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fR1JFRU5fU0laRQk9IDE1OwkvKiBudW1iZXIgb2YgZ3JlZW4gYWNjdW0gYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX0JMVUVfU0laRQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCT0gMHgyMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRQk9IDB4MjQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCT0gMHgyNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQk9IDB4MjY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQk9IDB4Mjc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUJPSAweDI4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RSQVdBQkxFX1RZUEUJCT0gMHg4MDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkJPSAweDgwMTE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9SRU5ERVJBQkxFCQk9IDB4ODAxMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJCT0gMHg4MDEzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1dJRFRICQk9IDB4ODAxNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwkJPSAweDgwMTg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0lECQkJPSAweDgwMEI7Ci0KLS8qCi0qKiBFcnJvciByZXR1cm4gdmFsdWVzIGZyb20gZ2xYR2V0Q29uZmlnLiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkKLSoqIGEgdmFsdWUgb2YgMC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1NDUkVFTgkJPSAxOwkvKiBzY3JlZW4gIyBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfQVRUUklCVVRFCT0gMjsJLyogYXR0cmlidXRlIHRvIGdldCBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT19FWFRFTlNJT04JPSAzOwkvKiBubyBnbHggZXh0ZW5zaW9uIG9uIHNlcnZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WSVNVQUwJCT0gNDsJLyogdmlzdWFsICMgbm90IGtub3duIGJ5IEdMWCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9DT05URVhUCQk9IDU7CS8qIHJldHVybmVkIG9ubHkgYnkgaW1wb3J0X2NvbnRleHQgRVhUPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WQUxVRQkJPSA2OwkvKiByZXR1cm5lZCBvbmx5IGJ5IGdsWFN3YXBJbnRlcnZhbFNHST8gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfRU5VTQkJPSA3OwkvKiB1bnVzZWQ/ICovCi0KLS8qIEZCQ29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLQotLyoKLSoqIEdlbmVyaWMgImRvbid0IGNhcmUiIHZhbHVlIGZvciBnbFggQ2hvb3NlRkJDb25maWcgYXR0cmlidXRlcyAoZXhjZXB0Ci0qKiBHTFhfTEVWRUwpCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RPTlRfQ0FSRQkJCT0gMHhGRkZGRkZGRjsKLQotLyogR0xYX1JFTkRFUl9UWVBFIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9CSVQJCT0gMHgwMDAwMDAwMjsKLQotLyogR0xYX0RSQVdBQkxFX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPV19CSVQJCQk9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUElYTUFQX0JJVAkJCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0JJVAkJCT0gMHgwMDAwMDAwNDsKLQotLyogR0xYX0NPTkZJR19DQVZFQVQgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQk9IDB4ODAwOTsKLQotLyogZ2xYQ3JlYXRlR0xYUGJ1ZmZlciBhdHRyaWJ1dGVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTCQk9IDB4ODAxQjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MQVJHRVNUX1BCVUZGRVIJCT0gMHg4MDFDOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfSEVJR0hUCQk9IDB4ODA0MDsJLyogTmV3IGZvciBHTFggMS4zICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9XSURUSAkJPSAweDgwNDE7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotCi0vKiBnbFhRdWVyeUdMWFBCdWZmZXIgYXR0cmlidXRlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJRFRICQkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQkJPSAweDgwMUU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVZFTlRfTUFTSwkJCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCQk9IDB4ODAxNTsKLQotLyogZ2xYUXVlcnlDb250ZXh0IGF0dHJpYnV0ZXMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJICAweDgwMTMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRU5ERVJfVFlQRQkJICAweDgwMTEgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU4JCQk9IDB4ODAwQzsKLQotLyogZ2xYU2VsZWN0RXZlbnQgZXZlbnQgbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sJPSAweDA4MDAwMDAwOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGV2ZW50X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfREFNQUdFRAkJCT0gMHg4MDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NBVkVECQkJPSAweDgwMjE7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZHJhd190eXBlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPVwkJCT0gMHg4MDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVIJCQk9IDB4ODAyMzsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBidWZmZXJfbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVAk9IDB4MDAwMDAwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BVVhfQlVGRkVSU19CSVQJCT0gMHgwMDAwMDAxMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RFTkNJTF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQlVGRkVSX0JJVAkJPSAweDAwMDAwMDgwOwotCi0vKgotKiogRXh0ZW5zaW9uIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBUaGVzZSBhcmUgYWxzbwotKiogYWNjZXB0ZWQgYXMgcGFyYW1ldGVyIHZhbHVlcyBmb3IgZ2xYQ2hvb3NlVmlzdWFsLgotKi8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1hfVklTVUFMX1RZUEVfRVhUCT0gMHgyMjsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9UWVBFX0VYVCA9IDB4MjM7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFX0VYVCA9IDB4MjQ7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9FWFQJPSAweDI1OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9FWFQgPSAweDI2OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFX0VYVAk9IDB4Mjc7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFX0VYVCA9IDB4Mjg7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF90eXBlICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJVRV9DT0xPUl9FWFQJPSAweDgwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRElSRUNUX0NPTE9SX0VYVAk9IDB4ODAwMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QU0VVRE9fQ09MT1JfRVhUCT0gMHg4MDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NUQVRJQ19DT0xPUl9FWFQJPSAweDgwMDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfR1JBWV9TQ0FMRV9FWFQJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVlfRVhUCT0gMHg4MDA3OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHRyYW5zcGFyZW50IHBpeGVsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORV9FWFQJCT0gMHg4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JHQl9FWFQJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX0VYVAk9IDB4ODAwOTsKLQotLyogUHJvcGVydHkgdmFsdWVzIGZvciB2aXN1YWxfcmF0aW5nICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0NBVkVBVF9FWFQJCT0gMHgyMDsgIC8qIHZpc3VhbF9yYXRpbmcgZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX1ZJU1VBTF9FWFQJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX1ZJU1VBTF9FWFQJPSAweDgwMEQ7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhHZXRDbGllbnRTdHJpbmcuCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFTkRPUgkJPSAweDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTgkJPSAweDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhURU5TSU9OUwkJPSAweDM7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhRdWVyeUNvbnRleHRJbmZvRVhULgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TSEFSRV9DT05URVhUX0VYVAk9IDB4ODAwQTsJLyogaWQgb2Ygc2hhcmUgY29udGV4dCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZJU1VBTF9JRF9FWFQJPSAweDgwMEI7CS8qIGlkIG9mIGNvbnRleHQncyB2aXN1YWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU5fRVhUCQk9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKiBHTFggRXh0ZW5zaW9uIFN0cmluZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRfaW1wb3J0X2NvbnRleHQJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0VYVF92aXN1YWxfaW5mbwk9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzID0gMTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWENob29zZVZpc3VhbChpbnQgZHB5LCBpbnQgc2NyZWVuLCBpbnRbXSBhdHRyaWJMaXN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYQ29weUNvbnRleHQoaW50IGRweSwgaW50IHNyYywgaW50IGRzdCwgaW50IG1hc2spOwotLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBpbnQgdmlzLCBpbnQgc2hhcmVMaXN0LCBib29sZWFuIGRpcmVjdCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YVmlzdWFsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgwMzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotIAotcHVibGljIGNsYXNzIFhWaXN1YWxJbmZvIHsKLQlwdWJsaWMgaW50IHZpc3VhbDsKLQlwdWJsaWMgaW50IHZpc3VhbGlkOwotCXB1YmxpYyBpbnQgc2NyZWVuOwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0JcHVibGljIGludCBjY2xhc3M7Ci0JcHVibGljIGludCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOwotCXB1YmxpYyBpbnQgY29sb3JtYXBfc2l6ZTsKLQlwdWJsaWMgaW50IGJpdHNfcGVyX3JnYjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMDNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgT3BlbkdMIEJpbmRpbmdzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iJHdzJC9zd3QuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Q5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXJlbSAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotcmVtICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1yZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotcmVtICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAgCi1yZW0gIENvbnRyaWJ1dG9yczoKLXJlbSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQGVjaG8gb2ZmCi0KLUlGIE5PVCAiJUpBVkFfSE9NRSUiPT0iIiBHT1RPIE1BS0UKLQotcmVtICoqKioqCi1yZW0gSmF2YWgKLXJlbSAqKioqKgotc2V0IEpBVkFfSE9NRT1qOlx0ZWFtc3d0XHN3dC1idWlsZGRpclxpdmVcYmluCi1zZXQgcGF0aD0lSkFWQV9IT01FJTslcGF0aCUKLQotcmVtICoqKioqKioqCi1yZW0gTVNWQyA2LjAKLXJlbSAqKioqKioqKgotY2FsbCBrOlxkZXZccHJvZHVjdHNcbXN2YzYwXHZjOThcYmluXHZjdmFyczMyLmJhdAotCi1yZW0gKioqKioqIAotcmVtIE1TLVNESwotcmVtICoqKioqKgotc2V0IE1zc2RrPWo6XHRlYW1zd3Rcc3d0LWJ1aWxkZGlyXG1zc2RrCi1jYWxsICVtc3NkayVcc2V0ZW52LmJhdAotCi06TUFLRQotbm1ha2UgLWYgbWFrZV93aW4zMi5tYWsgJTEgJTIgJTMgJTQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L2dsdy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzhlZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luZ2RpLmg+Ci0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFdHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX1dHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxKQotewotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJDaG9vc2VQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcxKSBscGFyZzEgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpQ2hvb3NlUGl4ZWxGb3JtYXQoKEhEQylhcmcwLCAoQ09OU1QgUElYRUxGT1JNQVRERVNDUklQVE9SICopbHBhcmcxKTsKLQlpZiAoYXJnMSkgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRShEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGpvYmplY3QgYXJnMykKLXsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgX2FyZzMsICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiRGVzY3JpYmVQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmczKSBscGFyZzMgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCAmX2FyZzMpOwotCXJjID0gKGppbnQpRGVzY3JpYmVQaXhlbEZvcm1hdCgoSERDKWFyZzAsIGFyZzEsIGFyZzIsIChMUFBJWEVMRk9STUFUREVTQ1JJUFRPUilscGFyZzMpOwotCWlmIChhcmczKSBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCBscGFyZzMpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKEdldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJHZXRQaXhlbEZvcm1hdFxuIikKLQotCXJldHVybiAoamludClHZXRQaXhlbEZvcm1hdCgoSERDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFNldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqb2JqZWN0IGFyZzIpCi17Ci0JUElYRUxGT1JNQVRERVNDUklQVE9SIF9hcmcyLCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJTZXRQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcyLCAmX2FyZzIpOwotCXJjID0gKGpib29sZWFuKVNldFBpeGVsRm9ybWF0KChIREMpYXJnMCwgYXJnMSwgKENPTlNUIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqKWxwYXJnMik7Ci0JaWYgKGFyZzIpIHNldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzIsIGxwYXJnMik7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJTd2FwQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pU3dhcEJ1ZmZlcnMoKEhEQylhcmcwKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoIndnbENvcHlDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xDb3B5Q29udGV4dCgoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEsIChVSU5UKWFyZzIpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlQ29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xDcmVhdGVDb250ZXh0KChIREMpYXJnMCk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDcmVhdGVMYXllckNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlTGF5ZXJDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqaW50KXdnbENyZWF0ZUxheWVyQ29udGV4dCgoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlbGV0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCURFQlVHX0NBTEwoIndnbERlbGV0ZUNvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGpib29sZWFuKXdnbERlbGV0ZUNvbnRleHQoKEhHTFJDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlc2NyaWJlTGF5ZXJQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpvYmplY3QgYXJnNCkKLXsKLQlMQVlFUlBMQU5FREVTQ1JJUFRPUiBfYXJnNCwgKmxwYXJnND1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsRGVzY3JpYmVMYXllclBsYW5lXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9IGdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKGVudiwgYXJnNCwgJl9hcmc0KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xEZXNjcmliZUxheWVyUGxhbmUoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCAoTFBMQVlFUlBMQU5FREVTQ1JJUFRPUilscGFyZzQpOwotCWlmIChhcmc0KSBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzQsIGxwYXJnNCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlERUJVR19DQUxMKCJ3Z2xHZXRDdXJyZW50Q29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xHZXRDdXJyZW50Q29udGV4dCgpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudERDKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgid2dsR2V0Q3VycmVudERDXG4iKQotCi0JcmV0dXJuIChqaW50KXdnbEdldEN1cnJlbnREQygpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJ3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCXJjID0gKGppbnQpd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChDT0xPUlJFRiAqKWxwYXJnNCk7Ci0JaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbEdldFByb2NBZGRyZXNzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbEdldFByb2NBZGRyZXNzXG4iKQotCi0JaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQlyYyA9IChqaW50KXdnbEdldFByb2NBZGRyZXNzKChMUENTVFIpbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJ3Z2xNYWtlQ3VycmVudFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsTWFrZUN1cnJlbnQoKEhEQylhcmcwLCAoSEdMUkMpYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsUmVhbGl6ZUxheWVyUGFsZXR0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamJvb2xlYW4gYXJnMikKLXsKLQlERUJVR19DQUxMKCJ3Z2xSZWFsaXplTGF5ZXJQYWxldHRlXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKChIREMpYXJnMCwgYXJnMSwgKEJPT0wpYXJnMik7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludEFycmF5IGFyZzQpCi17Ci0JamludCAqbHBhcmc0PU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbFNldExheWVyUGFsZXR0ZUVudHJpZXNcbiIpCi0KLQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JcmMgPSAoamludCl3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKENPTlNUIENPTE9SUkVGICopbHBhcmc0KTsKLQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFNoYXJlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU2hhcmVMaXN0c1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU2hhcmVMaXN0cygoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFN3YXBMYXllckJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU3dhcExheWVyQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU3dhcExheWVyQnVmZmVycygoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRCaXRtYXBzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgid2dsVXNlRm9udEJpdG1hcHNBXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xVc2VGb250Qml0bWFwc0EoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xVc2VGb250Qml0bWFwc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRCaXRtYXBzV1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsVXNlRm9udEJpdG1hcHNXKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsVXNlRm9udE91dGxpbmVzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSwgamludCBhcmc2LCBqb2JqZWN0IGFyZzcpCi17Ci0vLwlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnNywgKmxwYXJnNz1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsVXNlRm9udE91dGxpbmVzQVxuIikKLQotLy8JaWYgKGFyZzcpIGxwYXJnNyA9IGdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKGVudiwgYXJnNywgJl9hcmc3KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xVc2VGb250T3V0bGluZXNBKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKEZMT0FUKWFyZzQsIChGTE9BVClhcmc1LCBhcmc2LCAoTFBHTFlQSE1FVFJJQ1NGTE9BVClhcmc3KTsKLS8vCWlmIChhcmc3KSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsIGxwYXJnNyk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRPdXRsaW5lc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGppbnQgYXJnNiwgam9iamVjdCBhcmc3KQotewotLy8JR0xZUEhNRVRSSUNTRkxPQVQgX2FyZzcsICpscGFyZzc9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRPdXRsaW5lc1dcbiIpCi0KLS8vCWlmIChhcmc3KSBscGFyZzcgPSBnZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsICZfYXJnNyk7Ci0JcmMgPSAoamJvb2xlYW4pd2dsVXNlRm9udE91dGxpbmVzVygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChGTE9BVClhcmc0LCAoRkxPQVQpYXJnNSwgYXJnNiwgKExQR0xZUEhNRVRSSUNTRkxPQVQpYXJnNyk7Ci0vLwlpZiAoYXJnNykgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmc3LCBscGFyZzcpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBXR0xfTkFUSVZFKE1vdmVNZW1vcnlXX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF93aW4zMl9HTFlQSE1FVFJJQ1NGTE9BVF8ySUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgam9iamVjdCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnMCwgKmxwYXJnMD1OVUxMOwotCi0JREVCVUdfQ0FMTCgiTW92ZU1lbW9yeVdfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSVxuIikKLQlERUJVR19DSEVDS19OVUxMKGVudiwgYXJnMSkKLQkKLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCU1vdmVNZW1vcnkoKFBWT0lEKWxwYXJnMCwgKENPTlNUIFZPSUQgKilhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMCkgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFdHTF9OQVRJVkUoTW92ZU1lbW9yeUFfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMWVBITUVUUklDU0ZMT0FUIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJNb3ZlTWVtb3J5QV9fTG9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfaW50ZXJuYWxfd2luMzJfR0xZUEhNRVRSSUNTRkxPQVRfMklJXG4iKQotCURFQlVHX0NIRUNLX05VTEwoZW52LCBhcmcxKQotCQotCWlmIChhcmcwKSBscGFyZzAgPSAmX2FyZzA7Ci0JTW92ZU1lbW9yeSgoUFZPSUQpbHBhcmcwLCAoQ09OU1QgVk9JRCAqKWFyZzEsIGFyZzIpOwotCWlmIChhcmcwKSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzAsIGxwYXJnMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvbWFrZV93aW4zMi5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1haworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgYXNzdW1lcyBKQVZBX0hPTUUgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBmcm9tIHdoaWNoIG5tYWtlIGlzIHJ1bgotCi1BUFBWRVI9NS4wCi0haW5jbHVkZSA8d2luMzIubWFrPgotCi1wZ21fdmVyX3N0cj0iU1dUICQobWFqX3ZlcikuJChtaW5fdmVyKSBmb3IgV2luZG93cyIKLXRpbWVzdGFtcF9zdHI9X19EQVRFX19cIiBcIl9fVElNRV9fXCIgKEVTVClcIgotY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoQykgMTk5OSwgMjAwMyBJQk0gQ29ycC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIgotCi1TV1RfUFJFRklYPWdsCi1XU19QUkVGSVg9d2luMzIKLVNXVF9MSUIgICAgID0gJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuZGxsCi0KLUxJTktfTElCUyA9IG9wZW5nbDMyLmxpYiBnbHUzMi5saWIgZ2RpMzIubGliCi0KLSMgbm90ZTogdGhvcm91Z2hseSB0ZXN0IGFsbCBleGFtcGxlcyBhZnRlciBjaGFuZ2luZyBhbnkgb3B0aW1pemF0aW9uIGZsYWdzCi1TV1RfQ0RFQlVHID0gIy1aaSAtT2RpCi1TV1RfTERFQlVHID0gIy9ERUJVRyAvREVCVUdUWVBFOmJvdGgKLUNGTEFHUyA9IC1jIC1XMyAtRzYgLUdEIC1PMSAkKFNXVF9DREVCVUcpIC1ub2xvZ28gLURfWDg2Xz0xIC1EX1dJTjMyIC1EX1dJTjk1IC1EX1dJTjMyX1dJTkRPV1M9MHgwNDAwIC1EX01UIC1NVCAtRFdJTjMyIC1EX1dJTjMyX0RDT00gL0kkKEpBVkFfSE9NRSlcaW5jbHVkZSAvSS4KLVJDRkxBR1MgPSAtRFNXVF9DT01NQV9WRVJTSU9OPSQoY29tbWFfdmVyKQotTEZMQUdTID0gL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPICQoU1dUX0xERUJVRykgLWVudHJ5Ol9EbGxNYWluQ1JUU3RhcnR1cEAxMiAtZGxsIC9CQVNFOjB4MTAwMDAwMDAgL2NvbW1lbnQ6JChwZ21fdmVyX3N0cikgL2NvbW1lbnQ6JChjb3B5cmlnaHQpIC9ETEwKLQotU1dUX09CSlMgPSBzd3Qub2JqIGdsLm9iaiBnbHUub2JqIGdsdy5vYmogc3RydWN0cy5vYmoKLQotYWxsOiAkKFNXVF9MSUIpCi0KLS5jLm9iajoKLQljbCAkKENGTEFHUykgJCouYwotCi0kKFNXVF9MSUIpOiAkKFNXVF9PQkpTKSBzd3QucmVzCi0JZWNobyAkKExGTEFHUykgPnRlbXBscmYKLQllY2hvICQoTElOS19MSUJTKSA+PnRlbXBscmYKLQllY2hvIC1tYWNoaW5lOklYODYgPj50ZW1wbHJmCi0JZWNobyAtc3Vic3lzdGVtOndpbmRvd3MgPj50ZW1wbHJmCi0JZWNobyAtb3V0OiQoU1dUX0xJQikgPj50ZW1wbHJmCi0JZWNobyAkKFNXVF9PQkpTKSA+PnRlbXBscmYKLQllY2hvIHN3dC5yZXMgPj50ZW1wbHJmCi0JbGluayBAdGVtcGxyZgotCWRlbCB0ZW1wbHJmCi0JCi1zd3QucmVzOgotCXJjICQoUkNGTEFHUykgLURTV1RfT1JHX0ZJTEVOQU1FPVwiJChTV1RfTElCKVwiIC1yIC1mbyBzd3QucmVzIHN3dC5yYwotCQotY2xlYW46Ci0gICAgZGVsICoub2JqICoucmVzICouZGxsICoubGliICouZXhwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODQzNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJzdHJ1Y3RzLmgiCi0KLXR5cGVkZWYgc3RydWN0IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSB7Ci0JaW50IGNhY2hlZDsKLQlqY2xhc3MgY2xheno7Ci0JamZpZWxkSUQgZ21mQ2VsbEluY1ksIGdtZkNlbGxJbmNYLCBnbWZwdEdseXBoT3JpZ2luX3ksIGdtZnB0R2x5cGhPcmlnaW5feCwgZ21mQmxhY2tCb3hZLCBnbWZCbGFja0JveFg7Ci19IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRTsKLXR5cGVkZWYgR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFICpQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFOwotCi1HTFlQSE1FVFJJQ1NGTE9BVF9GSURfQ0FDSEUgR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQotdm9pZCBjYWNoZUdMWVBITUVUUklDU0ZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Z21mQ2VsbEluY1kgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZkNlbGxJbmNZIiwgIkYiKTsKLQlscENhY2hlLT5nbWZDZWxsSW5jWCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQ2VsbEluY1giLCAiRiIpOwotCWxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mcHRHbHlwaE9yaWdpbl95IiwgIkYiKTsKLQlscENhY2hlLT5nbWZwdEdseXBoT3JpZ2luX3ggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZnB0R2x5cGhPcmlnaW5feCIsICJGIik7Ci0JbHBDYWNoZS0+Z21mQmxhY2tCb3hZID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJnbWZCbGFja0JveFkiLCAiRiIpOwotCWxwQ2FjaGUtPmdtZkJsYWNrQm94WCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQmxhY2tCb3hYIiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1HTFlQSE1FVFJJQ1NGTE9BVCAqZ2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmdtZkNlbGxJbmNZID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZKTsKLQlscFN0cnVjdC0+Z21mQ2VsbEluY1ggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQ2VsbEluY1gpOwotCWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl95KTsKLQlscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi54ID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feCk7Ci0JbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSA9ICgqZW52KS0+R2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFkpOwotCWxwU3RydWN0LT5nbWZCbGFja0JveFggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQmxhY2tCb3hYKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNYLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWCk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSwgKGpmbG9hdClscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi55KTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl94LCAoamZsb2F0KWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLngpOwotCSgqZW52KS0+U2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFksIChqZmxvYXQpbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkJsYWNrQm94WCwgKGpmbG9hdClscFN0cnVjdC0+Z21mQmxhY2tCb3hYKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBjclRyYW5zcGFyZW50LCBiUmVzZXJ2ZWQsIGlMYXllclBsYW5lLCBjQXV4QnVmZmVycywgY1N0ZW5jaWxCaXRzLCBjRGVwdGhCaXRzLCBjQWNjdW1BbHBoYUJpdHMsIGNBY2N1bUJsdWVCaXRzLCBjQWNjdW1HcmVlbkJpdHMsIGNBY2N1bVJlZEJpdHMsIGNBY2N1bUJpdHMsIGNBbHBoYVNoaWZ0LCBjQWxwaGFCaXRzLCBjQmx1ZVNoaWZ0LCBjQmx1ZUJpdHMsIGNHcmVlblNoaWZ0LCBjR3JlZW5CaXRzLCBjUmVkU2hpZnQsIGNSZWRCaXRzLCBjQ29sb3JCaXRzLCBpUGl4ZWxUeXBlLCBkd0ZsYWdzLCBuVmVyc2lvbiwgblNpemU7Ci19IExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFICpQTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFOwotCi1MQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgTEFZRVJQTEFORURFU0NSSVBUT1JGYzsKLQotdm9pZCBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY3JUcmFuc3BhcmVudCIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJpTGF5ZXJQbGFuZSIsICJCIik7Ci0JbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBdXhCdWZmZXJzIiwgIkIiKTsKLQlscENhY2hlLT5jU3RlbmNpbEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNTdGVuY2lsQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0RlcHRoQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1BbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CbHVlQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1HcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bVJlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWxwaGFTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjR3JlZW5TaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0dyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0NvbG9yQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0NvbG9yQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiaVBpeGVsVHlwZSIsICJCIik7Ci0JbHBDYWNoZS0+ZHdGbGFncyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZHdGbGFncyIsICJJIik7Ci0JbHBDYWNoZS0+blZlcnNpb24gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5WZXJzaW9uIiwgIlMiKTsKLQlscENhY2hlLT5uU2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiblNpemUiLCAiUyIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLUxBWUVSUExBTkVERVNDUklQVE9SICpnZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KQotewotCVBMQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZMQVlFUlBMQU5FREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aUxheWVyUGxhbmUpOwotCWxwU3RydWN0LT5jQXV4QnVmZmVycyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBdXhCdWZmZXJzKTsKLQlscFN0cnVjdC0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzKTsKLQlscFN0cnVjdC0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1BbHBoYUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhU2hpZnQpOwotCWxwU3RydWN0LT5jQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cyk7Ci0JbHBTdHJ1Y3QtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0dyZWVuU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5TaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0KTsKLQlscFN0cnVjdC0+Y1JlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jUmVkQml0cyk7Ci0JbHBTdHJ1Y3QtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzKTsKLQlscFN0cnVjdC0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUpOwotCWxwU3RydWN0LT5kd0ZsYWdzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzKTsKLQlscFN0cnVjdC0+blZlcnNpb24gPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24pOwotCWxwU3RydWN0LT5uU2l6ZSA9ICgqZW52KS0+R2V0U2hvcnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5uU2l6ZSk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJkxBWUVSUExBTkVERVNDUklQVE9SRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlTEFZRVJQTEFORURFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCwgKGppbnQpbHBTdHJ1Y3QtPmNyVHJhbnNwYXJlbnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclBsYW5lLCAoamJ5dGUpbHBTdHJ1Y3QtPmlMYXllclBsYW5lKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycywgKGpieXRlKWxwU3RydWN0LT5jQXV4QnVmZmVycyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0RlcHRoQml0cywgKGpieXRlKWxwU3RydWN0LT5jRGVwdGhCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtUmVkQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1SZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0JsdWVTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlbkJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y1JlZEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNDb2xvckJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0NvbG9yQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aVBpeGVsVHlwZSwgKGpieXRlKWxwU3RydWN0LT5pUGl4ZWxUeXBlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3RmxhZ3MsIChqaW50KWxwU3RydWN0LT5kd0ZsYWdzKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24sIChqc2hvcnQpbHBTdHJ1Y3QtPm5WZXJzaW9uKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUsIChqc2hvcnQpbHBTdHJ1Y3QtPm5TaXplKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgUE9JTlRGTE9BVF9GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHksIHg7Ci19IFBPSU5URkxPQVRfRklEX0NBQ0hFOwotdHlwZWRlZiBQT0lOVEZMT0FUX0ZJRF9DQUNIRSAqUFBPSU5URkxPQVRfRklEX0NBQ0hFOwotCi1QT0lOVEZMT0FUX0ZJRF9DQUNIRSBQT0lOVEZMT0FURmM7Ci0KLXZvaWQgY2FjaGVQT0lOVEZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUFBPSU5URkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT55ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ5IiwgIkYiKTsKLQlscENhY2hlLT54ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ4IiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QT0lOVEZMT0FUICpnZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCkKLXsKLQlQUE9JTlRGTE9BVF9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQT0lOVEZMT0FURmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlUE9JTlRGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSk7Ci0JbHBTdHJ1Y3QtPnggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eCk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldFBPSU5URkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBPSU5URkxPQVQgKmxwU3RydWN0KQotewotCVBQT0lOVEZMT0FUX0ZJRF9DQUNIRSBscENhY2hlID0gJlBPSU5URkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQT0lOVEZMT0FURmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSwgKGpmbG9hdClscFN0cnVjdC0+eSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPngsIChqZmxvYXQpbHBTdHJ1Y3QtPngpOwotfQotCi10eXBlZGVmIHN0cnVjdCBQSVhFTEZPUk1BVERFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBkd0RhbWFnZU1hc2ssIGR3VmlzaWJsZU1hc2ssIGR3TGF5ZXJNYXNrLCBiUmVzZXJ2ZWQsIGlMYXllclR5cGUsIGNBdXhCdWZmZXJzLCBjU3RlbmNpbEJpdHMsIGNEZXB0aEJpdHMsIGNBY2N1bUFscGhhQml0cywgY0FjY3VtQmx1ZUJpdHMsIGNBY2N1bUdyZWVuQml0cywgY0FjY3VtUmVkQml0cywgY0FjY3VtQml0cywgY0FscGhhU2hpZnQsIGNBbHBoYUJpdHMsIGNCbHVlU2hpZnQsIGNCbHVlQml0cywgY0dyZWVuU2hpZnQsIGNHcmVlbkJpdHMsIGNSZWRTaGlmdCwgY1JlZEJpdHMsIGNDb2xvckJpdHMsIGlQaXhlbFR5cGUsIGR3RmxhZ3MsIG5WZXJzaW9uLCBuU2l6ZTsKLX0gUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSAqUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEU7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgUElYRUxGT1JNQVRERVNDUklQVE9SRmM7Ci0KLXZvaWQgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0RhbWFnZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3VmlzaWJsZU1hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3VmlzaWJsZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0xheWVyTWFzayIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlMYXllclR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmNBdXhCdWZmZXJzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQXV4QnVmZmVycyIsICJCIik7Ci0JbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjU3RlbmNpbEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNEZXB0aEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUFscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQWxwaGFCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtR3JlZW5CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1SZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1SZWRCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNCbHVlU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jR3JlZW5TaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNHcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZFNoaWZ0IiwgIkIiKTsKLQlscENhY2hlLT5jUmVkQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNDb2xvckJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlQaXhlbFR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmR3RmxhZ3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3RmxhZ3MiLCAiSSIpOwotCWxwQ2FjaGUtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJuVmVyc2lvbiIsICJTIik7Ci0JbHBDYWNoZS0+blNpemUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5TaXplIiwgIlMiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QSVhFTEZPUk1BVERFU0NSSVBUT1IgKmdldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUElYRUxGT1JNQVRERVNDUklQVE9SICpscFN0cnVjdCkKLXsKLQlQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJlBJWEVMRk9STUFUREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmR3RGFtYWdlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrKTsKLQlscFN0cnVjdC0+ZHdWaXNpYmxlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdWaXNpYmxlTWFzayk7Ci0JbHBTdHJ1Y3QtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0xheWVyTWFzayk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pTGF5ZXJUeXBlKTsKLQlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycyk7Ci0JbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cyk7Ci0JbHBTdHJ1Y3QtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jRGVwdGhCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1SZWRCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJpdHMpOwotCWxwU3RydWN0LT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQmx1ZVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQpOwotCWxwU3RydWN0LT5jR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMpOwotCWxwU3RydWN0LT5jQ29sb3JCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0NvbG9yQml0cyk7Ci0JbHBTdHJ1Y3QtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pUGl4ZWxUeXBlKTsKLQlscFN0cnVjdC0+ZHdGbGFncyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdGbGFncyk7Ci0JbHBTdHJ1Y3QtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uKTsKLQlscFN0cnVjdC0+blNpemUgPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQSVhFTEZPUk1BVERFU0NSSVBUT1JGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrLCAoamludClscFN0cnVjdC0+ZHdEYW1hZ2VNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3VmlzaWJsZU1hc2ssIChqaW50KWxwU3RydWN0LT5kd1Zpc2libGVNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3TGF5ZXJNYXNrLCAoamludClscFN0cnVjdC0+ZHdMYXllck1hc2spOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aUxheWVyVHlwZSk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMsIChqYnl0ZSlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cywgKGpieXRlKWxwU3RydWN0LT5jU3RlbmNpbEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0RlcHRoQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUFscGhhQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQmx1ZUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1HcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlblNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jUmVkU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNDb2xvckJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aVBpeGVsVHlwZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzLCAoamludClscFN0cnVjdC0+ZHdGbGFncyk7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uLCAoanNob3J0KWxwU3RydWN0LT5uVmVyc2lvbik7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5TaXplLCAoanNob3J0KWxwU3RydWN0LT5uU2l6ZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNjJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotR0xZUEhNRVRSSUNTRkxPQVQgKmdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBHTFlQSE1FVFJJQ1NGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgR0xZUEhNRVRSSUNTRkxPQVQgKmxwU3RydWN0KTsKLQotTEFZRVJQTEFORURFU0NSSVBUT1IgKmdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQotUE9JTlRGTE9BVCAqZ2V0UE9JTlRGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUE9JTlRGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCk7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUiAqZ2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLXZvaWQgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIzNTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N3dC5yYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBQUk9EVUNUVkVSU0lPTiAwLDAsMCwwCi0gRklMRUZMQUdTTUFTSyAweDNmTAotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDFMCi0jZWxzZQotIEZJTEVGTEFHUyAweDBMCi0jZW5kaWYKLSBGSUxFT1MgMHg0MDAwMEwKLSBGSUxFVFlQRSAweDJMCi0gRklMRVNVQlRZUEUgMHgwTAotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgotICAgICAgICBCRUdJTgotICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIklCTSBDb3Jwb3JhdGlvblwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdFwwIgotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTV1RcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICKpIENvcHlyaWdodCAyMDAwLCAyMDAzIElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cMCIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgU1dUX09SR19GSUxFTkFNRQotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjAsMCwwLDBcMCIKLSAgICAgICAgRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCi0gICAgRU5ECi1FTkQKLQotLyogU0hNRU5VQkFSIFBvY2tldCBQQyAKLSAqIElEX01FTlUgU0hNRU5VQkFSIERJU0NBUkRBQkxFCi0gKiBCRUdJTgotICogCUlEX01FTlUsIDEsCi0gKiAgSU1BR0VfTk9ORSwgSURfTUVOVV9JVEVNMSwgMCwgMCwKLSAqICAwLCAwLCAwLAotICogRU5ECi0gKiBJRF9NRU5VIE1FTlUgRElTQ0FSREFCTEUKLSAqIEJFR0lOCi0gKiAgTUVOVUlURU0gIiIsIElEX01FTlVfSVRFTTEKLSAqIEVORAotICovCi0xMDAgUkNEQVRBIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAxMDAsIDEsCi0gICAgLTIsIDEwMSwgMCwgMCwgCi0gICAgMCwgMCwgMCwKLUVORAotCi0xMDAgTUVOVSBESVNDQVJEQUJMRQotQkVHSU4KLQlNRU5VSVRFTSAiIiwgMTAxCi1FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7Ci0JaW50IGNvbnRleHQ7Ci0JaW50IHBpeGVsRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBwZmQgPSBuZXcgUElYRUxGT1JNQVRERVNDUklQVE9SICgpOwotCXBmZC5uU2l6ZSA9IChzaG9ydCkgUElYRUxGT1JNQVRERVNDUklQVE9SLnNpemVvZjsKLQlwZmQublZlcnNpb24gPSAxOwotCXBmZC5kd0ZsYWdzID0gV0dMLlBGRF9EUkFXX1RPX1dJTkRPVyB8IFdHTC5QRkRfU1VQUE9SVF9PUEVOR0w7Ci0JcGZkLmR3TGF5ZXJNYXNrID0gV0dMLlBGRF9NQUlOX1BMQU5FOwotCXBmZC5pUGl4ZWxUeXBlID0gKGJ5dGUpIFdHTC5QRkRfVFlQRV9SR0JBOwotCWlmIChkYXRhLmRvdWJsZUJ1ZmZlcikgcGZkLmR3RmxhZ3MgfD0gV0dMLlBGRF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBwZmQuZHdGbGFncyB8PSBXR0wuUEZEX1NURVJFTzsKLQlwZmQuY1JlZEJpdHMgPSAoYnl0ZSkgZGF0YS5yZWRTaXplOwotCXBmZC5jR3JlZW5CaXRzID0gKGJ5dGUpIGRhdGEuZ3JlZW5TaXplOwotCXBmZC5jQmx1ZUJpdHMgPSAoYnl0ZSkgZGF0YS5ibHVlU2l6ZTsKLQlwZmQuY0FscGhhQml0cyA9IChieXRlKSBkYXRhLmFscGhhU2l6ZTsKLQlwZmQuY0RlcHRoQml0cyA9IChieXRlKSBkYXRhLmRlcHRoU2l6ZTsKLQlwZmQuY1N0ZW5jaWxCaXRzID0gKGJ5dGUpIGRhdGEuc3RlbmNpbFNpemU7Ci0JcGZkLmNBY2N1bVJlZEJpdHMgPSAoYnl0ZSkgZGF0YS5hY2N1bVJlZFNpemU7Ci0JcGZkLmNBY2N1bUdyZWVuQml0cyA9IChieXRlKSBkYXRhLmFjY3VtR3JlZW5TaXplOwotCXBmZC5jQWNjdW1CbHVlQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JcGZkLmNBY2N1bUFscGhhQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCXBmZC5jQWNjdW1CaXRzID0gKGJ5dGUpIChwZmQuY0FjY3VtUmVkQml0cyArIHBmZC5jQWNjdW1HcmVlbkJpdHMgKyBwZmQuY0FjY3VtQmx1ZUJpdHMgKyBwZmQuY0FjY3VtQWxwaGFCaXRzKTsKLQkvL0ZJWE1FIC0gdXNlIHdnbENob29zZVBpeGVsRm9ybWF0QVJCCi0vLwlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVfQlVGRkVSU19BUkI7Ci0vLwkJd2dsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0vLwl9Ci0vLwlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVTX0FSQjsKLS8vCQl3Z2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuc2FtcGxlczsKLS8vCX0KLQotCWludCBoREMgPSBPUy5HZXREQyAoaGFuZGxlKTsKLQlwaXhlbEZvcm1hdCA9IFdHTC5DaG9vc2VQaXhlbEZvcm1hdCAoaERDLCBwZmQpOwotCWlmIChwaXhlbEZvcm1hdCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWlmICghV0dMLlNldFBpeGVsRm9ybWF0IChoREMsIHBpeGVsRm9ybWF0LCBwZmQpKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWNvbnRleHQgPSBXR0wud2dsQ3JlYXRlQ29udGV4dCAoaERDKTsKLQlpZiAoY29udGV4dCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0vLwlpZiAoc2hhcmUgIT0gbnVsbCkgewotLy8JCVdHTC53Z2xTaGFyZUxpc3RzIChjb250ZXh0LCBzaGFyZS5jb250ZXh0KTsKLS8vCX0KLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCVdHTC53Z2xEZWxldGVDb250ZXh0IChjb250ZXh0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgcGZkID0gbmV3IFBJWEVMRk9STUFUREVTQ1JJUFRPUiAoKTsKLQlwZmQublNpemUgPSAoc2hvcnQpIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2Y7Ci0JaW50IGhEQyA9IE9TLkdldERDIChoYW5kbGUpOwotCVdHTC5EZXNjcmliZVBpeGVsRm9ybWF0KGhEQywgcGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2YsIHBmZCk7Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSAocGZkLmR3RmxhZ3MgJiBXR0wuUEZEX0RPVUJMRUJVRkZFUikgIT0gMDsKLQlkYXRhLnN0ZXJlbyA9IChwZmQuZHdGbGFncyAmIFdHTC5QRkRfU1RFUkVPKSAhPSAwOwotCWRhdGEucmVkU2l6ZSA9IHBmZC5jUmVkQml0czsKLQlkYXRhLmdyZWVuU2l6ZSA9IHBmZC5jR3JlZW5CaXRzOwotCWRhdGEuYmx1ZVNpemUgPSBwZmQuY0JsdWVCaXRzOwotCWRhdGEuYWxwaGFTaXplID0gcGZkLmNBbHBoYUJpdHM7Ci0JZGF0YS5kZXB0aFNpemUgPSBwZmQuY0RlcHRoQml0czsKLQlkYXRhLnN0ZW5jaWxTaXplID0gcGZkLmNTdGVuY2lsQml0czsKLQlkYXRhLmFjY3VtUmVkU2l6ZSA9IHBmZC5jQWNjdW1SZWRCaXRzOwotCWRhdGEuYWNjdW1HcmVlblNpemUgPSBwZmQuY0FjY3VtR3JlZW5CaXRzOwotCWRhdGEuYWNjdW1CbHVlU2l6ZSA9IHBmZC5jQWNjdW1CbHVlQml0czsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gcGZkLmNBY2N1bUFscGhhQml0czsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGU7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGUpIHJldHVybjsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLndnbE1ha2VDdXJyZW50IChoREMsIGNvbnRleHQpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBiNDdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLkJyb3dzZXJEZW1vPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0Yjg4YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDozMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2NGRhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLkJyb3dzZXJEZW1vLmphciA9IHNyYy8KLW91dHB1dC5Ccm93c2VyRGVtby5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotCQkJICAgcGx1Z2luLnByb3BlcnRpZXMsXAotCQkJICAgcGx1Z2luLnhtbCxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEJyb3dzZXJEZW1vLmphcixcCi0gICAgICAgICAgICAgICBjc3MxLyxcCi0gICAgICAgICAgICAgICBjc3MyLyxcCi0gICAgICAgICAgICAgICBjc3MzLyxcCi0gICAgICAgICAgICAgICBjc3M0LyxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazEuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjlmMzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2syLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y2OGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ibGFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2YzFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNGQ1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JvYXJkMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2VtcHR5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJjZTRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzZmYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9iYWNrMi5qcGcpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBjZW50ZXI7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwO30NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6IDMycHg7IHdpZHRoOjMycHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2VtcHR5LmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZW1wdHkuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9lbXB0eS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbC5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtmbG9hdDogbGVmdDsgbWFyZ2luOiAxZW0gMWVtOyBib3JkZXI6IDFweCBzb2xpZCBncmF5OyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDsgdGV4dC1hbGlnbjogcmlnaHQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6MzJweDt9DQotLnBsYXllcmJsYWNrIHtmbG9hdDogcmlnaHQ7IG1hcmdpbjogMWVtIDFlbTsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHRleHQtYWxpZ246IHJpZ2h0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIGJsdWU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93YWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5N2ZjMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlN0YXJ0IGEgZ2FtZTwvdGl0bGU+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGF3bnMgR2FtZTwvaDE+Ci08ZGl2IGNsYXNzPSJzdGFydCI+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQxcGxheWVyIj4xIHBsYXllcjwvYT4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDJwbGF5ZXJzIj4yIHBsYXllcnM8L2E+Ci08L2Rpdj4KLTxoMj5Ib3cgdG8gcGxheTwvaDI+Ci1UaGlzIGJvYXJkIGdhbWUgaXMgYSB2YXJpYW50IG9mIFJldmVyc2kgYW5kIFRpYyBUYWMgVG9lLiBFYWNoIG9uZSBvZiB0aGUgdHdvIHBsYXllcnMgc2V0cyBhIHBhd24gb24gYW4gZW1wdHkgY2VsbCBvZiB0aGUgYm9hcmQuCi08aDM+UGF3bnM8L2gzPgotPHVsPgotPGxpIGNsYXNzPSJ3aGl0ZSI+UGxheWVyIDE8L2xpPgotPGxpIGNsYXNzPSJibGFjayI+UGxheWVyIDI8L2xpPgotPGxpIGNsYXNzPSJ3YWxsIj5XYWxsLiBDYW5ub3QgYmUgcmV2ZXJzZWQuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJ0aGVtZSI+Ci1EaWZmZXJlbnQgdGhlbWVzIGFyZSBzdXBwb3J0ZWQuIFRoZW1lIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIENhc2NhZGluZyBTdHlsZSBTaGVldCAoQ1NTKSB0aGF0IGRldGVybWluZXMgaG93IHRoZSBIVE1MIGNvbnRlbnQgaXMgcmVuZGVyZWQgYnkgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4KLTx1bCBjbGFzcz0idGhlbWUiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMSI+VGhlbWUgMTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMiI+VGhlbWUgMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMyI+VGhlbWUgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzNCI+VGhlbWUgNDwvYT48L2xpPgotPC91bD4KLQotPC9kaXY+Ci08aDI+SG93IHRvIHdpbjwvaDI+Ci1UaGUgZ2FtZSBlbmRzIHdoZW4gYWxsIGNlbGxzIGFyZSBmaWxsZWQuIFRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aXRoIG1vc3QgcGF3bnMgb2YgdGhlaXIgY29sb3VyLiAKLQotPGgyPkphdmEgYW5kIEhUTUwgaW50ZWdyYXRlZCB0aHJvdWdoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQ8L2gyPgotPHA+Ci1SZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIENvbXB1dGVyIG1vdmVzIGFyZSBwcm9ncmFtbWVkIGluIHJlZ3VsYXIKLUphdmEgY29kZSBpbiB0aGUgRWNsaXBzZSBwbHVnLWluLiBUaGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGlzIHVzZWQgZm9yIHJlbmRlcmluZyBhbmQgcmVhY3RpbmcKLXRvIHVzZXIgaW5wdXQuCi08L3A+Ci08aDM+SW1wbGVtZW50YXRpb248L2gzPgotPHA+Ci1UaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLTxicj5UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotPGJyPlBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGEgaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotPGNvZGU+aHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTI8L2NvZGU+LiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllciAoY29sdW1uIDEsIHJvdyAyKS4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2hpdGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93aGl0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2ZkOTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93aGl0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL0JhY2s2NDB4NDQwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvQmFjazY0MHg0NDAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzODIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvQmFjazY0MHg0NDAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9ibGFja19jaGlwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvYmxhY2tfY2hpcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzZlYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9ibGFja19jaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA3NDljLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vQmFjazY0MHg0NDAuZ2lmKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfY2hpcC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLQ0KLS5ib2FyZCB7dGV4dC1hbGlnbjogbGVmdDt9DQotdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDogdXJsKC4vdGV4dHVyZV9jZWxscy5naWYpfQ0KLXRyIHt9DQotdGQge2hlaWdodDo0OHB4OyB3aWR0aDo0OHB4OyB0YWJsZS1sYXlvdXQ6IGZpeGVkO30NCi0NCi0ud2hpdGVsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5lbXB0eSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0NCi0ud2hpdGVsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGVfY2hpcC5naWYpIG5vLXJlcGVhdDt9DQotLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19jaGlwLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9jaGlwLmdpZikgbm8tcmVwZWF0O30NCi0NCi0ucGxheWVyd2hpdGUge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0ucGxheWVyYmxhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzMDBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgd2hpdGU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3RleHR1cmVfY2VsbHMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi90ZXh0dXJlX2NlbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZWU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3RleHR1cmVfY2VsbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93YWxsX2NoaXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93YWxsX2NoaXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYwYjMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2FsbF9jaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3doaXRlX2NoaXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93aGl0ZV9jaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2ZDY1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3doaXRlX2NoaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9CYWNrNjQweDQ0MC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL0JhY2s2NDB4NDQwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzgyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL0JhY2s2NDB4NDQwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvYmxhY2tfcGF3bi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2JsYWNrX3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTFhNDFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvYmxhY2tfcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2xpbmUxLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvbGluZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwZjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvbGluZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9zdHlsZS5jc3MgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkZjA0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWJvZHkge2JhY2tncm91bmQ6IHVybCguL0JhY2s2NDB4NDQwLmdpZikgZml4ZWQ7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDEge3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB0OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDIge2JhY2tncm91bmQ6IHVybCguL2xpbmUxLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMyB7Zm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi0NCi11bCB7bGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMDsgbWFyZ2luOjA7IGZvbnQ6IDEycHQgVGltZXM7fQ0KLWxpLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9wYXduLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGxlZnQ7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwOyBwYWRkaW5nOjA7IGJhY2tncm91bmQ6IHVybCguL3RleHR1cmVfY2VsbHMuZ2lmKX0NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6NDhweDsgd2lkdGg6NDhweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX3Bhd24uZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfcGF3bi5naWYpIG5vLXJlcGVhdDt9DQotLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfcGF3bi5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotLnBsYXllcmJsYWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMzAwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBmb250OiBib2xkIDE2cHQgVGltZXMsIHNlcmlmO30NCi0ubG9zZXIge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmb250OiAxMnB0IFRpbWVzLCBzZXJpZjt9DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy90ZXh0dXJlX2NlbGxzLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvdGV4dHVyZV9jZWxscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmVlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy90ZXh0dXJlX2NlbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2FsbF9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2FsbF9wYXduLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1Y2Q1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dhbGxfcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dlbGNvbWUuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2VsY29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5MmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2VsY29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U3RhcnQgYSBnYW1lPC90aXRsZT4KLQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5QYXducyBHYW1lPC9oMT4KLTxkaXYgY2xhc3M9InN0YXJ0Ij4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDFwbGF5ZXIiPjEgcGxheWVyPC9hPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MnBsYXllcnMiPjIgcGxheWVyczwvYT4KLTwvZGl2PgotPGgyPkhvdyB0byBwbGF5PC9oMj4KLVRoaXMgYm9hcmQgZ2FtZSBpcyBhIHZhcmlhbnQgb2YgUmV2ZXJzaSBhbmQgVGljIFRhYyBUb2UuIEVhY2ggb25lIG9mIHRoZSB0d28gcGxheWVycyBzZXRzIGEgcGF3biBvbiBhbiBlbXB0eSBjZWxsIG9mIHRoZSBib2FyZC4KLTxoMz5QYXduczwvaDM+Ci08dWw+Ci08bGkgY2xhc3M9IndoaXRlIj5QbGF5ZXIgMTwvbGk+Ci08bGkgY2xhc3M9ImJsYWNrIj5QbGF5ZXIgMjwvbGk+Ci08bGkgY2xhc3M9IndhbGwiPldhbGwuIENhbm5vdCBiZSByZXZlcnNlZC48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InRoZW1lIj4KLURpZmZlcmVudCB0aGVtZXMgYXJlIHN1cHBvcnRlZC4gVGhlbWUgaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IChDU1MpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIEhUTUwgY29udGVudCBpcyByZW5kZXJlZCBieSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LgotPHVsIGNsYXNzPSJ0aGVtZSI+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MxIj5UaGVtZSAxPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MyIj5UaGVtZSAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MzIj5UaGVtZSAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3M0Ij5UaGVtZSA0PC9hPjwvbGk+Ci08L3VsPgotCi08L2Rpdj4KLTxoMj5Ib3cgdG8gd2luPC9oMj4KLVRoZSBnYW1lIGVuZHMgd2hlbiBhbGwgY2VsbHMgYXJlIGZpbGxlZC4gVGhlIHdpbm5lciBpcyB0aGUgb25lIHdpdGggbW9zdCBwYXducyBvZiB0aGVpciBjb2xvdXIuIAotCi08aDI+SmF2YSBhbmQgSFRNTCBpbnRlZ3JhdGVkIHRocm91Z2ggdGhlIFNXVCBCcm93c2VyIHdpZGdldDwvaDI+Ci08cD4KLVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gQ29tcHV0ZXIgbW92ZXMgYXJlIHByb2dyYW1tZWQgaW4gcmVndWxhcgotSmF2YSBjb2RlIGluIHRoZSBFY2xpcHNlIHBsdWctaW4uIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuZCByZWFjdGluZwotdG8gdXNlciBpbnB1dC4KLTwvcD4KLTxoMz5JbXBsZW1lbnRhdGlvbjwvaDM+Ci08cD4KLVRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotPGJyPlRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi08YnI+UGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYSBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi08Y29kZT5odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5MjwvY29kZT4uIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyIChjb2x1bW4gMSwgcm93IDIpLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93aGl0ZV9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2hpdGVfcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjVlNTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93aGl0ZV9wYXduLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvQmFjazY0MHg0NDAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9CYWNrNjQweDQ0MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzM4MjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9CYWNrNjQweDQ0MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2JsdWVfcGVvcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvYmx1ZV9wZW9wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEwYzU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvYmx1ZV9wZW9wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9nb2xkX3Blb3BsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2dvbGRfcGVvcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MDkwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2dvbGRfcGVvcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTViMDk2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vQmFjazY0MHg0NDAuZ2lmKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL2JsdWVfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2dvbGRfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGxlZnQ7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwOyBwYWRkaW5nOjA7IGJhY2tncm91bmQ6IHVybCguL3RleHR1cmVfY2VsbHMuZ2lmKX0NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6NDhweDsgd2lkdGg6NDhweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vZ29sZF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Blb3BsZS5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLS5wbGF5ZXJibGFjayB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDMwMHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgd2hpdGU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3RleHR1cmVfY2VsbHMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC90ZXh0dXJlX2NlbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZWU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3RleHR1cmVfY2VsbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93YWxsX3Blb3BsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dhbGxfcGVvcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxNmM4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dhbGxfcGVvcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9kZW1vc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZGVtb3NfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5NzViMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9kZW1vc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEJyb3dzZXIgRGVtb3M8L2gyPgotCi08cD4KLVRoZSBCcm93c2VyIERlbW9zIGRlbW9uc3RyYXRlIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi08L3A+PHA+VGhlIFBhd25zIEdhbWUgaXMgYSBib2FyZCBnYW1lIHRoYXQgY2FuIGJlIHBsYXllZCBhZ2FpbnN0IHRoZSBjb21wdXRlcgotb3IgYWdhaW5zdCBhbm90aGVyIHBsYXllci4gUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBUaGUKLWJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi1UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotUGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYW4gaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTIuIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW9WaWV3PC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Ccm93c2VyIERlbW88L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTFmOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmEwZmVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RCcm93c2VyRGVtb3MubmFtZSA9IFNXVCBCcm93c2VyIERlbW9zIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5Ccm93c2VyRGVtb3MubmFtZSA9IEJyb3dzZXIgRGVtbwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lID0gQnJvd3NlciBEZW1vCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgZm9yIEhUTUwgcmVuZGVyaW5nLlxuXG5cCi0JVGhlIFBhd25zIEdhbWUgaXMgYSBib2FyZCBnYW1lIHRoYXQgY2FuIGJlIHBsYXllZCBhZ2FpbnN0IHRoZSBjb21wdXRlciBvciBhZ2FpbnN0IGFub3RoZXIgcGxheWVyLlxuXG5cCi0JUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBUaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIFwKLQlwcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4gXG5cCi0JVGhlIEFQSSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZykgZHJhd3MgdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuXG5cCi0JUGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyLiBlLmcgdGhlIHBsYXllciBjbGlja3MgXAotCW9uIGEgY2VsbCB0aGF0IGRlZmluZXMgYW4gaHlwZXJsaW5rIHdpdGggYSBVUkwgaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTIuXAotCVRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nIFwKLQluZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyBCcm93c2VyLnNldFRleHQgdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDU4ZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MiCi0gICBuYW1lPSIlcGx1Z2luLlNXVEJyb3dzZXJEZW1vcy5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJCcm93c2VyRGVtby5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQnJvd3NlckRlbW9zLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW8iPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYXduLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJCcm93c2VyIERlbW8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmRlbW9zLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2RiZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIHBsdWdpbjsKLQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fUEFUSCA9IG51bGw7Ci0JCi0JcHVibGljIEJyb3dzZXJEZW1vUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJUExVR0lOX1BBVEggPSBQbGF0Zm9ybS5yZXNvbHZlKHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLiIpKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBCcm93c2VyRGVtb1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzJmMWU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vczsKLQotcHVibGljIGNsYXNzIFBhd25zIHsKLQotCS8qIEN1cnJlbnQgYm9hcmQgcmVwcmVzZW50YXRpb24gaW4gY29tcGFjdGVkIGZvcm0gKi8KLQlieXRlW10gZ2FtZSA9IG5ldyBieXRlWzY0XTsKLQkvKiBCZXN0IG1vdmUgKi8KLQlpbnQgYmVzdEluZGV4ID0gLTE7Ci0JLyogUmVsYXRlZCBiZXN0IHNjb3JlICovCi0JaW50IGJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCS8qIEVzdGltYXRlZCBzdHJhdGVnaWMgdmFsdWUgb2YgZWFjaCBjZWxsIGJhc2VkIG9uIHByb3hpbWl0eSB0byB3YWxscyAqLwotCXN0YXRpYyBpbnRbXSBnYW1lV2FsbFdlaWdodCA9IG5ldyBpbnRbNjRdOwotCVRocmVhZCB0aHJlYWQgPSBudWxsOwotCWJvb2xlYW4gdGhyZWFkU3RvcCA9IGZhbHNlOwotCQotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotcHVibGljIFBhd25zKCkgewotfQotCi0vKiBQcm92aWRlIHRoZSBjdXJyZW50IGdhbWUgYW5kIGlnbml0aWF0ZSB0aGUgc2VhcmNoIG9mIHRoZSBiZXN0IG1vdmUgZm9yIHRoZSBnaXZlbiB0eXBlCi0gKiBNdXN0IHJldHVybiBpbW1lZGlhdGVseSBhcyBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gKiBUaGUgVUkgdGhyZWFkIHdpbGwgZmV0Y2ggdGhlIGJlc3QgbW92ZSBhbnkgdGltZSB0aGVyZWFmdGVyLgotICovCi1wdWJsaWMgdm9pZCBwbGF5UmVxdWVzdChieXRlW11bXSBnYW1lLCBpbnQgdHlwZSkgewotCXRocmVhZFN0b3AgPSB0cnVlOwotCXN5bmNocm9uaXplZCAodGhpcykgewotCQliZXN0SW5kZXggPSAtMTsKLQkJYmVzdFNjb3JlID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JCWNvbnZlcnQoZ2FtZSwgdGhpcy5nYW1lKTsKLQkJaW5pdFBhd25Cb3JkZXJzKHRoaXMuZ2FtZSwgZ2FtZVdhbGxXZWlnaHQpOwotCQkvKiBRdWlja2x5IGNvbXB1dGUgYSBsZWdhbCBtb3ZlICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5nYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5nYW1lW2ldID09IEVNUFRZKSB7Ci0JCQkJYmVzdEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN5bmNocm9uaXplZChQYXducy50aGlzKSB7Ci0JCQkJCXRocmVhZFN0b3AgPSBmYWxzZTsKLQkJCQkJaW50W10gcmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQkJLyogaWYgbG9uZyB0aW1lLCBtdXN0IGNoZWNrIGZvciB0aHJlYWRTdG9wIGFuZCBleGl0IGVhcmx5ICovIAotCQkJCQlldmFsQmVzdChQYXducy50aGlzLmdhbWUsIEJMQUNLLCAyLCByZXN1bHQpOwotCQkJCQliZXN0SW5kZXggPSByZXN1bHRbMF07Ci0JCQkJCWJlc3RTY29yZSA9IHJlc3VsdFsxXTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQl9Ci19Ci0KLS8qIEZldGNoIGJlc3QgbW92ZSBpbiBuYXR1cmFsIGNvb3JkaW5hdGVzIGZvciB0aGUgYm9hcmQgcHJldmlvdXNseSBnaXZlbiBpbgotICogdGhlIGNhbGwgdG8gcGxheVJlcXVlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIGdldEJlc3RNb3ZlKGludFtdIHBvaW50KSB7Ci0JY29udmVydChiZXN0SW5kZXgsIHBvaW50KTsKLQl0aHJlYWRTdG9wID0gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYW4gZXhwYW5kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvYXJkLCBmb3JtYXQgaW50ZXJuYWwgY29tcGFjdCBtb2RlICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0KGJ5dGVbXVtdIGJvYXJkLCBieXRlW10gZykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgYm9hcmQubGVuZ3RoOyBpKyspIFN5c3RlbS5hcnJheWNvcHkoYm9hcmRbaV0sIDAsIGcsIGkgKiA4LCA4KTsKLX0KLS8qIFVwZGF0ZSBnaXZlbiBjb21wYWN0IG1vZGVsIGJhc2VkIG9uIHBsYXllciBtb3ZlIGluIG5hdHVyYWwgY29vcmRpbmF0ZXMgKi8KLXN0YXRpYyB2b2lkIHNldChieXRlW10gZywgaW50IHgsIGludCB5LCBieXRlIHR5cGUpIHsKLQlnW3gqOCt5XSA9IHR5cGU7Ci19Ci0vKiBHaXZlbiBhbiBpbmRleCBpbiBjb21wYWN0IHJlcHJlc2VudGF0aW9uLCByZXR1cm4gbmF0dXJhbCBjb29yZGluYXRlcyAqLwotc3RhdGljIHZvaWQgY29udmVydChpbnQgaW5kZXgsIC8qb3V0IFswXSB4IFsxXSB5ICovaW50W10gcG9pbnQpIHsKLQlwb2ludFswXSA9IGluZGV4IC8gODsKLQlwb2ludFsxXSA9IGluZGV4ICUgODsKLX0KLS8qIEdpdmVuIGFuIGluZGV4IGludG8gdGhlIGNvbXBhY3QgbW9kZWwgYW5kIHRoZSBuZWlnaGJvdXIgY29kZSwKLSAqIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgbmVpZ2hib3VyIGluZGV4LgotICogUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyBuZWlnaGJvdXIuCi0gKiAKLSAqIE5laWdoYm91ciBjb2RlIGZvciB0aGUgaW5kZXggWAotICogMCAxIDIKLSAqIDMgWCA0Ci0gKiA1IDYgNyAKLSAqLwotc3RhdGljIGludCBnZXROZWlnaGJvdXJJbmRleChieXRlW10gZywgaW50IGluZGV4LCBpbnQgbmVpZ2hib3VyKSB7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnLmxlbmd0aCkgcmV0dXJuIC0xOwotCWludCByZXN1bHQgPSAtMTsKLQlzd2l0Y2ggKG5laWdoYm91cikgewotCQljYXNlIDA6IHJlc3VsdCA9IGluZGV4IDwgOCB8fCBpbmRleCAlIDggPT0gMCA/IC0xIDogaW5kZXggLSA5OyBicmVhazsKLQkJY2FzZSAxOiByZXN1bHQgPSBpbmRleCA8IDggPyAtMSA6IGluZGV4IC0gODsgYnJlYWs7Ci0JCWNhc2UgMjogcmVzdWx0ID0gaW5kZXggPCA4IHx8IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCAtIDc7IGJyZWFrOwotCQljYXNlIDM6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwID8gLTEgOiBpbmRleCAtIDE7IGJyZWFrOwotCQljYXNlIDQ6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCArIDE7IGJyZWFrOwotCQljYXNlIDU6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwIHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDc7IGJyZWFrOwotCQljYXNlIDY6IHJlc3VsdCA9IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDg7IGJyZWFrOwotCQljYXNlIDc6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3IHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDk7IGJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogTWFrZSB0aGUgcGxheWVyIHR5cGUgcGxheSBhdCBpbmRleCBvbiBnaXZlbiBjb21wYWN0IGJvYXJkIAotICogQ29tcHV0ZSBhbGwgcGF3bnMgdGhhdCBtdXN0IGJlIHJldmVyc2VkLgotICovCi1zdGF0aWMgdm9pZCBwbGF5KGJ5dGVbXSBnLCBpbnQgaW5kZXgsIGJ5dGUgdHlwZSkgewotCWJ5dGUgb3Bwb25lbnRUeXBlID0gdHlwZSA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JZm9yIChpbnQgbmVpZ2hib3VyID0gMDsgbmVpZ2hib3VyIDw9IDc7IG5laWdoYm91cisrKSB7Ci0JCWludCBuSW5kZXggPSBnZXROZWlnaGJvdXJJbmRleChnLCBpbmRleCwgbmVpZ2hib3VyKTsKLQkJaW50W10gcmV2ZXJzaUluZGVjZXMgPSBuZXcgaW50WzZdOwotCQlpbnQgblJldmVyc2kgPSAwOwotCQl3aGlsZSAobkluZGV4ICE9IC0xICYmIG5SZXZlcnNpIDwgNiAmJiBnW25JbmRleF0gPT0gb3Bwb25lbnRUeXBlKSB7Ci0JCQlyZXZlcnNpSW5kZWNlc1tuUmV2ZXJzaV0gPSBuSW5kZXg7Ci0JCQluUmV2ZXJzaSsrOwotCQkJbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgbkluZGV4LCBuZWlnaGJvdXIpOwkJCQotCQl9Ci0JCWlmIChuUmV2ZXJzaSA+IDAgJiYgbkluZGV4ICE9IC0xICYmIGdbbkluZGV4XSA9PSB0eXBlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZXZlcnNpOyBpKyspIGdbcmV2ZXJzaUluZGVjZXNbaV1dID0gdHlwZTsKLQkJfQotCX0KLQlnW2luZGV4XSA9IHR5cGU7Ci19Ci0vKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gY29tcGFjdCBtb2RlbCBiYXNlZCBvbiBwYXducyBkaXN0cmlidXRpb24gCi0gKiBIaWdoIG1lYW5zIHdoaXRlIGhhcyBhZHZhbnRhZ2UuIEJlbG93IHplcm8gbWVhbnMgYmxhY2sgaGFzIGFkdmFudGFnZS4KLSAqLwotc3RhdGljIGludCBldmFsKGJ5dGVbXSBnKSB7Ci0JaW50IGNudFdoaXRlID0gMCwgY250QmxhY2sgPSAwLCBjbnRFbXB0eSA9IDA7Ci0JaW50IGNudFdoaXRlV2FsbEFkdmFudGFnZSA9IDAsIGNudEJsYWNrV2FsbEFkdmFudGFnZSA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChnW2ldID09IFdISVRFKSB7Ci0JCQljbnRXaGl0ZSsrOwotCQkJY250V2hpdGVXYWxsQWR2YW50YWdlICs9IGdhbWVXYWxsV2VpZ2h0W2ldOwotCQl9Ci0JCWVsc2UgaWYgKGdbaV0gPT0gQkxBQ0spIHsKLQkJCWNudEJsYWNrKys7Ci0JCQljbnRCbGFja1dhbGxBZHZhbnRhZ2UgKz0gZ2FtZVdhbGxXZWlnaHRbaV07Ci0JCX0KLQkJZWxzZSBpZiAoZ1tpXSA9PSBFTVBUWSkgY250RW1wdHkrKzsKLQl9Ci0JaWYgKGNudEVtcHR5ID09IDApIHsKLQkJaWYgKGNudFdoaXRlID4gY250QmxhY2spIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsgLyogV2hpdGUgd2lucyAqLwotCQlpZiAoY250V2hpdGUgPCBjbnRCbGFjaykgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOyAvKiBCbGFjayB3aW5zICovCi0JCXJldHVybiAwOyAvKiBTdGFsZW1hdGUgKi8KLQl9Ci0JcmV0dXJuIGNudFdoaXRlICsgY250V2hpdGVXYWxsQWR2YW50YWdlIC0gY250QmxhY2sgLSBjbnRCbGFja1dhbGxBZHZhbnRhZ2U7Ci19Ci0KLS8qIFJlY29nbml6ZSBwYXducyBwcm90ZWN0ZWQgYnkgd2FsbHMgb3IgYm9yZGVycyAKLSAqIFRCRCAtIG5vdGUgdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBjZWxsIGFuZCBzdG9yZWQKLSAqIGluIGEgc2VwYXJhdGUgYnl0ZVtdIGdXYWxsR2FpbgotICogKi8KLXN0YXRpYyB2b2lkIGluaXRQYXduQm9yZGVycyhieXRlW10gZywgaW50W10gZ2FtZVdhbGxXZWlnaHQpIHsKLQkvKiBBIHBhd24gaGFzIDggbmVpZ2hib3VycyBvbiA0IGF4ZXMuCi0JICogU3RyYXRlZ2ljIHBhd25zIGhhdmUgb25lIHNpZGUgb2YgZWFjaCBheGlzIHByb3RlY3RlZCBieSBhIHdhbGwgYW5kIHRoZSBvdGhlcgotCSAqIHNpZGUgbm90IGNsb3NlZCBieSBhIHdhbGwuCi0JICogQSBwYXduIGNhbm5vdCBiZSByZXZlcnNlZCB3aGVuIGVhY2ggb2YgaXRzIDQgYXhlcyBhcmUgcHJvdGVjdGVkIGJ5IGEgd2FsbCBvbgotCSAqIG9uZSBzaWRlLiBQYXducyB0aGF0IGhhdmUgbW9yZSB0aGFuIDQgd2FsbHMgYXJlIGxlc3MgaW50ZXJlc3Rpbmcgc2luY2UgdGhleQotCSAqIGFyZSBub3Qgb3BlbiBlbm91Z2ggdG8gdGhlIGJvYXJkLgotCSAqIAotCSAqIE5iciB3YWxscywgbmJyIGF4aXMgY292ZXJlZCwgZXN0aW1hdGVkIHZhbHVlCi0JICogMCBuL2EgMAotCSAqIDEgMSAyCi0JICogMiAxIDEKLQkgKiAyIDIgNgotCSAqIDMgMiA0Ci0JICogNCAyIDIKLQkgKiAzIDMgOQotCSAqIDQgMyA4Ci0JICogNCA0IDE2Ci0JICogNSA0IDE0Ci0JICogNiA0IDkKLQkgKiA3IDQgNgotCSAqIDggNCAwCi0JICovCi0JaW50W10gblR5cGVzID0gbmV3IGludFs4XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaW50IG5XYWxscyA9IDA7Ci0JCWludCBuQXhpcyA9IDA7Ci0JCWZvciAoaW50IG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCQlpbnQgbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgaSwgbik7Ci0JCQluVHlwZXNbbl0gPSBuSW5kZXggIT0gLTEgPyBnW25JbmRleF0gOiBXQUxMOwotCQkJaWYgKG5UeXBlc1tuXSA9PSBXQUxMKSBuV2FsbHMrKzsKLQkJfQotCQlpbnQgc2NvcmUgPSBuV2FsbHM7Ci0JCWlmIChuV2FsbHMgPiAwKSB7Ci0JCQlpZiAoblR5cGVzWzBdID09IFdBTEwgfHwgblR5cGVzWzddID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzFdID09IFdBTEwgfHwgblR5cGVzWzZdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzJdID09IFdBTEwgfHwgblR5cGVzWzVdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzRdID09IFdBTEwgfHwgblR5cGVzWzNdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlzd2l0Y2ggKG5BeGlzKSB7Ci0JCQkJY2FzZSA0OiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDQ6IHNjb3JlID0gMTY7IGJyZWFrOyBjYXNlIDU6IHNjb3JlID0gMTQ7IGJyZWFrOyBjYXNlIDY6IHNjb3JlID0gOTsgY2FzZSA3OiBzY29yZSA9IDY7IGJyZWFrOyBjYXNlIDg6IHNjb3JlID0gMDsgYnJlYWs7fSBicmVhazsKLQkJCQljYXNlIDM6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMzogc2NvcmUgPSA5OyBicmVhazsgY2FzZSA0OiBzY29yZSA9IDg7fSBicmVhazsKLQkJCQljYXNlIDI6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMjogc2NvcmUgPSA2OyBicmVhazsgY2FzZSAzOiBzY29yZSA9IDQ7IGJyZWFrOyBjYXNlIDQ6IHNjb3JlID0gMjsgfSBicmVhazsKLQkJCQljYXNlIDE6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMTogc2NvcmUgPSAyOyBicmVhazsgY2FzZSAyOiBzY29yZSA9IDE7IGJyZWFrO30gYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZ2FtZVdhbGxXZWlnaHRbaV0gPSBzY29yZTsKLQl9Ci19Ci0KLS8qIEV2YWx1YXRlIHRoZSBiZXN0IG1vdmUgZm9yIHBsYXllciB0eXBlIGZvciB0aGUgZ2l2ZW4gYm9hcmQsIGRvaW5nIGEgZGVwdGggMSBzZWFyY2ggKi8KLXN0YXRpYyB2b2lkIGV2YWxCZXN0KGJ5dGVbXSBnLCBieXRlIHR5cGUsIGludCBkZXB0aCwgLyogb3V0IFswXSBiZXN0IG1vdmUsIFsxXSBtaW5pbWF4ICovaW50W10gcmVzdWx0KSB7Ci0JYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzY0XTsKLQlieXRlIG9wcG9uZW50VHlwZSA9IHR5cGUgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCXJlc3VsdFswXSA9IC0xOyByZXN1bHRbMV0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaWYgKGdbaV0gPT0gRU1QVFkpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZywgMCwgdG1wLCAwLCA2NCk7Ci0JCQlwbGF5KHRtcCwgaSwgdHlwZSk7Ci0JCQlpbnQgc2NvcmUgPSBldmFsKHRtcCk7Ci0JCQlpZiAoZGVwdGggPiAxKSB7Ci0JCQkJaW50W10gdG1wUmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQlldmFsQmVzdCh0bXAsIG9wcG9uZW50VHlwZSwgZGVwdGggLSAxLCB0bXBSZXN1bHQpOwotCQkJCXNjb3JlID0gdG1wUmVzdWx0WzFdOwotCQkJfQotCQkJaWYgKCh0eXBlID09IFdISVRFICYmIHNjb3JlID4gcmVzdWx0WzFdKSB8fCAodHlwZSA9PSBCTEFDSyAmJiBzY29yZSA8IHJlc3VsdFsxXSkgfHwgcmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJcmVzdWx0WzBdID0gaTsKLQkJCQlyZXN1bHRbMV0gPSBzY29yZTsKLQkJCX0KLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5M2U3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQlDb21wb3NpdGUgcGFyZW50OwotCQotCXB1YmxpYyBCcm93c2VyRGVtb1ZpZXcoKSB7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotCQkJdGV4dC5zZXRUZXh0KCJCcm93c2VyIHdpZGdldCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiBUaGUgZXhhY3QgZXJyb3IgaXM6XHJcbiIrZSk7Ci0JCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJbmV3IFBhd25UYWIoaXRlbSk7Ci0JCQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCW5ldyBFZGl0b3JUYWIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMTY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGFiIHsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVGV4dCBodG1sVGV4dCwgc2NyaXB0VGV4dDsKLQlCdXR0b24gaHRtbEJ1dHRvbiwgc2NyaXB0QnV0dG9uOwotCXN0YXRpYyBTdHJpbmcgaHRtbCA9IAotCQkiPGh0bWw+XHJcbiIrCi0JCSIJPGJvZHk+XHJcbiIrCi0JCSIJCTxoMSBpZD0nbXlpZCc+SFRNTCBEb2N1bWVudDwvaDE+XHJcbiIrCi0JCSIJCTxoMj5TZXQgSFRNTCBjb250ZW50PC9oMj5cclxuIisKLQkJIgkJPG9sPlxyXG4iKwotCQkiCQkJPGxpPkVudGVyIGh0bWwgZGF0YSBpbnRvIHRoZSAnc2V0VGV4dCcgcGFuZTwvbGk+XHJcbiIrCi0JCSIJCQk8bGk+Q2xpY2sgb24gJ3NldFRleHQnIHRvIHNldCB0aGUgbmV3IGNvbnRlbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCQk8aDI+UXVlcnkgb3IgbW9kaWZ5IEhUTUwgZG9jdW1lbnQ8L2gyPlxyXG4iKwotCQkiCQk8b2w+XHJcbiIrCi0JCSIJCTxsaT5FbnRlciBqYXZhc2NyaXB0IGNvbW1hbmRzIGludG8gdGhlICdleGVjdXRlJyBwYW5lPC9saT5cclxuIisKLQkJIgkJPGxpPkNsaWNrIG9uICdleGVjdXRlJyB0byBydW4gdGhlIGphdmFzY3JpcHQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCTwvYm9keT5cclxuIisKLQkJIjwvaHRtbD4iOwotCQotCXN0YXRpYyBTdHJpbmcgc2NyaXB0ID0gCi0JCSJ2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTtcclxuIisKLQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0NvbnRlbnQgaW5zZXJ0ZWQhJyk7XHJcbiIrCi0JCSJub2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChub2RlKTtcclxuXHJcbiIrCi0JCSJkb2N1bWVudC5iZ0NvbG9yID0gJ3llbGxvdyc7IjsKLQkKLQlwdWJsaWMgRWRpdG9yVGFiKFRhYkl0ZW0gaXRlbSkgewotCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShpdGVtLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiRWRpdG9yIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQoZm9ybSk7Ci0JCQotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIEZvcm1EYXRhIHNhc2hEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOwotCQlzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlzYXNoLnNldExheW91dERhdGEoc2FzaERhdGEpOwotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBzYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCQlpbnQgcmlnaHQgPSBwYXJlbnRSZWN0LndpZHRoIC0gcmVjdC53aWR0aCAtIDIwOwotCQkJCWUueCA9IE1hdGgubWF4KE1hdGgubWluKGUueCwgcmlnaHQpLCAyMCk7Ci0JCQkJaWYgKGUueCAhPSByZWN0LngpIHsKLQkJCQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBlLngpOwotCQkJCQlwYXJlbnQubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIFBhbmVsICovCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJR3JvdXAgaHRtbEdyb3VwID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWh0bWxHcm91cC5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCWh0bWxUZXh0ID0gbmV3IFRleHQoaHRtbEdyb3VwLCBTV1QuTVVMVEkpOwotCQlodG1sQnV0dG9uID0gbmV3IEJ1dHRvbihodG1sR3JvdXAsIFNXVC5QVVNIKTsKLQkJaHRtbEJ1dHRvbi5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWh0bWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWh0bWxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlodG1sQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlodG1sR3JvdXAubGF5b3V0KCk7Ci0JCQotCQlHcm91cCBzY3JpcHRHcm91cCA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5PTkUpOwotCQlzY3JpcHRHcm91cC5zZXRUZXh0KCJleGVjdXRlIik7Ci0JCXNjcmlwdFRleHQgPSBuZXcgVGV4dChzY3JpcHRHcm91cCwgU1dULk1VTFRJKTsKLQkJc2NyaXB0QnV0dG9uID0gbmV3IEJ1dHRvbihzY3JpcHRHcm91cCwgU1dULlBVU0gpOwotCQlzY3JpcHRCdXR0b24uc2V0VGV4dCgiZXhlY3V0ZSIpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJc2NyaXB0R3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzY3JpcHRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlzY3JpcHRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNjcmlwdEdyb3VwLmxheW91dCgpOwotCQkKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlodG1sVGV4dC5zZXRUZXh0KGh0bWwpOwotCQlzY3JpcHRUZXh0LnNldFRleHQoc2NyaXB0KTsKLQkJcGFyZW50LmxheW91dCgpOwotCQkKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJV2lkZ2V0IHcgPSBlLndpZGdldDsKLQkJCQlpZiAodyA9PSBodG1sQnV0dG9uKSBicm93c2VyLnNldFRleHQoaHRtbFRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAodyA9PSBzY3JpcHRCdXR0b24pIGJyb3dzZXIuZXhlY3V0ZShzY3JpcHRUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlodG1sQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJc2NyaXB0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzZjEyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLlBhd25zOwotCi1wdWJsaWMgY2xhc3MgUGF3blRhYiB7Ci0KLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQkKLQlCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCVJldmVyc2lMaXN0ZW5lciByZXZlcnNpTGlzdGVuZXI7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfV0VMQ09NRSA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX1NUQVJUID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9BUkQgPSAzOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9CT0FSRF9PVkVSID0gNDsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMID0gImh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvIjsKLQlzdGF0aWMgU3RyaW5nIFBMVUdJTl9QQVRIID0gQnJvd3NlckRlbW9QbHVnaW4uUExVR0lOX1BBVEg7Ci0Jc3RhdGljIFN0cmluZyBDU1NfRk9MREVSID0gImNzczIiOwotCXN0YXRpYyBTdHJpbmcgVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCXN0YXRpYyBTdHJpbmcgVVJMX1dFTENPTUUgPVBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi93ZWxjb21lLmh0bWwiOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fU1RBUlRfMl9QTEFZRVJTID0gImFjdGlvbnN0YXJ0MnBsYXllcnMiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1NUQVJUXzFfUExBWUVSID0gImFjdGlvbnN0YXJ0MXBsYXllciI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fV0hJVEUgPSAiYWN0aW9ud2hpdGUiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX0JMQUNLID0gImFjdGlvbmJsYWNrIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9USEVNRSA9ICJhY3Rpb250aGVtZSI7Ci0KLQlzdGF0aWMgYnl0ZVtdW10gZ2FtZSA9IG51bGw7Ci0Jc3RhdGljIGJvb2xlYW4gaXNXaGl0ZSA9IHRydWU7Ci0Jc3RhdGljIGludCBjbnRXaGl0ZSA9IDAsIGNudEJsYWNrID0gMDsKLQlzdGF0aWMgYm9vbGVhbiBjb21wdXRlciA9IGZhbHNlOwotCXN0YXRpYyBpbnQgY3gsIGN5OwotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotCXN0YXRpYyBQYXducyB0dHIgPSBudWxsOwotCXN0YXRpYyBpbnRbXSBtb3ZlID0gbmV3IGludFsyXTsKLQlzdGF0aWMgTWVudSBtZW51ID0gbnVsbDsKLQkKLQlwdWJsaWMgUGF3blRhYihUYWJJdGVtIGl0ZW0pIHsJCQotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKGl0ZW0uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpdGVtLnNldFRleHQoIlBhd25zIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChicm93c2VyKTsKLQotCQltZW51ID0gbmV3IE1lbnUoYnJvd3Nlci5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtMi5zZXRUZXh0KCJFbmQgR2FtZSIpOwotCQlpdGVtMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZ2FtZSA9IG51bGw7Ci0JCQkJaXNXaGl0ZSA9IHRydWU7Ci0JCQkJY250V2hpdGUgPSAwOyBjbnRCbGFjayA9IDA7Ci0JCQkJdHRyID0gbnVsbDsKLQkJCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldE1lbnUobWVudSk7Ci0JCQotCQlyZXZlcnNpTGlzdGVuZXIgPSBuZXcgUmV2ZXJzaUxpc3RlbmVyKCk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihyZXZlcnNpTGlzdGVuZXIpOwotCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIdG1sKGludCB0eXBlKSB7Ci0JCVN0cmluZyBodG1sID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVFlQRV9CT0FSRDoKLQkJY2FzZSBUWVBFX0JPQVJEX09WRVI6IHsKLQkJCWh0bWwgPSAiPGh0bWw+PGhlYWRlcj48bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIiIrVVJMX0NTUysiXCI+PC9oZWFkZXI+PGJvZHk+PGRpdiBjbGFzcz1cImJvYXJkXCI+PHRhYmxlPjx0Ym9keT4iOwotCQkJU3RyaW5nIGNsYXNzUGxheWVyV2hpdGUgPSAicGxheWVyd2hpdGUiLCBjbGFzc1BsYXllckJsYWNrID0gInBsYXllcmJsYWNrIjsKLQkJCWlmICh0eXBlID09IFRZUEVfQk9BUkRfT1ZFUikgewotCQkJCWlmIChjbnRXaGl0ZSA+IGNudEJsYWNrKSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiB3aW5uZXIiOwotCQkJCQljbGFzc1BsYXllckJsYWNrICs9ICIgbG9zZXIiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiBsb3NlciI7Ci0JCQkJCWNsYXNzUGxheWVyQmxhY2sgKz0gIiB3aW5uZXIiOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB3aGl0ZSA9ICI8dGQgY2xhc3M9XCJ3aGl0ZVwiLz4iOwotCQkJU3RyaW5nIGJsYWNrID0gIjx0ZCBjbGFzcz1cImJsYWNrXCIvPiI7Ci0JCQlTdHJpbmcgd2FsbCA9ICI8dGQgY2xhc3M9XCJ3YWxsXCIvPiI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspIHsKLQkJCQlodG1sICs9ICI8dHI+IjsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkJc3dpdGNoIChnYW1lW2ldW2pdKSB7Ci0JCQkJCQljYXNlIEVNUFRZOiB7Ci0JCQkJCQkJU3RyaW5nIGVtcHR5ID0gIjx0ZCBjbGFzcz1cIiIrKGlzV2hpdGUgPyAid2hpdGVsaW5rIiA6ICJibGFja2xpbmsiKSsiXCI+IisgKGlzV2hpdGUgfHwgKCFpc1doaXRlICYmICFjb21wdXRlcikgPyAiPGEgaHJlZj1cIiIrVVJMKyhpc1doaXRlID8gQUNUSU9OX1dISVRFIDogQUNUSU9OX0JMQUNLKSsiL3h4IitpKyJ5eSIraisiXCIgY2xhc3M9XCJlbXB0eVwiLz4iIDogIjxkaXYgY2xhc3M9XCJlbXB0eVwiLz4iKSsiPC90ZD4iOwotCQkJCQkJCWh0bWwgKz0gZW1wdHk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBXSElURTogaHRtbCArPSB3aGl0ZTsgYnJlYWs7Ci0JCQkJCQljYXNlIEJMQUNLOiBodG1sICs9IGJsYWNrOyBicmVhazsKLQkJCQkJCWNhc2UgV0FMTDogaHRtbCArPSB3YWxsOyBicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlodG1sICs9IjwvdHI+IjsKLQkJCX0KLQkJCWh0bWwgKz0gIjwvdGJvZHk+PC90YWJsZT48L2Rpdj4iOwotCQkJaHRtbCArPSAiPGRpdiBjbGFzcz1cIiIrY2xhc3NQbGF5ZXJXaGl0ZSsiXCI+IitjbnRXaGl0ZSsiPC9kaXY+IjsKLQkJCWh0bWwgKz0gIjxkaXYgY2xhc3M9XCIiK2NsYXNzUGxheWVyQmxhY2srIlwiPiIrY250QmxhY2srIjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8L2JvZHk+PC9odG1sPiI7Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCXJldHVybiBodG1sOwotCX0KLQotCXB1YmxpYyBjbGFzcyBSZXZlcnNpTGlzdGVuZXIgaW1wbGVtZW50cyBMb2NhdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCXRyeSB7Ci0JCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzFfUExBWUVSKSAhPSAtMSB8fCBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzJfUExBWUVSUykgIT0gLTEpIHsKLQkJCQljb21wdXRlciA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fU1RBUlRfMV9QTEFZRVIpICE9IC0xOwotCQkJCWdhbWUgPSBuZXcgYnl0ZVs4XVs4XTsKLQkJCQlpZiAoY29tcHV0ZXIpIHR0ciA9IG5ldyBQYXducygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSBnYW1lWyhpbnQpKE1hdGgucmFuZG9tKCkqZ2FtZS5sZW5ndGgpXVsoaW50KShNYXRoLnJhbmRvbSgpKmdhbWVbMF0ubGVuZ3RoKV0gPSBXQUxMOwotCQkJCWUuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChUWVBFX0JPQVJEKSk7Ci0JCQkJfX0pOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1RIRU1FKSAhPSAtMSkgewotCQkJCWludCBpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fVEhFTUUpICsgQUNUSU9OX1RIRU1FLmxlbmd0aCgpICsgMTsKLQkJCQlDU1NfRk9MREVSID0gZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgNCk7Ci0JCQkJVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCQkJCVVSTF9XRUxDT01FID0gUExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3dlbGNvbWUuaHRtbCI7Ci0JCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJyb3dzZXIuc2V0VXJsKFVSTF9XRUxDT01FKTsKLQkJCQl9fSk7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYnl0ZSBwbGF5ZXIgPSBFTVBUWTsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1dISVRFKSAhPSAtMSkgcGxheWVyID0gV0hJVEU7Ci0JCQllbHNlIGlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX0JMQUNLKSAhPSAtMSkgcGxheWVyID0gQkxBQ0s7Ci0JCQlpZiAocGxheWVyICE9IEVNUFRZKSB7Ci0JCQkJaW50IGluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ4eCIpICsgMjsKLQkJCQlpbnQgeCA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ5eSIpICsgMjsKLQkJCQlpbnQgeSA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZCh4LCB5LCBwbGF5ZXIpOwotCQkJCWlzV2hpdGUgPSBwbGF5ZXIgIT0gV0hJVEU7Ci0JCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoaGFzTW9yZSA/IFRZUEVfQk9BUkQgOiBUWVBFX0JPQVJEX09WRVIpKTsKLQkJCQlpZiAoY29tcHV0ZXIgJiYgaGFzTW9yZSAmJiAhaXNXaGl0ZSkgcGxheShlLmRpc3BsYXksIGJyb3dzZXIsIDUwMDApOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJfQotCQkJfWNhdGNoIChFeGNlcHRpb24gZTEgKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkKGludCB4LCBpbnQgeSwgYnl0ZSBjb2xvcikgewotCQlnYW1lW3hdW3ldID0gY29sb3I7Ci0JCWludCBjbnQgPSBNYXRoLm1pbih4LCB5KSwgbiA9IDA7Ci0JCWludCBvdGhlcl9jb2xvciA9IGNvbG9yID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5LWRdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oZ2FtZS5sZW5ndGggLSAxIC0geCwgZ2FtZVswXS5sZW5ndGggLSAxIC0geSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5K2RdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbihnYW1lLmxlbmd0aCAtIDEgLSB4LCB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeCtkXVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKHgsIGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0geTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4XVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3hdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4XVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3hdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSB4OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beV0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5XSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4LWRdW3ldID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gZ2FtZS5sZW5ndGggLSAxIC0geDsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ldID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beV0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5XSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0KLQkJYm9vbGVhbiBoYXNNb3JlID0gZmFsc2U7Ci0JCWNudFdoaXRlID0gMDsgY250QmxhY2sgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQlzd2l0Y2ggKGdhbWVbaV1bal0pIHsKLQkJCQkJY2FzZSBFTVBUWTogaGFzTW9yZSA9IHRydWU7IGJyZWFrOwotCQkJCQljYXNlIFdISVRFOiBjbnRXaGl0ZSsrOyBicmVhazsKLQkJCQkJY2FzZSBCTEFDSzogY250QmxhY2srKzsgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gaGFzTW9yZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXkoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBCcm93c2VyIGJyb3dzZXIsIGludCBkZWxheSkgewotCQl0dHIucGxheVJlcXVlc3QoZ2FtZSwgQkxBQ0spOwotCQlkaXNwbGF5LnRpbWVyRXhlYygzMDAwLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0dHIuZ2V0QmVzdE1vdmUobW92ZSk7Ci0JCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZChtb3ZlWzBdLCBtb3ZlWzFdLCBCTEFDSyk7Ci0JCQkJCWlzV2hpdGUgPSB0cnVlOwotCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChoYXNNb3JlID8gVFlQRV9CT0FSRCA6IFRZUEVfQk9BUkRfT1ZFUikpOwotCQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNGUxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ1ZWU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzM3YTQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjQwIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU2NDRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0JICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0JICAgICAgIAotc291cmNlLmJyb3dzZXJleGFtcGxlLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjVlMTgxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhlIEJyb3dzZXIgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuIAotSXQgY29uc2lzdHMgb2YgYSBjb21wb3NpdGUgY29udGFpbmluZyBhIEJyb3dzZXIgd2lkZ2V0IHRvIHJlbmRlciBIVE1MIGFuZCBzb21lCi1hZGRpdGlvbmFsIHdpZGdldHMgdG8gaW1wbGVtZW50IGFjdGlvbnMgY29tbW9ubHkgZm91bmQgb24gYnJvd3NlcnMgKHRvb2xiYXIKLXdpdGggYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCBidXR0b25zLCBzdGF0dXMgYmFyIGV0Yy4pLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QnJvd3Nlcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2ljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2ljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzk3Y2YyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RCcm93c2VyRXhhbXBsZS5uYW1lID0gU1dUIEJyb3dzZXIgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQnJvd3NlckV4YW1wbGUubmFtZSA9IFdlYiBCcm93c2VyCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSA9IFdlYiBCcm93c2VyCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGludGVncmF0ZSBhIFdlYiBCcm93c2VyIHdpdGggdGhlIFNXVCBCcm93c2VyIHdpZGdldC5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTC4gXAotCUFkZGl0aW9uYWwgd2lkZ2V0cyBhbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHR5cGljYWwgYnJvd3NlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIFVSTCwgZ28gYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCkuCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE1M2ViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyUGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJicm93c2VyZXhhbXBsZS5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MTYwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQnJvd3NlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjZjZTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIDxjb2RlPkJyb3dzZXJWaWV3PC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAgSXQgY29uc2lzdHMgb2YgYSB3b3JrYmVuY2gKLSAqIHZpZXcgYW5kIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlCi0gKiB1c2VyIHRvIGludGVyYWN0IHdpdGggYSBjb250cm9sLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlCcm93c2VyRXhhbXBsZSBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBleGFtcGxlCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBmcmFtZSkgewotCQlpbnN0YW5jZSA9IG5ldyBCcm93c2VyRXhhbXBsZShmcmFtZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5mb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzY4ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdiM2EzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDoyMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDVjNzZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5jb250cm9scy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NDYzMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ29udHJvbHMgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q29udHJvbHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMGQyNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQ3VzdG9tIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ3VzdG9tIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBlbXVsYXRlZCBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBlbXVsYXRlZCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5DdXN0b21Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiZGVlOTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDdjMGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMKLXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ3VzdG9tIENvbnRyb2xzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDb250cm9scwotbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgbmF0aXZlIFNXVCBjb250cm9scy5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBhbGxvd3MgdGhlIHVzZXIgXAotCXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KLQkKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDdXN0b20gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGN1c3RvbSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjdXN0b20gY29udHJvbC4gXAotCVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIHRoZSBjb250cm9sLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI3N2RlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RDb250cm9sc0V4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29udHJvbHMuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkN1c3RvbUNvbnRyb2xWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWViNmQ1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbnRyb2xQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhOTUzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHM7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIG5hdGl2ZSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQzMDJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIDxjb2RlPkN1c3RvbUNvbnRyb2xzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgY3VzdG9tIGNvbnRyb2xzIGRlZmluZWQgYnkgU1dULiAgSXQgY29uc2lzdHMgb2YgYSB3b3JrYmVuY2gKLSAqIHZpZXcgYW5kIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlCi0gKiB1c2VyIHRvIGludGVyYWN0IHdpdGggYSBjb250cm9sLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sVmlldyBleHRlbmRzIENvbnRyb2xWaWV3IHsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNjN2ZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlYWY4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MTEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjE5ZTQ5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy8sXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0JICAgICAgICAgICAqLmphcgotCSAgICAgICAgICAgCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXVuY2hlci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjRmOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRXhhbXBsZSBMYXVuY2hlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9oMj4KLQotPHA+Ci1UaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgV29ya2JlbmNoIHZpZXdzIAotb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCi08L3A+Ci0KLTx1bD4KLTxsaT5Xb3JrYmVuY2ggdmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgbGF1bmNoZXIKLXN0YXJ0cyBhIFdvcmtiZW5jaCB2aWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuCi08bGk+U3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgd2luZG93LgotPC91bD4KLQotPHA+Ci1Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHJ1biB0aGUgc3RhbmRhbG9uZSBleGFtcGxlcyB3aXRob3V0IHRoZSBTV1QgRXhhbXBsZSBMYXVuY2hlciwgCi1yZWZlciB0byA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWRmOTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhFQUQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLTxIVE1MPgotPEJPRFk+Ci08SDE+PENFTlRFUj5MYXVuY2ggSXRlbXM8L0NFTlRFUj48L0gxPgotPEgyPklkZW50aWZpZXI8L0gyPgotb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zPEgyPkRlc2NyaXB0aW9uPC9IMj4KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkICdzdGFuZGFsb25lIHByb2dyYW0nIGFuZAotJ1dvcmtiZW5jaCB2aWV3JwotbGF1bmNoIGl0ZW1zIHRvIHRoZSBMYXVuY2hlciwgb3B0aW9uYWxseSBncm91cGluZyB0aGVtIGludG8KLWNhdGVnb3JpZXMgc28gYXMgdG8gZm9ybSBhIG11bHRpLXRpZXJlZCBoaWVyYXJjaHkuCi1TdGFuZGFsb25lIHByb2dyYW1zIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgcGxhdGZvcm0ncyBldmVudCBsb29wLgotV29ya2JlbmNoIHZpZXdzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYWN0aXZlIFdvcmtiZW5jaCBQZXJzcGVjdGl2ZS48SDI+TWFya3VwPC9IMj4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgZXh0ZW5zaW9uIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5wb2ludDwvYj4gLSA8L2xpPjxsaT48Yj5pZDwvYj4gLSA8L2xpPjxsaT48Yj5uYW1lPC9iPiAtIDwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgcHJvZ3JhbSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBwcm9ncmFtPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO21haW5DbGFzcyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwbHVnaW5JZCZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5tYWluQ2xhc3M8L2I+IC0gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBtYWluKCkgbWV0aG9kIGlzIHRvIGJlIGxhdW5jaGVkLjwvbGk+PGxpPjxiPnBsdWdpbklkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gcGx1Z2luIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0uPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCB2aWV3IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIHZpZXc8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dmlld0lkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPnZpZXdJZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBXb3JrYmVuY2ggVmlldyB0byBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgaXRlbSBpcyBsYXVuY2hlZC48L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGNhdGVnb3J5IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGNhdGVnb3J5PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2F0ZWdvcnkmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGNhdGVnb3J5LjwvbGk+PGxpPjxiPmlkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjYXRlZ29yeS4gIENhdGVnb3JpZXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQgY2F0ZWdvcnkuPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBpdGVtIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGl0ZW08L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjYXRlZ29yeSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ljb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmFibGVkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgImZhbHNlIiJ0cnVlIjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXNjcmlwdGlvbiZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGF1bmNoIGl0ZW0uPC9saT48bGk+PGI+aWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGxhdW5jaCBpdGVtLiBMYXVuY2ggaXRlbXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjYXRlZ29yeSB0aGlzIGxhdW5jaCBpdGVtIGJlbG9uZ3MgdG8uPC9saT48bGk+PGI+aWNvbjwvYj4gLSBUaGUgZGVjbGFyaW5nIHBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdG8gZGlzcGxheSB3aXRoIHRoaXMgbGF1bmNoIGl0ZW0gaW4gdGhlIExhdW5jaGVyLjwvbGk+PGxpPjxiPmVuYWJsZWQ8L2I+IC0gU2V0IHRvICJmYWxzZSIgdG8gZGlzYWJsZSB0aGlzIGxhdW5jaCBpdGVtLCBvciB0byAidHJ1ZSIgdG8gZW5hYmxlIGl0IChkZWZhdWx0KS48L2xpPjxsaT48Yj5kZXNjcmlwdGlvbjwvYj4gLSBUaGUgbG9jYWxpemVkIHBsYWluLXRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyBsYXVuY2ggaXRlbS48L2xpPjwvdWw+Ci08SDI+RXhhbXBsZTwvSDI+Ci08SDI+QVBJIEluZm9ybWF0aW9uPC9IMj4KLTxIMj5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjwvSDI+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlmYjZiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiNGQzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5Yzc3NzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9vcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEwM2FhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIExhdW5jaGVyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIEV4YW1wbGUgTGF1bmNoZXIKLQotZXh0ZW5zaW9uLXBvaW50LmxhdW5jaEl0ZW1zLm5hbWUgPSBMYXVuY2ggSXRlbXMKLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUubmFtZSA9IExhdW5jaGVyCi1sYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMgd2hpY2ggY2FuIGVpdGhlciBiZSBcCi0JV29ya2JlbmNoIFZpZXdzLCBvciBTdGFuZGFsb25lIGFwcGxpY2F0aW9ucy5cblxuXAotCVdvcmtiZW5jaCBWaWV3cyBhcmUgZXhhbXBsZXMgdGhhdCBhcmUgaW50ZWdyYXRlZCBpbnRvIEVjbGlwc2UuICBXaGVuIHRoZSBMYXVuY2hlciBcCi0Jc3RhcnRzIGEgV29ya2JlbmNoIFZpZXcsIGl0IGlzIG9wZW5lZCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwZXJzcGVjdGl2ZS5cblxuXAotCVN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLQotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi1lcnJvci5Db3VsZE5vdEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9ucyA9IENvdWxkIE5vdCBGaW5kIFJlZ2lzdGVyZWQgRXh0ZW5zaW9ucwotZXJyb3IuSW5jb21wbGV0ZVByb2dyYW1MYXVuY2hJdGVtID0gSW5jb21wbGV0ZSBYTUwgUHJvZ3JhbUxhdW5jaEl0ZW0gZGVmaW5pdGlvbiwgaWQgPSB7MH0KLWVycm9yLkluY29tcGxldGVWaWV3TGF1bmNoSXRlbSA9IEluY29tcGxldGUgWE1MIFZpZXdMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci1lcnJvci5JbmNvbXBsZXRlTGF1bmNoSXRlbSA9IEluY29tcGxldGUgb3IgdW5yZWNvZ25pemVkIFhNTCBMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci0KLWxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiA9IDw8bm8gaXRlbSBzZWxlY3RlZD4+Ci0KLWxhdW5jaGl0ZW0uTWlzc2luZy5uYW1lID0gPDx1bm5hbWVkPj4KLWxhdW5jaGl0ZW0uTWlzc2luZy5kZXNjcmlwdGlvbiA9IDw8bm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlPj4KLQotdmlldy5sYXVuY2hHcm91cC50ZXh0ID0gRXhhbXBsZXMKLXZpZXcubGF1bmNoQnV0dG9uLnRleHQgPSBSdW4KLXZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0ID0gRGVzY3JpcHRpb24KLQotcnVuLmVycm9yLkludm9jYXRpb24gPSBBIGZhdGFsIGVycm9yIG9jY3VycmVkIHdoaWxlIGxhdW5jaGluZyB0aGUgcHJvZ3JhbS4KLXJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kID0gVGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlbigpIG1ldGhvZC4KLXJ1bi5lcnJvci5Db3VsZE5vdEZpbmRDbGFzcyA9IENvdWxkIG5vdCBmaW5kIHRoZSBjbGFzcyB0byBydW4uCi1ydW4uZXJyb3IuQ291bGROb3RJbnN0YW50aWF0ZUNsYXNzID0gQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyB0byBydW4uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2I4MmIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiCi0gICBuYW1lPSIlcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5MYXVuY2hlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF1bmNoZXIuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJsYXVuY2hJdGVtcyIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5sYXVuY2hJdGVtcy5uYW1lIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZCIvPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5MYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIuTGF1bmNoZXJWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiN2Q4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyIiBpZD0ibGF1bmNoSXRlbXMiIG5hbWU9IkxhdW5jaCBJdGVtcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCAmYXBvcztzdGFuZGFsb25lIHByb2dyYW0mYXBvczsgYW5kCi0mYXBvcztXb3JrYmVuY2ggdmlldyZhcG9zOwotbGF1bmNoIGl0ZW1zIHRvIHRoZSBMYXVuY2hlciwgb3B0aW9uYWxseSBncm91cGluZyB0aGVtIGludG8KLWNhdGVnb3JpZXMgc28gYXMgdG8gZm9ybSBhIG11bHRpLXRpZXJlZCBoaWVyYXJjaHkuCi1TdGFuZGFsb25lIHByb2dyYW1zIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgcGxhdGZvcm0mYXBvcztzIGV2ZW50IGxvb3AuCi1Xb3JrYmVuY2ggdmlld3MgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhY3RpdmUgV29ya2JlbmNoIFBlcnNwZWN0aXZlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlbSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2dyYW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhICZxdW90O1N0YW5kYWxvbmUgUHJvZ3JhbSZxdW90OyBmb3IgYSBsYXVuY2ggaXRlbSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1haW5DbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdob3NlIG1haW4oKSBtZXRob2QgaXMgdG8gYmUgbGF1bmNoZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGx1Z2luSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBwbHVnaW4gY29udGFpbmluZyB0aGUgcHJvZ3JhbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlldyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgJnF1b3Q7V29ya2JlbmNoIFZpZXcmcXVvdDsgZm9yIGEgbGF1bmNoIGl0ZW0gdG8gYWN0aXZhdGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBXb3JrYmVuY2ggVmlldyB0byBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgaXRlbSBpcyBsYXVuY2hlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhIGxhdW5jaCBpdGVtIGNhdGVnb3J5IGhlYWRpbmcuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGNhdGVnb3J5LiAgQ2F0ZWdvcmllcyB3aXRoIGR1cGxpY2F0ZSBpZCZhcG9zO3Mgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IGNhdGVnb3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGxhdW5jaCBpdGVtIGNhdGVnb3J5IGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpdGVtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpZXciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvZ3JhbSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGF1bmNoIGl0ZW0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGxhdW5jaCBpdGVtLiBMYXVuY2ggaXRlbXMgd2l0aCBkdXBsaWNhdGUgaWQmYXBvcztzIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNhdGVnb3J5IHRoaXMgbGF1bmNoIGl0ZW0gYmVsb25ncyB0by4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWNsYXJpbmcgcGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgYW4gaWNvbiB0byBkaXNwbGF5IHdpdGggdGhpcyBsYXVuY2ggaXRlbSBpbiB0aGUgTGF1bmNoZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU2V0IHRvICZxdW90O2ZhbHNlJnF1b3Q7IHRvIGRpc2FibGUgdGhpcyBsYXVuY2ggaXRlbSwgb3IgdG8gJnF1b3Q7dHJ1ZSZxdW90OyB0byBlbmFibGUgaXQgKGRlZmF1bHQpLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgcGxhaW4tdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGlzIGxhdW5jaCBpdGVtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbURlc2NyaXB0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMTA1ZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBJdGVtRGVzY3JpcHRvciBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCBhIGxhdW5jaCBpdGVtLgotICovCi1jbGFzcyBJdGVtRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIEltYWdlICBpY29uOwotCXByaXZhdGUgU3RyaW5nIHZpZXc7Ci0JcHJpdmF0ZSBTdHJpbmcgbWFpblR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIEl0ZW1EZXNjcmlwdG9yLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBpZAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBpY29uIHRoZSBpY29uCi0JICogQHBhcmFtIHZpZXcgdGhlIGhvc3QgdmlldyBtYXkgYmUgbnVsbCBpZiBpdCBpcyBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24KLQkgKiBAcGFyYW0gbWFpblR5cGUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHJ1biBtYXkgYmUgbnVsbCBpZiBpdCBpcyBhIHZpZXcKLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB3aGljaCBjb250YWlucyB0aGUgbWFpbiBjbGFzcwotCSAqLwotCXB1YmxpYyBJdGVtRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCUltYWdlIGljb24sIFN0cmluZyB2aWV3LCBTdHJpbmcgbWFpblR5cGUsIFN0cmluZyBwbHVnaW5JZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMudmlldyA9IHZpZXc7Ci0JCXRoaXMubWFpblR5cGUgPSBtYWluVHlwZTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHNwZWNpZmllZCB0eXBlLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHR5cGUgd2FzIHNwZWNpZmllZCBieSB0aGUgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHNwZWNpZmllZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVJdGVtSW5zdGFuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKExhdW5jaGVyUGx1Z2luLkxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgZm9yIHRoaXMgcHJvZ3JhbS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVzZXItc3BlY2lmaWVkIElEIGZvciB0aGlzIHByb2dyYW0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgbmFtZSBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiBhIG5ld2xpbmUtZGVsaW1pdGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9ncmFtLCBudWxsIGlmIG5vIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGljb24gZm9yIHRoaXMgZGVzY3JpcHRvcgotCSAqIAotCSAqIEByZXR1cm5zIGFuIGljb24sIG51bGwgaWYgdGhlIGl0ZW0gaXMgYSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGljb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvc3QgdmlldyBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgaG9zdCB2aWV3LCBudWxsIGlmIHRoZSBpdGVtIGlzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmlldyAoKSB7Ci0JCXJldHVybiB2aWV3OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdG8gcnVuCi0JICogZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsYXNzIHRvIHJ1biBmb3IgdGhlIHByb2dyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluVHlwZSAoKSB7Ci0JCXJldHVybiBtYWluVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIHByb2dyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCAoKSB7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyLgotCSAqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIGlzIGEgZm9sZGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb2xkZXIoKSB7Ci0JCXJldHVybiAobWFpblR5cGUgPT0gbnVsbCAmJiB2aWV3ID09IG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBlcXVhbGl0eSBvZiBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcy5nZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXIuZ2V0SWQoKSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIEl0ZW1EZXNjcmlwdG9yKSB7Ci0JCQlJdGVtRGVzY3JpcHRvciBvdGhlckRlc2NyaXB0b3IgPSAoSXRlbURlc2NyaXB0b3IpIG90aGVyOwotCQkJcmV0dXJuIGdldElkKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlckRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBQcm9kdWNlcyBhIGhhc2hjb2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhhc2hjb2RlCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGlkLnRvVXBwZXJDYXNlKCkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1UcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjAzMGE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8gc3RvcmUgdHJlZSBzdHJ1Y3R1cmVzIG9mIEl0ZW1EZXNjcmlwdG9ycwotICovCi1jbGFzcyBJdGVtVHJlZU5vZGUgewotCXByaXZhdGUgSXRlbVRyZWVOb2RlIG5leHRTaWJsaW5nOwotCXByaXZhdGUgSXRlbVRyZWVOb2RlIGZpcnN0Q2hpbGQ7Ci0JcHJpdmF0ZSBJdGVtRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGxlYWYgSXRlbVRyZWVOb2RlIHdpdGggYSBnaXZlbiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZShJdGVtRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5vZGUgdG8gdGhlIFRyZWUgaW4gc29ydGVkIG9yZGVyIGJ5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYWRkLiBOb3RlIHRoYXQgbm9kZS5uZXh0U2libGluZyBtdXN0IGJlIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTb3J0ZWROb2RlKEl0ZW1UcmVlTm9kZSBub2RlKSB7Ci0JCWlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLQkJCWZpcnN0Q2hpbGQgPSBub2RlOwotCQl9IGVsc2UgaWYgKGZpcnN0Q2hpbGQuZGVzY3JpcHRvci5nZXROYW1lKCkuY29tcGFyZVRvKG5vZGUuZGVzY3JpcHRvci5nZXROYW1lKCkpID4gMCkgewotCQkJbm9kZS5uZXh0U2libGluZyA9IGZpcnN0Q2hpbGQ7Ci0JCQlmaXJzdENoaWxkID0gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCUl0ZW1UcmVlTm9kZSBjdXJzb3I7Ci0JCQlmb3IgKGN1cnNvciA9IGZpcnN0Q2hpbGQ7IGN1cnNvci5uZXh0U2libGluZyAhPSBudWxsOyBjdXJzb3IgPSBjdXJzb3IubmV4dFNpYmxpbmcpIHsKLQkJCQlJdGVtVHJlZU5vZGUgc2libGluZyA9IGN1cnNvci5uZXh0U2libGluZzsKLQkJCQlpZiAoc2libGluZy5kZXNjcmlwdG9yLmdldE5hbWUoKS5jb21wYXJlVG8obm9kZS5kZXNjcmlwdG9yLmdldE5hbWUoKSkgPiAwKSBicmVhazsKLQkJCX0KLQkJCW5vZGUubmV4dFNpYmxpbmcgPSBjdXJzb3IubmV4dFNpYmxpbmc7Ci0JCQljdXJzb3IubmV4dFNpYmxpbmcgPSBub2RlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEl0ZW1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgc2libGluZyBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCBzaWJsaW5nLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiBmaXJzdENoaWxkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjY0MWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaGVyUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExhdW5jaGVyUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCi0JCUxBVU5DSF9JVEVNU19QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZID0gImNhdGVnb3J5IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNID0gIml0ZW0iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0lURU1fSUNPTiA9ICJpY29uIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNID0gInByb2dyYW0iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fUExVR0lOID0gInBsdWdpbklkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX0NMQVNTID0gIm1haW5DbGFzcyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVklFVyA9ICJ2aWV3IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WSUVXX1ZJRVdJRCA9ICJ2aWV3SWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCA9ICJpZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX05BTUUgPSAibmFtZSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX0VOQUJMRUQgPSAiZW5hYmxlZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX0NBVEVHT1JZID0gImNhdGVnb3J5IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9UUlVFID0gInRydWUiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsJCQotCi0Jc3RhdGljIGZpbmFsIGludAotCQlsaUNsb3NlZEZvbGRlciA9IDAsCi0JCWxpT3BlbkZvbGRlciA9IDEsCi0JCWxpR2VuZXJpY0V4YW1wbGUgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImljb25zL2Nsb3NlZEZvbGRlci5naWYiLAotCQkiaWNvbnMvb3BlbkZvbGRlci5naWYiLAotCQkiaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZiIgfTsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2VzW107Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBMYXVuY2hlclBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgTGF1bmNoZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoZ2V0QnVuZGxlKCkpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBDbGVhbiB1cAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZnJlZVJlc291cmNlcygpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhdW5jaGVyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCWltYWdlc1tpXSA9IGdldEltYWdlRnJvbVBsdWdpbihwbHVnaW4uZ2V0QnVuZGxlKCksIGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2VzW2ldID09IG51bGwpIHsKLQkJCQkJZnJlZVJlc291cmNlcygpOwotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiksIG51bGwpOwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGlzdCBvZiBhdmFpbGFibGUgcHJvZ3JhbXMgZnJvbSByZWdpc3RlcmVkIGV4dGVuc2lvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVtVHJlZU5vZGUgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgdHJlZSBvZiBpdGVtcyAodGhlIHJvb3QgaXMgbm90IHRvIGJlIGRpc3BsYXllZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZW1UcmVlTm9kZSBnZXRMYXVuY2hJdGVtVHJlZSgpIHsKLQkJSXRlbVRyZWVOb2RlIGNhdGVnb3J5VHJlZSA9Ci0JCQluZXcgSXRlbVRyZWVOb2RlKG5ldyBJdGVtRGVzY3JpcHRvcigiPDxSb290Pj4iLCAiPDxSb290Pj4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSk7Ci0KLQkJLy8gZ2V0IHRoZSBwbGF0Zm9ybSdzIHB1YmxpYyBwbHVnaW4gcmVnaXN0cnkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJLy8gcmV0cmlldmUgYWxsIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgcmVnaXN0ZXJlZCBhdCBvdXIgbGF1bmNoSXRlbXMgZXh0ZW5zaW9uLXBvaW50Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9Ci0JCQlleHRlbnNpb25SZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTEFVTkNIX0lURU1TX1BPSU5UX0lEKTsKLQkJCQotCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnRzID09IG51bGwgfHwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbnMiKSwgbnVsbCk7Ci0JCQlyZXR1cm4gY2F0ZWdvcnlUcmVlOwotCQl9Ci0JCQotCQkvKiBDb2xsZWN0IGFsbCBsYXVuY2ggY2F0ZWdvcmllcyAtLSBjb2FsZXNjZSB0aG9zZSB3aXRoIHNhbWUgSUQgKi8KLQkJSGFzaE1hcCBpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCQkJCi0JCQlpZiAoaWRNYXAuY29udGFpbnNLZXkoYXR0cmliSWQpKSBjb250aW51ZTsKLQkJCWlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZKSkgewotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJOYW1lID0gZ2V0SXRlbU5hbWUoY2UpOyAKLQkJCQlJdGVtRGVzY3JpcHRvciB0aGVEZXNjcmlwdG9yID0gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLAotCQkJCQlnZXRJdGVtRGVzY3JpcHRpb24oY2UpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBjZSk7Ci0JCQkJaWRNYXAucHV0KGF0dHJpYklkLCBuZXcgSXRlbVRyZWVOb2RlKHRoZURlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogR2VuZXJhdGUgbGF1bmNoIGNhdGVnb3J5IGhpZXJhcmNoeSAqLwotCQlTZXQgdGVtcElkU2V0ID0gbmV3IEhhc2hTZXQoKTsgLy8gdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMgZnJvbSBiZWluZyBlbnRlcmVkIGludG8gdGhlIHRyZWUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0JCQkKLQkJCWlmICh0ZW1wSWRTZXQuY29udGFpbnMoYXR0cmliSWQpKSBjb250aW51ZTsKLQkJCWlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZKSkgewotCQkJCWZpbmFsIEl0ZW1UcmVlTm9kZSB0aGVOb2RlID0gKEl0ZW1UcmVlTm9kZSkgaWRNYXAuZ2V0KGF0dHJpYklkKTsKLQkJCQlhZGRJdGVtQnlDYXRlZ29yeShjZSwgY2F0ZWdvcnlUcmVlLCB0aGVOb2RlLCBpZE1hcCk7Ci0JCQkJdGVtcElkU2V0LmFkZChhdHRyaWJJZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIEdlbmVyYXRlIHByb2dyYW0gdHJlZSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQotCQkJaWYgKGlkTWFwLmNvbnRhaW5zS2V5KGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gZWxzZSBpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9JVEVNKSkgewotCQkJCWZpbmFsIFN0cmluZyBlbmFibGVkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfRU5BQkxFRCwgCi0JCQkJCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfVFJVRSk7Ci0JCQkJaWYgKGVuYWJsZWQuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX0ZBTFNFKSkgY29udGludWU7Ci0JCQkJSXRlbURlc2NyaXB0b3IgdGhlRGVzY3JpcHRvciA9IGNyZWF0ZUl0ZW1EZXNjcmlwdG9yKGNlLCBhdHRyaWJJZCk7CQkJCQotCQkJCi0JCQkJaWYgKHRoZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlmaW5hbCBJdGVtVHJlZU5vZGUgdGhlTm9kZSA9IG5ldyBJdGVtVHJlZU5vZGUodGhlRGVzY3JpcHRvcik7Ci0JCQkJCWFkZEl0ZW1CeUNhdGVnb3J5KGNlLCBjYXRlZ29yeVRyZWUsIHRoZU5vZGUsIGlkTWFwKTsKLQkJCQkJaWRNYXAucHV0KGF0dHJpYklkLCB0aGVOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3J5VHJlZTsKLQl9Ci0KLQkJCQkKLQkvKioKLQkgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGNhdGVnb3J5IHRyZWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJdGVtQnlDYXRlZ29yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIEl0ZW1UcmVlTm9kZSByb290LAotCQlJdGVtVHJlZU5vZGUgdGhlTm9kZSwgSGFzaE1hcCBpZE1hcCkgewotCQlmaW5hbCBTdHJpbmcgYXR0cmliQ2F0ZWdvcnkgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9DQVRFR09SWSwgbnVsbCk7Ci0JCQkJCi0JCS8vIGxvY2F0ZSB0aGUgcGFyZW50IG5vZGUKLQkJSXRlbVRyZWVOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCQlpZiAoYXR0cmliQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50Tm9kZSA9IChJdGVtVHJlZU5vZGUpIGlkTWFwLmdldChhdHRyaWJDYXRlZ29yeSk7Ci0JCX0KLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgcGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQkJCi0JCS8vIGFkZCB0aGUgaXRlbQotCQlwYXJlbnROb2RlLmFkZFNvcnRlZE5vZGUodGhlTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJdGVtRGVzY3JpcHRvciBmcm9tIGFuIFhNTCBkZWZpbml0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcGFyYW0gYXR0cmliSWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEByZXR1cm4gYSBuZXcgSXRlbURlc2NyaXB0b3IsIG9yIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSXRlbURlc2NyaXB0b3IgY3JlYXRlSXRlbURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgYXR0cmliSWQpIHsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYk5hbWUgPSBnZXRJdGVtTmFtZShjZSk7Ci0JCWZpbmFsIEltYWdlICBhdHRyaWJJY29uID0gZ2V0SXRlbUljb24oY2UpOwotCQlmaW5hbCBTdHJpbmcgYXR0cmliRGVzY3JpcHRpb24gPSBnZXRJdGVtRGVzY3JpcHRpb24oY2UpOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCB2aWV3Q0UgPSBnZXRJdGVtRWxlbWVudChjZSwgTEFVTkNIX0lURU1TX1hNTF9WSUVXKTsKLQkJaWYgKHZpZXdDRSAhPSBudWxsKSB7Ci0JCQkvL0l0ZW0gaXMgYSB2aWV3Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliVmlldyA9IGdldEl0ZW1BdHRyaWJ1dGUodmlld0NFLCBMQVVOQ0hfSVRFTVNfWE1MX1ZJRVdfVklFV0lELCBudWxsKTsJCQotCQkJaWYgKGF0dHJpYlZpZXcgPT0gbnVsbCkgewotCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5JbmNvbXBsZXRlVmlld0xhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwgYXR0cmliRGVzY3JpcHRpb24sCi0JCQkJCWF0dHJpYkljb24sIGF0dHJpYlZpZXcsIG51bGwsIG51bGwsIHZpZXdDRSk7Ci0JCX0gZWxzZSB7Ci0JCQkvL0l0ZW0gaXMgYSBzdGFuZGFsb25lCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcHJvZ3JhbUNFID0gZ2V0SXRlbUVsZW1lbnQoY2UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTSk7Ci0JCQlpZiAocHJvZ3JhbUNFICE9IG51bGwpIHsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliUGx1Z2luSWQgPSBnZXRJdGVtQXR0cmlidXRlKHByb2dyYW1DRSwgTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX1BMVUdJTiwgbnVsbCk7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYkNsYXNzICAgID0gZ2V0SXRlbUF0dHJpYnV0ZShwcm9ncmFtQ0UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUywgbnVsbCk7Ci0JCQkJaWYgKGF0dHJpYkNsYXNzID09IG51bGwgfHwgYXR0cmliUGx1Z2luSWQgPT0gbnVsbCkgewotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZVByb2dyYW1MYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsIGF0dHJpYkRlc2NyaXB0aW9uLAotCQkJCQlhdHRyaWJJY29uLCBudWxsLCBhdHRyaWJDbGFzcywgYXR0cmliUGx1Z2luSWQsIHByb2dyYW1DRSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5JbmNvbXBsZXRlTGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgY2hpbGQgWE1MIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gZmV0Y2gKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRJdGVtRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIFN0cmluZyBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRDRXMgPSBjZS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIChlbGVtZW50Q0VzICE9IG51bGwgJiYgZWxlbWVudENFcy5sZW5ndGggIT0gMCkgPyBlbGVtZW50Q0VzWzBdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbiBYTUwgYXR0cmlidXRlIGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gZmV0Y2gKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbUF0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gY2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JCXJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZ2l2ZW4gdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHJldHVybiBhIG5ld2xpbmUtZGVsaW1pdGVkIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGl0ZW0sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtRGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfSVRFTV9ERVNDUklQVElPTiwgIiIpOwotCQlyZXR1cm4gKGRlc2NyaXB0aW9uLmxlbmd0aCgpID09IDApID8gbnVsbCA6IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1OYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlyZXR1cm4gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfTkFNRSwKLQkJCWdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk1pc3NpbmcubmFtZSIpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGljb24gZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gYW4gaWNvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEl0ZW1JY29uKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgaWNvblBhdGggPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0lURU1fSUNPTiwgIiIpOwotCQlpZiAoaWNvblBhdGgubGVuZ3RoKCkgIT0gMCkgewotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGNlLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShzeW1ib2xpY05hbWUpOwotCQkJSW1hZ2UgaWNvbiA9IGdldEltYWdlRnJvbVBsdWdpbihidW5kbGUsIGljb25QYXRoKTsKLQkJCWlmIChpY29uICE9IG51bGwpIHsKLQkJCQlJbWFnZVtdIG5ld0ltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZXMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbWFnZXMsIDAsIG5ld0ltYWdlcywgMCwgaW1hZ2VzLmxlbmd0aCk7Ci0JCQkJbmV3SW1hZ2VzW2ltYWdlcy5sZW5ndGhdID0gaWNvbjsKLQkJCQlpbWFnZXMgPSBuZXdJbWFnZXM7Ci0JCQkJcmV0dXJuIGljb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlc1tsaUdlbmVyaWNFeGFtcGxlXTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGltYWdlIGZyb20gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gYnVuZGxlIHRoZSBwbHVnaW4gZGVzY3JpcHRvciBmb3IgdGhlIHBsdWdpbiB3aXRoIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBpY29uUGF0aCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGljb25QYXRoKSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVXJsID0gYnVuZGxlLmdldEVudHJ5KCIvIik7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVXJsLCBpY29uUGF0aCk7Ci0JCQlpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0JCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShpcyk7Ci0JCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJcmV0dXJuIGltYWdlOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkgaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyYzkzNGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLS8qKgotICogTGF1bmNoZXIgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogdG8gbGF1bmNoIHRoZSBvdGhlciByZWdpc3RlcmVkIGV4YW1wbGVzLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBTaGVsbCB3b3JrYmVuY2hTaGVsbDsKLQkKLQlwcml2YXRlIFRyZWUgbGF1bmNoVHJlZTsKLQlwcml2YXRlIFRleHQgZGVzY3JpcHRpb25UZXh0OwotCXByaXZhdGUgQnV0dG9uIHJ1bkJ1dHRvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMYXVuY2hlclZpZXcuCi0JICovCi0JcHVibGljIExhdW5jaGVyVmlldygpIHsKLQkJTGF1bmNoZXJQbHVnaW4uaW5pdFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJd29ya2JlbmNoU2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgU3BsaXRMYXlvdXQoKSk7Ci0JCQkJCi0JCUdyb3VwIGxhdW5jaEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXVuY2hHcm91cC5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmxhdW5jaEdyb3VwLnRleHQiKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXVuY2hHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJbGF1bmNoVHJlZSA9IG5ldyBUcmVlKGxhdW5jaEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGF1bmNoVHJlZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGF1bmNoVHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW0gPSBnZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShpdGVtKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW0gPSBnZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShpdGVtKTsKLQkJCQlpZiAoaXRlbS5nZXRNYWluVHlwZSgpID09IG51bGwgJiYgaXRlbS5nZXRWaWV3KCkgPT0gbnVsbCkgewotCQkJCQkvLyBDYXRlZ29yeSBzZWxlY3RlZCwgc28ganVzdCBleHBhbmQvY29sYXBzZSB0aGUgbm9kZQotCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJYm9vbGVhbiBleHBhbmRlZCA9IHRyZWVJdGVtLmdldEV4cGFuZGVkKCk7Ci0JCQkJCWlmICh0cmVlSXRlbSAhPSBudWxsKSB0cmVlSXRlbS5zZXRFeHBhbmRlZCghZXhwYW5kZWQpOwotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbZXhwYW5kZWQgPyBMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlciA6IExhdW5jaGVyUGx1Z2luLmxpT3BlbkZvbGRlcl0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhdW5jaEl0ZW0oZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWxhdW5jaFRyZWUuYWRkVHJlZUxpc3RlbmVyKG5ldyBUcmVlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpQ2xvc2VkRm9sZGVyXSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlPcGVuRm9sZGVyXSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJ1bkJ1dHRvbiA9IG5ldyBCdXR0b24obGF1bmNoR3JvdXAsIFNXVC5QVVNIKTsKLQkJcnVuQnV0dG9uLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcubGF1bmNoQnV0dG9uLnRleHQiKSk7Ci0JCXJ1bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWxhdW5jaEl0ZW0oZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIGRlc2NyaXB0aW9uR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5kZXNjcmlwdGlvbkdyb3VwLnRleHQiKSk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQoZGVzY3JpcHRpb25Hcm91cCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8Ci0JCQlTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCi0JCXNldERlc2NyaXB0aW9uQnlJdGVtKG51bGwpOwotCQlzZXRJdGVtRGVzY3JpcHRvcnMoTGF1bmNoZXJQbHVnaW4uZ2V0TGF1bmNoSXRlbVRyZWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgIHsKLQkJbGF1bmNoVHJlZS5zZXRGb2N1cygpOwotCQlydW5CdXR0b24uZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKHJ1bkJ1dHRvbik7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd29ya2JlbmNoU2hlbGwgPSBudWxsOwotCQlsYXVuY2hUcmVlID0gbnVsbDsKLQkJZGVzY3JpcHRpb25UZXh0ID0gbnVsbDsKLQkJcnVuQnV0dG9uID0gbnVsbDsJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbHMgYSBuZXcgbGF1bmNoIGxpc3QuCi0JICogCi0JICogQHBhcmFtIG5ld1Jvb3QgdGhlIG5ldyB0cmVlIG9mIGxhdW5jaCBpdGVtcyBmb3IgdGhlIFVJCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXRlbURlc2NyaXB0b3JzKGZpbmFsIEl0ZW1UcmVlTm9kZSBuZXdSb290KSB7Ci0JCWlmICh3b3JrYmVuY2hTaGVsbCA9PSBudWxsKSByZXR1cm47Ci0JCXdvcmtiZW5jaFNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKChsYXVuY2hUcmVlID09IG51bGwpIHx8IChsYXVuY2hUcmVlLmlzRGlzcG9zZWQoKSkpIHJldHVybjsKLQkJCQlsYXVuY2hUcmVlLnJlbW92ZUFsbCgpOwotCQkJCi0JCQkJZm9yIChJdGVtVHJlZU5vZGUgbm9kZSA9IG5ld1Jvb3QuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7Ci0JCQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJZG9Ob2RlKG5vZGUsIG5ldyBUcmVlSXRlbShsYXVuY2hUcmVlLCBTV1QuTk9ORSkpOyAvLyB0b3AtbGV2ZWwgVHJlZUl0ZW0KLQkJCQl9Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgYWRkR3JvdXAoVHJlZUl0ZW0gcGFyZW50LCBJdGVtVHJlZU5vZGUgbm9kZSkgewotCQkJCWZvciAoO25vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlkb05vZGUobm9kZSwgbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpKTsgLy8gVHJlZUl0ZW0gYXQgZGVwdGggPiAwCi0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGRvTm9kZShJdGVtVHJlZU5vZGUgbm9kZSwgVHJlZUl0ZW0gdHJlZUl0ZW0pIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gbm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0JCQkJdHJlZUl0ZW0uc2V0VGV4dChpdGVtLmdldE5hbWUoKSk7Ci0JCQkJdHJlZUl0ZW0uc2V0RGF0YShpdGVtKTsKLQkJCQlpZiAobm9kZS5nZXREZXNjcmlwdG9yKCkuaXNGb2xkZXIoKSkgewotCQkJCQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQkJCXRyZWVJdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlcl0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyZWVJdGVtLnNldEltYWdlKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldEljb24oKSk7Ci0JCQkJfQotCQkJCWFkZEdyb3VwKHRyZWVJdGVtLCBub2RlLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHNwZWNpZmllZCBsYXVuY2ggaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbURlc2NyaXB0b3IgdGhlIGxhdW5jaCBpdGVtIHRvIGV4ZWN1dGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgbGF1bmNoSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvcikgewotCQkvKiBDYXNlIDE6IFRoZSBsYXVuY2ggaXRlbSBpcyBhIHZpZXcgKi8KLQkJU3RyaW5nIHBsdWdpblZpZXdJZCA9IGl0ZW1EZXNjcmlwdG9yLmdldFZpZXcgKCk7Ci0JCWlmIChwbHVnaW5WaWV3SWQgIT0gbnVsbCkgewotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCA9IHRoaXM7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFydFNpdGUgd29ya2JlbmNoUGFydFNpdGUgPSB3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hQYXJ0U2l0ZS5nZXRQYWdlKCk7Ci0JCQl0cnkgewotCQkJCXdvcmtiZW5jaFBhZ2Uuc2hvd1ZpZXcocGx1Z2luVmlld0lkKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkludm9jYXRpb24iKSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogQ2FzZSAyOiBUaGUgbGF1bmNoIGl0ZW0gaXMgYSBzdGFuZGFsb25lIHByb2dyYW0gKi8KLQkJaWYgKHdvcmtiZW5jaFNoZWxsID09IG51bGwpIHJldHVybjsKLQkJdHJ5IHsKLQkJCU9iamVjdCBpbnN0YW5jZSA9IGl0ZW1EZXNjcmlwdG9yLmNyZWF0ZUl0ZW1JbnN0YW5jZSgpOwotCQkJaWYgKGluc3RhbmNlICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSB3b3JrYmVuY2hTaGVsbC5nZXREaXNwbGF5KCk7Ci0JCQkJTWV0aG9kIG9wZW5NZXRob2QgPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJvcGVuIiwgbmV3IENsYXNzW10ge0Rpc3BsYXkuY2xhc3N9KTsKLQkJCQlvcGVuTWV0aG9kLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtdIHtkaXNwbGF5fSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkRvZXNOb3RJbXBsZW1lbnRNZXRob2QiKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkNvdWxkTm90SW5zdGFudGlhdGVDbGFzcyIpLCBlKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogT2J0YWlucyB0aGUgc2VsZWN0ZWQgbGF1bmNoIGl0ZW0uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEl0ZW1EZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSBJdGVtRGVzY3JpcHRvciBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCWZpbmFsIFRyZWVJdGVtW10gc2VsZWN0aW9ucyA9IGxhdW5jaFRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IgPSAoSXRlbURlc2NyaXB0b3IpIHNlbGVjdGlvbnNbMF0uZ2V0RGF0YSgpOwotCQlyZXR1cm4gaXRlbURlc2NyaXB0b3I7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGRlc2NyaXB0aW9uIHRleHQgdG8gcmVmbGVjdCB0aGF0IG9mIGEgcGFydGljdWxhciBJdGVtRGVzY3JpcHRvci4KLQkgKgotCSAqIEBwYXJhbSBpdGVtRGVzY3JpcHRvciB0aGUgbGF1bmNoIGl0ZW0gd2hvc2UgZGVzY3JpcHRpb24gaXMgdG8gYmUgZGlzcGxheWVkLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVzY3JpcHRpb25CeUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IpIHsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlpZiAoaXRlbURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24gPSBMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5OdWxsLmRlc2NyaXB0aW9uIik7Ci0JCQlpZiAocnVuQnV0dG9uICE9IG51bGwpIHJ1bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2NyaXB0aW9uID0gaXRlbURlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTWlzc2luZy5kZXNjcmlwdGlvbiIpOwotCQkJaWYgKHJ1bkJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJcnVuQnV0dG9uLnNldEVuYWJsZWQoaXRlbURlc2NyaXB0b3IuZ2V0VmlldygpICE9IG51bGwgfHwgaXRlbURlc2NyaXB0b3IuZ2V0TWFpblR5cGUoKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvU3BsaXRMYXlvdXQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2MzdhZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvU3BsaXRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBIExheW91dCBjbGFzcyB0aGF0IGF1dG9tYXRpY2FsbHkgc3dpdGNoZXMgZnJvbSBhIGhvcml6b250YWwgc3BsaXQgdG8gYSB2ZXJ0aWNhbAotICogc3BsaXQgbGF5b3V0IHRvIGFjY29tb2RhdGUgY2hhbmdpbmcgc2l6ZSBjb25kaXRpb25zLgotICogCi0gKiBMYXRlciBvbiB3ZSBtaWdodCBpbXByb3ZlIHRoaXMgY2xhc3MgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlICJwcmVmZXJyZWQiIHNpemUgb2YKLSAqIHRoZSB3aWRnZXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3BsaXRMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCQlzcGxpdEhvcml6b250YWxseSA9IDAsCi0JCXNwbGl0VmVydGljYWxseSA9IDE7Ci0JcHJpdmF0ZSBpbnQgc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQotCXB1YmxpYyBpbnQgc3BhY2luZyA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5Ub3AgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luTGVmdCA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5SaWdodCA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5Cb3R0b20gPSAzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgU3BsaXRMYXlvdXQoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJCVBvaW50IGhTcGxpdFNpemUgPSBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJUG9pbnQgdlNwbGl0U2l6ZSA9IGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmYWxzZSk7Ci0JCQkJaW50IGhTcGxpdEFyZWEgPSBoU3BsaXRTaXplLnggKiBoU3BsaXRTaXplLnk7Ci0JCQkJaW50IHZTcGxpdEFyZWEgPSB2U3BsaXRTaXplLnggKiB2U3BsaXRTaXplLnk7Ci0JCQkJLy8gQ2hvb3NlIGRpcmVjdGlvbiBjb25zdW1pbmcgbGVhc3QgYXJlYQotCQkJCWlmIChoU3BsaXRBcmVhIDwgdlNwbGl0QXJlYSkgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCQlyZXR1cm4gaFNwbGl0U2l6ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0VmVydGljYWxseTsKLQkJCQkJcmV0dXJuIHZTcGxpdFNpemU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBDb25zdHJhaW5lZCBpbiBoZWlnaHQ6IHNwbGl0IHZlcnRpY2FsbHkKLQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0VmVydGljYWxseTsKLQkJCQlyZXR1cm4gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQkJLy8gQ29uc3RyYWluZWQgaW4gd2lkdGg6IHNwbGl0IGhvcml6b250YWxseQotCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJcmV0dXJuIGNvbXB1dGVIU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhIaW50IDwgd0hpbnQpIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJCXJldHVybiBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQkJcmV0dXJuIGNvbXB1dGVIU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCQl9CQkJCQkKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIExheW91dCNsYXlvdXQoQ29tcG9zaXRlLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQljb21wdXRlU2l6ZShjb21wb3NpdGUsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0LCBmYWxzZSk7Ci0JCQotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJY2xpZW50QXJlYS54ICs9IG1hcmdpbkxlZnQ7Ci0JCWNsaWVudEFyZWEueSArPSBtYXJnaW5Ub3A7Ci0JCWNsaWVudEFyZWEud2lkdGggLT0gbWFyZ2luUmlnaHQgKyBtYXJnaW5MZWZ0OwotCQljbGllbnRBcmVhLmhlaWdodCAtPSBtYXJnaW5Cb3R0b20gKyBtYXJnaW5Ub3A7Ci0JCVBvaW50IHBvc2l0aW9uID0gbmV3IFBvaW50KGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlmaW5hbCBSZWN0YW5nbGUgYm91bmRzOwotCQkJaWYgKHNwbGl0RGlyZWN0aW9uID09IHNwbGl0SG9yaXpvbnRhbGx5KSB7Ci0JCQkJaW50IGhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0IC8gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgY2xpZW50QXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJCQlwb3NpdGlvbi55ICs9IGhlaWdodCArIHNwYWNpbmc7Ci0JCQl9IGVsc2UgewotCQkJCWludCB3aWR0aCA9IGNsaWVudEFyZWEud2lkdGggLyBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJYm91bmRzID0gbmV3IFJlY3RhbmdsZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJCXBvc2l0aW9uLnggKz0gd2lkdGggKyBzcGFjaW5nOwotCQkJfQotCQkJYm91bmRzLndpZHRoID0gTWF0aC5tYXgoYm91bmRzLndpZHRoLCAwKTsKLQkJCWJvdW5kcy5oZWlnaHQgPSBNYXRoLm1heChib3VuZHMuaGVpZ2h0LCAwKTsKLQkJCWNoaWxkLnNldEJvdW5kcyhib3VuZHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlSFNwbGl0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b20pOwotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCi0JCQlQb2ludCBjaGlsZFNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJc2l6ZS54ID0gTWF0aC5tYXgoc2l6ZS54LCBjaGlsZFNpemUueCk7Ci0JCQlzaXplLnkgKz0gY2hpbGRTaXplLnkgKyBzcGFjaW5nOwotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVZTcGxpdFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCwgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQotCQkJUG9pbnQgY2hpbGRTaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCXNpemUueCArPSBjaGlsZFNpemUueCArIHNwYWNpbmc7Ci0JCQlzaXplLnkgPSBNYXRoLm1heChzaXplLnksIGNoaWxkU2l6ZS55KTsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmMyY2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTM2MmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MDMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTU1ZDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLmxheW91dHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgyOWZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIExheW91dCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBMYXlvdXRzPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSAKLXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LgotVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YQotdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIHRoZSB1bmRlcmx5aW5nCi1jb2RlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Q29kZTwvc3Ryb25nPiBidXR0b24uCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+TGF5b3V0czwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ1ZGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0IEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxheW91dEV4YW1wbGUubmFtZSA9IFNXVCBMYXlvdXRzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5uYW1lID0gTGF5b3V0cwotbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgbGF5b3V0cy4gXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSBcCi0JdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBsYXlvdXQuXAotCVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEgXAotCXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCBjb2RlIGNhbiBiZSBcCi0JZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSBDb2RlIGJ1dHRvbi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUyM2I5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0UGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsYXlvdXRzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy5MYXlvdXRWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xheW91dHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQyZGEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIExheW91dFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OWIzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5MYXlvdXRzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgbGF5b3V0cyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgbGF5b3V0LgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUxheW91dEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgTGF5b3V0RXhhbXBsZShmcmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMGY2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFkODY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTM6NTQgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmU3NjA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLSAgICAgICAgICAgIAotc291cmNlLm9sZXdpbjMyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyN2RhOGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBPTEUgV2ViIEJyb3dzZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIE9MRSBXZWIgQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy4KLTwvcD4KLTxwPgotV2hlbiB0aGUgdmlldyBpcyBvcGVuZWQsIGl0IHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBXaW5kb3dzIEludGVybmV0IEV4cGxvcmVyCi1jb250cm9sLiAgVGhlIE9MRSB3ZWIgYnJvd3NlciBoYXMKLTxzdHJvbmc+QmFjazwvc3Ryb25nPiBhbmQgPHN0cm9uZz5Gb3J3YXJkPC9zdHJvbmc+IGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMKLWEgPHN0cm9uZz5Ib21lPC9zdHJvbmc+IGJ1dHRvbiB0byB0YWtlIHlvdSB0byB0aGUgd2ViIGJyb3dzZXIncyBob21lIHBhZ2UsIGEgPHN0cm9uZz5TdG9wPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCBzdG9wcyB0aGUgCi1jdXJyZW50IHRyYW5zZmVyLCBhIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCB3aWxsIHNlYXJjaCBmb3IgdGV4dCB0eXBlZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IHRleHQgZmllbGQsIGFuZAotYSA8c3Ryb25nPlJlZnJlc2g8L3N0cm9uZz4gYnV0dG9uIHdoaWNoIHJlLWRyYXdzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLiBUaGVyZSBpcyBhbHNvIGEKLTxzdHJvbmc+R288L3N0cm9uZz4gYnV0dG9uIHdoaWNoLCB3aGVuIGNsaWNrZWQsIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBwYWdlIHNwZWNpZmllZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IGZpZWxkLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPk90aGVyPC9zdHJvbmc+LiAgCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXIgKHdpbjMyKTwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgYSB3ZWIgYnJvd3NlciB3aWxsIGFwcGVhci4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldpbjMyIG9ubHk8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmNmNDFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiOWI2YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2EyMzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI3MGUxOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3M2FjOTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTNkMzQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGMzNjJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVE9MRUV4YW1wbGUubmFtZSA9IFNXVCBPTEUgRXhhbXBsZSBQbHVnaW4gKFdpbjMyKQotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lID0gT0xFIFdlYiBCcm93c2VyIChXaW4zMikKLQotbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMubmFtZSA9IFdpbjMyIG9ubHkKLWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyBmb3IgV2luZG93cyBzeXN0ZW1zIG9ubHkuCi0KLWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSA9IE9MRSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy5cblxuXAotCVdoZW4gdGhlIHZpZXcgaXMgb3BlbmVkLCBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgV2luZG93cyBJbnRlcm5ldCBFeHBsb3JlciBcCi0JY29udHJvbC4gIFRoZSBPTEUgV2ViIEJyb3dzZXIgaGFzIFwKLQlCYWNrIGFuZCBGb3J3YXJkIGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMgXAotCWEgSG9tZSBidXR0b24gdG8gdGFrZSB5b3UgdG8gdGhlIHdlYiBicm93c2VyJ3MgaG9tZSBwYWdlLCBhIFN0b3AgYnV0dG9uIHdoaWNoIHN0b3BzIHRoZSBcCi0JY3VycmVudCB0cmFuc2ZlciwgYSBTZWFyY2ggYnV0dG9uIHdoaWNoIHdpbGwgc2VhcmNoIGZvciB0ZXh0IHR5cGVkIGluIHRoZSBBZGRyZXNzIHRleHQgZmllbGQsIGFuZCBcCi0JYSBSZWZyZXNoIGJ1dHRvbiB3aGljaCByZS1kcmF3cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4gVGhlcmUgaXMgYWxzbyBhIFwKLQlHbyBidXR0b24gd2hpY2gsIHdoZW4gY2xpY2tlZCwgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHRoZSBBZGRyZXNzIGZpZWxkLgotCi1icm93c2VyLkJhY2sudGV4dCA9IEJhY2t3YXJkCi1icm93c2VyLkJhY2sudG9vbHRpcCA9IEdvIHRvIHByZXZpb3VzIFdlYiBzaXRlIGluIHRoZSBoaXN0b3J5IGxpc3QKLQotYnJvd3Nlci5Gb3J3YXJkLnRleHQgPSBGb3J3YXJkCi1icm93c2VyLkZvcndhcmQudG9vbHRpcCA9IEdvIHRvIG5leHQgV2ViIHNpdGUgaW4gdGhlIGhpc3RvcnkgbGlzdAotCi1icm93c2VyLkhvbWUudGV4dCA9IEhvbWUKLWJyb3dzZXIuSG9tZS50b29sdGlwID0gR28gdG8gaG9tZSBXZWIgc2l0ZQotCi1icm93c2VyLlN0b3AudGV4dCA9IFN0b3AKLWJyb3dzZXIuU3RvcC50b29sdGlwID0gU3RvcCBsb2FkaW5nIGN1cnJlbnQgV2ViIHNpdGUKLQotYnJvd3Nlci5SZWZyZXNoLnRleHQgPSBSZWZyZXNoCi1icm93c2VyLlJlZnJlc2gudG9vbHRpcCA9IFJlZnJlc2ggY3VycmVudCBXZWIgc2l0ZQotCi1icm93c2VyLlNlYXJjaC50ZXh0ID0gU2VhcmNoCi1icm93c2VyLlNlYXJjaC50b29sdGlwID0gU2VhcmNoIHRoZSBXZWIKLQotYnJvd3Nlci5BZGRyZXNzLmxhYmVsID0gQWRkcmVzcyA6Ci0KLWJyb3dzZXIuR28udGV4dCA9IEdvCi0KLWJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0ID0gTm90IHJlYWR5LgotYnJvd3Nlci5TdGF0ZS5Mb2FkaW5nLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkxvYWRlZC50ZXh0ID0gUmVhZHkuCi1icm93c2VyLlN0YXRlLkludGVyYWN0aXZlLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkNvbXBsZXRlLnRleHQgPSBEb25lLgotCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLWVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wgPSBVbmFibGUgdG8gY3JlYXRlIDw8QnJvd3NlciBDb250cm9sPj4KLQotbGF1bmNoaXRlbS5PTEVFeGFtcGxlLm5hbWU9T0xFIEV4YW1wbGUKLWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5kZXNjcmlwdGlvbj1cCi0JVGhlIE9MRSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIFwKLQlhbiBTV1QgYXBwbGljYXRpb24uXG5cblwKLQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDhlN2Y1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSBGaWxlIHdyaXR0ZW4gYnkgUERFIDEuMCAtLT4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RPTEVFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVQbHVnaW4iPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ib2xld2luMzIuamFyIj4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgIDx2aWV3Ci0gICAgICAgICBuYW1lPSIldmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVCcm93c2VyVmlldyIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLmJyb3dzZXJWaWV3Ij4KLSAgIDwvdmlldz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8Y2F0ZWdvcnkKLSAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiPgotICAgPC9jYXRlZ29yeT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi52aWV3bGF1bmNoZXIiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5icm93c2VyVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9MRUV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PTEVFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PTEVFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzgyZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PTEVFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIE9MRUV4YW1wbGUgaXMgYW4gZXhhbXBsZSB0aGF0IHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIGxpYnJhcmllcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgU1dUIHdpbmRvdyB0aGF0IGNhbiBob3N0IGRpZmZlcmVudCBBY3RpdmUgWAotICogY29udHJvbHMuCi0gKgotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIE9MRUV4YW1wbGUgewotCi0JT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCU9sZUZyYW1lIG9sZUZyYW1lOwotCUJ1dHRvbiBjbG9zZUJ1dHRvbjsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCU9MRUV4YW1wbGUgZXhhbXBsZSA9IG5ldyBPTEVFeGFtcGxlKCk7Ci0JCWV4YW1wbGUub3BlbihkaXNwbGF5KTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqIAotCSAqIENyZWF0ZSBhIGZpbGUgRXhpdCBtZW51IGl0ZW0gCi0JICovCi0Jdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLQkJaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotCQkJbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCX0KLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JCQotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jdm9pZCBkaXNwb3NlQ2xpZW50KCkgewotCQlpZiAoY2xpZW50U2l0ZSAhPSBudWxsKQotCQkJY2xpZW50U2l0ZS5kaXNwb3NlKCk7Ci0JCWNsaWVudFNpdGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFByb21wdCB0aGUgdXNlciBmb3IgYSBmaWxlIGFuZCB0cnkgdG8gb3BlbiBpdCB3aXRoIHNvbWUga25vd24gQWN0aXZlWCBjb250cm9scy4KLQkgKi8KLQl2b2lkIGZpbGVPcGVuKCkgewotCQlTaGVsbCBzaGVsbCA9IG9sZUZyYW1lLmdldFNoZWxsKCk7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwpIHJldHVybjsKLQotCQlkaXNwb3NlQ2xpZW50KCk7Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSAuZG9jIGZpbGUgdXNpbmcgV29yZAotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJkb2MiKSB8fCAKLQkJCQkJCWZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgicnRmIikgfHwKLQkJCQkJCWZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgidHh0IikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShvbGVGcmFtZSwgU1dULk5PTkUsICJXb3JkLkRvY3VtZW50IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSB4bHMgZmlsZSB3aXRoIEV4Y2VsCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhscyIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiLCBuZXcgRmlsZShmaWxlTmFtZSkpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyBhIG1lZGlhIGZpbGUgd2l0aCBNUGxheWVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIm1wYSIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiTVBsYXllciIsIG5ldyBGaWxlKGZpbGVOYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIHdpdGggd212LCBtcGcsIG1wZWcsIGF2aSwgYXNmLCB3YXYgd2l0aCBXTVBsYXllcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ3bXYiKQotCQkJCQkJfHwgZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJtcGciKQotCQkJCQkJfHwgZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJtcGVnIikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiYXZpIikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiYXNmIikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgid2F2IikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShvbGVGcmFtZSwgU1dULk5PTkUsICJXTVBsYXllci5PQ1giKTsKLQkJCQkJCU9sZUF1dG9tYXRpb24gcGxheWVyID0gbmV3IE9sZUF1dG9tYXRpb24oY2xpZW50U2l0ZSk7Ci0JCQkJCQlpbnQgcGxheVVSTFtdID0gcGxheWVyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlVSTCIgfSk7Ci0JCQkJCQlpZiAocGxheVVSTCAhPSBudWxsKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNlZWRlZCA9IHBsYXllci5zZXRQcm9wZXJ0eShwbGF5VVJMWzBdLCBuZXcgVmFyaWFudChmaWxlTmFtZSkpOwotCQkJCQkJCWlmICghc3VjZWVkZWQpCi0JCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQkJfQotCQkJCQkJcGxheWVyLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSBQREYgZmlsZSB3aXRoIEFjcm9iYXQgcmVhZGVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInBkZiIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiUERGLlBkZkN0cmwuNSIpOwotCQkJCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCQkJCSAgICBPbGVBdXRvbWF0aW9uIHBkZiA9IG5ldyBPbGVBdXRvbWF0aW9uIChjbGllbnRTaXRlKTsKLQkJCQkJICAgIGludCBsb2FkRmlsZVtdID0gcGRmLmdldElEc09mTmFtZXMgKG5ldyBTdHJpbmcgW10geyJMb2FkRmlsZSJ9KTsKLQkJCQkJICAgIGlmIChsb2FkRmlsZSAhPSBudWxsKSB7Ci0JCQkJCSAgICAJVmFyaWFudCByZXN1bHQgPSBwZGYuaW52b2tlKGxvYWRGaWxlWzBdLCBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudChmaWxlTmFtZSl9KTsKLQkJCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJCSAgICB9IGVsc2UgewotCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJICAgIH0KLQkJCQkJICAgIHBkZi5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIHdpdGggRXhwbG9yZXIKLQkJaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJCQlPbGVBdXRvbWF0aW9uIGV4cGxvcmVyID0gbmV3IE9sZUF1dG9tYXRpb24oY2xpZW50U2l0ZSk7Ci0JCQkJaW50W10gbmF2aWdhdGUgPSBleHBsb3Jlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUifSk7IAotCQkJCQotCQkJCWlmIChuYXZpZ2F0ZSAhPSBudWxsKSB7Ci0JCQkJCVZhcmlhbnQgcmVzdWx0ID0gZXhwbG9yZXIuaW52b2tlKG5hdmlnYXRlWzBdLCBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudChmaWxlTmFtZSl9KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQuZGlzcG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQl9Ci0JCQkJZXhwbG9yZXIuZGlzcG9zZSgpOwotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChjbGllbnRTaXRlICE9IG51bGwpewotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld0NsaWVudFNpdGUoU3RyaW5nIHByb2dJRCkgewotCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCXRyeSB7Ci0JCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCBwcm9nSUQpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IpIHsKLQotCQl9Ci0JCWlmIChjbGllbnRTaXRlICE9IG51bGwpCi0JCQljbGllbnRTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiT0xFIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgdHJ1ZSkpOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlDb21wb3NpdGUgZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAzLCAxKSk7Ci0KLQkJQnV0dG9uIGV4Y2VsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQlleGNlbEJ1dHRvbi5zZXRUZXh0KCJOZXcgRXhjZWwgU2hlZXQiKTsKLQkJZXhjZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCW5ld0NsaWVudFNpdGUoIkV4Y2VsLlNoZWV0Iik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gbWVkaWFQbGF5ZXJCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCW1lZGlhUGxheWVyQnV0dG9uLnNldFRleHQoIk5ldyBNUGxheWVyIik7Ci0JCW1lZGlhUGxheWVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJNUGxheWVyIik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gcG93ZXJQb2ludEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJcG93ZXJQb2ludEJ1dHRvbi5zZXRUZXh0KCJOZXcgUG93ZXJQb2ludCBTbGlkZSIpOwotCQlwb3dlclBvaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJQb3dlclBvaW50LlNsaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gd29yZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJd29yZEJ1dHRvbi5zZXRUZXh0KCJOZXcgV29yZCBEb2N1bWVudCIpOwotCQl3b3JkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJXb3JkLkRvY3VtZW50Iik7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoYnV0dG9ucywgU1dULk5PTkUpOwotCQlCdXR0b24gb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJb3BlbkJ1dHRvbi5zZXRUZXh0KCJPcGVuIGZpbGUuLi4iKTsKLQkJb3BlbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJZmlsZU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBMYWJlbChidXR0b25zLCBTV1QuTk9ORSk7Ci0JCWNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQljbG9zZUJ1dHRvbi5zZXRUZXh0KCJDbG9zZSBmaWxlIik7Ci0JCWNsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQl9Ci0JCX0pOwkKLQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkKLQkJb2xlRnJhbWUgPSBuZXcgT2xlRnJhbWUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJYWRkRmlsZU1lbnUob2xlRnJhbWUpOwotCi0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmE1ZDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiBPbGUgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IHRvIGRlbW9uc3RyYXRlIFdpbjMyIE9MRSAvIEFjdGl2ZVgKLSAqIGludGVncmF0aW9uLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPbGVCcm93c2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlICAgICAgZGlzcGxheUFyZWE7Ci0KLQlwcml2YXRlIE9sZUZyYW1lICAgICAgIHdlYkZyYW1lOwotCXByaXZhdGUgT2xlV2ViQnJvd3NlciAgd2ViQnJvd3NlcjsKLQlwcml2YXRlIFRleHQgICAgICAgICAgIHdlYlVybDsKLQlwcml2YXRlIE9sZUNvbnRyb2xTaXRlIHdlYkNvbnRyb2xTaXRlOwotCXByaXZhdGUgUHJvZ3Jlc3NCYXIgICAgd2ViUHJvZ3Jlc3M7Ci0JcHJpdmF0ZSBMYWJlbCAgICAgICAgICB3ZWJTdGF0dXM7Ci0JcHJpdmF0ZSBCdXR0b24gICAgICAgICB3ZWJOYXZpZ2F0ZUJ1dHRvbjsKLQkKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRCYWNrd2FyZDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRGb3J3YXJkOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZEhvbWU7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kU3RvcDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRSZWZyZXNoOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFNlYXJjaDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZhdGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX0FNQklFTlRfRExDT05UUk9MID0gLTU1MTI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMQ1RMX05PX1NDUklQVFMgPSAweDgwOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhlIE9MRSBicm93c2VyIHZpZXcuCi0JICovCi0JcHVibGljIE9sZUJyb3dzZXJWaWV3KCkgewotCQlPbGVQbHVnaW4uaW5pdFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCi0JCWNyZWF0ZVRvb2xiYXIoKTsKLQkJY3JlYXRlQnJvd3NlckZyYW1lKCk7CQkKLQkJY3JlYXRlU3RhdHVzQXJlYSgpOwotCQljcmVhdGVCcm93c2VyQ29udHJvbCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3RpdmF0ZWQpIHsKLQkJCXdlYkNvbnRyb2xTaXRlLmRlYWN0aXZhdGVJblBsYWNlQ2xpZW50KCk7Ci0JCQlhY3RpdmF0ZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAod2ViQnJvd3NlciAhPSBudWxsKSB3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQkJd2ViQnJvd3NlciA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgIHsKLQkJd2ViVXJsLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgdG9vbGJhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbGJhcigpIHsKLQkJLy8gQWRkIGEgdG9vbGJhcgotCQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEJhY2t3YXJkID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpQmFja10pOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29CYWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgZm9yd2FyZCB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEZvcndhcmQgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Gb3J3YXJkLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkZvcndhcmQudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlGb3J3YXJkXSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29Gb3J3YXJkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHNlcGFyYXRvcgotCQluZXcgVG9vbEl0ZW0oYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSB0byB0aGUgSG9tZSBwYWdlCi0JCXdlYkNvbW1hbmRIb21lID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuSG9tZS50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Ib21lLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpSG9tZV0pOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEhvbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvSG9tZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gYWJvcnQgd2ViIHBhZ2UgbG9hZGluZwotCQl3ZWJDb21tYW5kU3RvcCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0b3AudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RvcC50ZXh0IikpOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVN0b3BdKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRTdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5TdG9wKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byByZWZyZXNoIHRoZSBjdXJyZW50IHdlYiBwYWdlCi0JCXdlYkNvbW1hbmRSZWZyZXNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuUmVmcmVzaC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5SZWZyZXNoLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpUmVmcmVzaF0pOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLlJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgc2VwYXJhdG9yCi0JCW5ldyBUb29sSXRlbShiYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBzZWFyY2ggdGhlIHdlYgotCQl3ZWJDb21tYW5kU2VhcmNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVNlYXJjaF0pOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kU2VhcmNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb1NlYXJjaCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSB0ZXh0IGFyZWEgZm9yIFVzZXJzIHRvIGVudGVyIGEgdXJsCi0JCUNvbXBvc2l0ZSBhZGRyZXNzQmFyID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwoYWRkcmVzc0JhciwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhZGRyZXNzTGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuQWRkcmVzcy5sYWJlbCIpKTsKLQkJYWRkcmVzc0xhYmVsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJCi0JCXdlYlVybCA9IG5ldyBUZXh0KGFkZHJlc3NCYXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJd2ViVXJsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYlVybC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViVXJsLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCXdlYk5hdmlnYXRlQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbih3ZWJOYXZpZ2F0ZUJ1dHRvbik7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgdG8gdGhlIHdlYiBzaXRlIHNwZWNpZmllZCBpbiB0aGUgVGV4dCBhcmVhIGRlZmluZWQgYWJvdmUKLQkJd2ViTmF2aWdhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGFkZHJlc3NCYXIsIFNXVC5QVVNIKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Hby50ZXh0IikpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuTmF2aWdhdGUod2ViVXJsLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIE9sZUZyYW1lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCcm93c2VyRnJhbWUoKSB7Ci0JCS8vIEV2ZXJ5IGNvbnRyb2wgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgT2xlRnJhbWU6Ci0JCXdlYkZyYW1lID0gbmV3IE9sZUZyYW1lKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXdlYkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciBzdGF0dXMgYXJlYS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhdHVzQXJlYSgpIHsKLQkJLy8gQWRkIGEgcHJvZ3Jlc3MgYmFyIHRvIGRpc3BsYXkgZG93bmxvYWRpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24KLQkJd2ViUHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIoZGlzcGxheUFyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXdlYlByb2dyZXNzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwkJCi0KLQkJLy8gQWRkIGEgbGFiZWwgZm9yIGRpc3BsYXlpbmcgc3RhdHVzIG1lc3NhZ2VzIGFzIHRoZXkgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGNvbnRyb2wKLQkJd2ViU3RhdHVzID0gbmV3IExhYmVsKGRpc3BsYXlBcmVhLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl3ZWJTdGF0dXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYlN0YXR1cy5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JfQkKLQotCS8qKgotCSAqIENyZWF0ZXMgV2ViIGJyb3dzZXIgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlckNvbnRyb2woKSB7Ci0JCXRyeSB7Ci0JCQkvLyBDcmVhdGUgYW4gQXV0b21hdGlvbiBvYmplY3QgZm9yIGFjY2VzcyB0byBleHRlbmRlZCBjYXBhYmlsaXRpZXMKLQkJCXdlYkNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKHdlYkZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCQlWYXJpYW50IGRvd25sb2FkID0gbmV3IFZhcmlhbnQoRExDVExfTk9fU0NSSVBUUyk7Ci0JCQl3ZWJDb250cm9sU2l0ZS5zZXRTaXRlUHJvcGVydHkoRElTUElEX0FNQklFTlRfRExDT05UUk9MLCBkb3dubG9hZCk7Ci0JCQlPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbih3ZWJDb250cm9sU2l0ZSk7Ci0JCQl3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQXV0b21hdGlvbik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJLy8gQ3JlYXRpb24gbWF5IGhhdmUgZmFpbGVkIGJlY2F1c2UgY29udHJvbCBpcyBub3QgaW5zdGFsbGVkIG9uIG1hY2hpbmUKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHdlYkZyYW1lLCBTV1QuQk9SREVSKTsKLQkJCU9sZVBsdWdpbi5sb2dFcnJvcihPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSwgZXgpOwotCQkJbGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBSZXNwb25kIHRvIFByb2dyZXNzQ2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgUHJvZ3Jlc3MgYmFyCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5Qcm9ncmVzc0NoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYXJpYW50IHByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCVZhcmlhbnQgbWF4UHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQkJaWYgKHByb2dyZXNzID09IG51bGwgfHwgbWF4UHJvZ3Jlc3MgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCXdlYlByb2dyZXNzLnNldE1heGltdW0obWF4UHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCXdlYlByb2dyZXNzLnNldFNlbGVjdGlvbihwcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gUmVzcG9uZCB0byBTdGF0dXNUZXh0Q2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgU3RhdHVzIFRleHQgbGFiZWwKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLlN0YXR1c1RleHRDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBzdGF0dXNUZXh0ID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCWlmIChzdGF0dXNUZXh0ID09IG51bGwpCXJldHVybjsKLQkJCQlTdHJpbmcgdGV4dCA9IHN0YXR1c1RleHQuZ2V0U3RyaW5nKCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJd2ViU3RhdHVzLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSByZWFkeSBzdGF0ZSBhbmQgcHJpbnQgb3V0IHRoZSBjdXJyZW50IHN0YXRlIAotCQl3ZWJDb250cm9sU2l0ZS5hZGRQcm9wZXJ0eUxpc3RlbmVyKE9sZVdlYkJyb3dzZXIuRElTUElEX1JFQURZU1RBVEUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBPTEUuUFJPUEVSVFlfQ0hBTkdJTkcpIHJldHVybjsKLQkJCQlpbnQgc3RhdGUgPSB3ZWJCcm93c2VyLmdldFJlYWR5U3RhdGUoKTsKLQkJCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX1VOSU5JVElBTElaRUQ6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURJTkc6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuTG9hZGluZy50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURFRDoKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5Mb2FkZWQudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfSU5URVJBQ1RJVkU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuSW50ZXJhY3RpdmUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfQ09NUExFVEU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuQ29tcGxldGUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIGFjdGl2ZSBjb21tYW5kIHN0YXRlcwotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50eXBlICE9IE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlKSByZXR1cm47Ci0JCQkJZmluYWwgaW50IGNvbW1hbmRJRCA9Ci0JCQkJCShldmVudC5hcmd1bWVudHNbMF0gIT0gbnVsbCkgPyBldmVudC5hcmd1bWVudHNbMF0uZ2V0SW50KCkgOiAwOwotCQkJCWZpbmFsIGJvb2xlYW4gY29tbWFuZEVuYWJsZWQgPQotCQkJCQkoZXZlbnQuYXJndW1lbnRzWzFdICE9IG51bGwpID8gZXZlbnQuYXJndW1lbnRzWzFdLmdldEJvb2xlYW4oKSA6IGZhbHNlOwotCQkJCQotCQkJCXN3aXRjaCAoY29tbWFuZElEKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5DU0NfTkFWSUdBVEVCQUNLOgotCQkJCQkgCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGNvbW1hbmRFbmFibGVkKTsKLQkJCQkJIAlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLkNTQ19OQVZJR0FURUZPUldBUkQ6Ci0JCQkJCSAJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChjb21tYW5kRW5hYmxlZCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGluIHBsYWNlIGFjdGl2YXRlIHRoZSBBY3RpdmVYIGNvbnRyb2wJCQotCQlhY3RpdmF0ZWQgPSAod2ViQ29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpID09IE9MRS5TX09LKTsKLQkJaWYgKGFjdGl2YXRlZCkgd2ViQnJvd3Nlci5Hb0hvbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU1YzJlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgT2xlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9sZVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgZmluYWwgaW50Ci0JCWJpQmFjayA9IDAsCi0JCWJpRm9yd2FyZCA9IDEsCi0JCWJpSG9tZSA9IDIsCi0JCWJpU3RvcCA9IDMsCi0JCWJpUmVmcmVzaCA9IDQsCi0JCWJpU2VhcmNoID0gNTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9iYWNrd2FyZF9uYXYuZ2lmIiwKLQkJImljb25zL2ZvcndhcmRfbmF2LmdpZiIsCi0JCSJpY29ucy9ob21lX25hdi5naWYiLAotCQkiaWNvbnMvc3RvcF9uYXYuZ2lmIiwKLQkJImljb25zL3JlZnJlc2hfbmF2LmdpZiIsCi0JCSJpY29ucy9zZWFyY2hfbmF2LmdpZiIgfTsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2VzW107Ci0Jc3RhdGljIEZvbnQgIGJyb3dzZXJGb250OwotICAgCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBPTEUgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBPbGVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPbGVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJaW1hZ2VzW2ldID0gZ2V0SW1hZ2VGcm9tUGx1Z2luKHBsdWdpbi5nZXRCdW5kbGUoKSwgaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZXNbaV0gPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJyb3dzZXJGb250ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnJvd3NlckZvbnQgPSBuZXcgRm9udCAobnVsbCwgIk1TIFNhbnMgU2VyaWYiLCA4LCBTV1QuTlVMTCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCX0KLQkJfQotCQlpZiAoaW1hZ2VzID09IG51bGwgfHwgYnJvd3NlckZvbnQgPT0gbnVsbCkgewotCQkJZnJlZVJlc291cmNlcygpOwotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JCWlmIChicm93c2VyRm9udCAhPSBudWxsKSBicm93c2VyRm9udC5kaXNwb3NlICgpOwotCQlicm93c2VyRm9udCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBwZCB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDk4ODEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgYW4gT2xlQXV0b21hdGlvbiBvYmplY3QgdXNlZCB0byBzZW5kIGNvbW1hbmRzCi0gKiB0byBhIFdpbjMyICJTaGVsbC5FeHBsb3JlciIgT0xFIGNvbnRyb2wuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG1hbmFnZSB0aGUgc2V0dXAsIHR5cGljYWwgdXNlIGFuZCB0ZWFyZG93biBvZgotICogYSBzaW1wbGUgd2ViIGJyb3dzZXIuCi0gKi8KLWNsYXNzIE9sZVdlYkJyb3dzZXIgewotCS8qIFNlZSB0aGUgV2luZG93cyBQbGF0Zm9ybSBTREsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgKiBPTEUgY29udHJvbCB1c2VkIGhlcmUgYW5kIGl0cyB1c2FnZS4KLQkgKi8KLQkvLyBHZW5lcmF0ZWQgZnJvbSB0eXBlbGliIGZpbGVuYW1lOiBzaGRvY3Z3LmRsbAotCi0JLy8gQ29uc3RhbnRzIGZvciBXZWJCcm93c2VyIENvbW1hbmRTdGF0ZUNoYW5nZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19VUERBVEVDT01NQU5EUyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUZPUldBUkQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUJBQ0sgPSAyOwotCi0JLy8gQ09uc3RhbnRzIGZvciBXZWIgQnJvd3NlciBSZWFkeVN0YXRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURJTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BREVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0lOVEVSQUNUSVZFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0NPTVBMRVRFID0gNDsKLQkKLQkvLyBXZWIgQnJvd3NlciBDb250cm9sIEV2ZW50cyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCZWZvcmVOYXZpZ2F0ZSAgICAgICAgPSAxMDA7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOYXZpZ2F0ZUNvbXBsZXRlICAgICAgPSAxMDE7IC8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byBiZWNvbWVzIHZpc2libGUgYW5kIGVudGVycyB0aGUgbmF2aWdhdGlvbiBzdGFjay4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0dXNUZXh0Q2hhbmdlICAgICAgPSAxMDI7IC8vIFN0YXR1c2JhciB0ZXh0IGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NDaGFuZ2UgICAgICAgID0gMTA4OyAvLyBGaXJlZCB3aGVuIGRvd25sb2FkIHByb2dyZXNzIGlzIHVwZGF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRDb21wbGV0ZSAgICAgID0gMTA0OyAvLyBEb3dubG9hZCBvZiBwYWdlIGNvbXBsZXRlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbW1hbmRTdGF0ZUNoYW5nZSAgICA9IDEwNTsgLy8gVGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBjb21tYW5kIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZEJlZ2luICAgICAgICAgPSAxMDY7IC8vIERvd25sb2FkIG9mIGEgcGFnZSBzdGFydGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ld1dpbmRvdyAgICAgICAgICAgICA9IDEwNzsgLy8gRmlyZWQgd2hlbiBhIG5ldyB3aW5kb3cgc2hvdWxkIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGl0bGVDaGFuZ2UgICAgICAgICAgID0gMTEzOyAvLyBEb2N1bWVudCB0aXRsZSBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lQmVmb3JlTmF2aWdhdGUgICA9IDIwMDsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOYXZpZ2F0ZUNvbXBsZXRlID0gMjAxOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8gaW4gYSBmcmFtZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZU5ld1dpbmRvdyAgICAgICAgPSAyMDQ7IC8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1aXQgICAgICAgICAgICAgICAgICA9IDEwMzsgLy8gRmlyZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBxdWl0aW5nLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd01vdmUgICAgICAgICAgICA9IDEwOTsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gbW92ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93UmVzaXplICAgICAgICAgID0gMTEwOyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBzaXplZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBY3RpdmF0ZSAgICAgICAgPSAxMTE7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIGFjdGl2YXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9wZXJ0eUNoYW5nZSAgICAgICAgPSAxMTI7IC8vIEZpcmVkIHdoZW4gdGhlIFB1dFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0KLQkvLyBXZWIgQnJvd3NlciBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX1JFQURZU1RBVEUgPSAtNTI1OwotCi0JcHJpdmF0ZSBPbGVBdXRvbWF0aW9uICBvbGVBdXRvbWF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICogPHA+Ci0JICogVHlwaWNhbCB1c2U6PGJyPgotCSAqIDxjb2RlPgotCSAqIE9sZUNvbnRyb2xTaXRlIG9sZUNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKG9sZUZyYW1lLCBzdHlsZSwgIlNoZWxsLkV4cGxvcmVyIik7PGJyPgotCSAqIE9sZUF1dG9tYXRpb24gb2xlQXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKG9sZUNvbnRyb2xTaXRlKTs8YnI+Ci0JICogT2xlV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQ29udHJvbFNpdGUsIG9sZUF1dG9tYXRpb24pOzxicj4KLQkgKiA8L2NvZGU+Ci0JICogCi0gICAgICogQHBhcmFtIG9sZUF1dG9tYXRpb24gdGhlIE9sZUF1dG9tYXRpb24gb2JqZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0gICAgICogQHBhcmFtIG9sZUNvbnRyb2xTaXRlIHRoZSBPbGVDb250cm9sU2l0ZSBvYmplY3QgZm9yIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgT2xlV2ViQnJvd3NlcihPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24pIHsKLQkJdGhpcy5vbGVBdXRvbWF0aW9uID0gb2xlQXV0b21hdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG9sZUF1dG9tYXRpb24gIT0gbnVsbCkgb2xlQXV0b21hdGlvbi5kaXNwb3NlKCk7Ci0JCW9sZUF1dG9tYXRpb24gPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIEludGVyYWN0IHdpdGggdGhlIENvbnRyb2wgdmlhIE9MRSBBdXRvbWF0aW9uCi0JICogCi0JICogTm90ZTogWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRHMgaWYgeW91IGtub3cgdGhlbSBiZWZvcmVoYW5kCi0JICogICAgICAgdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5LCBidXQgeW91IGluY3JlYXNlIGNvdXBsaW5nCi0JICogICAgICAgdG8gdGhlIGNvbnRyb2wuCi0JICovCi0JIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgdGl0bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCB3ZWIgcGFnZSB0aXRsZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJLy8gZGlzcGlkPTIxMCwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvbk5hbWUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTG9jYXRpb25OYW1lIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0JTVFIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBVUkwgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJLy8gZGlzcGlkPTIxMSwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvblVSTCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJMb2NhdGlvblVSTCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZUF1dG9tYXRpb24uZ2V0UHJvcGVydHkoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfQlNUUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZjoKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRDsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BRElORzsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BREVEOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9JTlRFUkFDVElWRTsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfQ09NUExFVEUuCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkeVN0YXRlKCkgewotCQkvLyBkaXNwaWQ9NDI5NDk2Njc3MSwgdHlwZT1QUk9QR0VULCBuYW1lPSJSZWFkeVN0YXRlIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlYWR5U3RhdGUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0k0KSByZXR1cm4gLTE7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0JhY2soKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDAsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0JhY2siCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29CYWNrIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0ZvcndhcmQoKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDEsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0ZvcndhcmQiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29Gb3J3YXJkIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gaG9tZSBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIEdvSG9tZSgpIHsKLQkJLy8gZGlzcGlkPTEwMiwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvSG9tZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb0hvbWUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byB1c2VyLXNwZWNpZmllZCBXZWIgc2VhcmNoIGdhdGV3YXkuCi0JICovCi0JcHVibGljIHZvaWQgR29TZWFyY2goKSB7Ci0JCS8vIGRpc3BpZD0xMDMsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb1NlYXJjaCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb1NlYXJjaCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIGEgcGFydGljdWxhciBVUkwuCi0JICovCi0JcHVibGljIHZvaWQgTmF2aWdhdGUoU3RyaW5nIHVybCkgewotCQkvLyBkaXNwaWQ9MTA0LCB0eXBlPU1FVEhPRCwgbmFtZT0iTmF2aWdhdGUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07IC8vIGlkZW50aWZpZXIgb2YgYXJndW1lbnQKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjdXJyZW50bHkgdmlld2VkIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybS1kZWZpbmVkIHJlc3VsdCBjb2RlIGZvciB0aGUgIlJlZnJlc2giIG1ldGhvZCBpbnZvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgUmVmcmVzaCgpewotCQkvLyBkaXNwaWQ9IDQyOTQ5NjY3NDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJSZWZyZXNoIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlZnJlc2gifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlTm9SZXBseShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgbG9hZGluZyBvZiB0aGUgY3Vycm5ldCBwYWdlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGxhdGZvcm0tZGVmaW5lZCByZXN1bHQgY29kZSBmb3IgdGhlICJTdG9wIiBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIFN0b3AoKSB7Ci0JCS8vIGRpc3BpZD0xMDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJTdG9wIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlN0b3AifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM5YWYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3NzFjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTM6NDUgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWYwYWUwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLnBhaW50LmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ4ZTdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBQYWludCBUb29sPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBQYWludCBUb29sPC9oMj4KLQotPHA+CQotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNXVCBncmFwaGljcyBvcGVyYXRpb25zIGluIHRoZSBmb3JtIG9mIGEKLXJ1ZGltZW50YXJ5IGJpdG1hcCBwYWludGluZyBwcm9ncmFtLiAgVGhlIFBhaW50IFRvb2wgaW1wbGVtZW50YXRpb24gYWxzbyAKLWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgCi10aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdXNlciBpbnB1dC4KLTwvcD4KLTxwPgkKLVNlbGVjdCBhIHRvb2wgd2l0aCB3aGljaCB0byBkcmF3IGluIHRoZSBkcmF3aW5nIGFyZWEuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdG9vbHMKLXRvIGNob29zZSBmcm9tIG9uIHRoZSB0b29sYmFyLiAgVG8gY2hhbmdlIHRoZSBjb2xvciBzZWxlY3Rpb24sIGNsaWNrIG9uIGEgY29sb3IgaW4gdGhlCi1wYWxldHRlIGJlbG93IHRoZSBkcmF3aW5nIGFyZWE7IGxlZnQtY2xpY2sgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCByaWdodC1jbGljayB0byBzZXQgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPk90aGVyPC9zdHJvbmc+LiAgCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5QYWludDwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgdGhlIHBhaW50IHByb2dyYW0gd2lsbCBhcHBlYXIuCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9pY29ucy9wYWludF9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9pY29ucy9wYWludF9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk0NWRkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkNzg3NTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RQYWludEV4YW1wbGUubmFtZSA9IFNXVCBQYWludCBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5QYWludEV4YW1wbGUubmFtZSA9IFBhaW50Ci0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLm5hbWUgPSBQYWludAotbGF1bmNoaXRlbS5QYWludEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNXVCBncmFwaGljcyBvcGVyYXRpb25zIGluIHRoZSBmb3JtIG9mIGEgXAotCXJ1ZGltZW50YXJ5IGJpdG1hcCBwYWludGluZyBwcm9ncmFtLiAgVGhlIEFpcmJydXNoIFRvb2wgaW1wbGVtZW50YXRpb24gYWxzbyBcCi0JZGVtb25zdHJhdGVzIGEgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyB0aW1lZCBHVUkgb3BlcmF0aW9ucyBpbiB0aGUgYmFja2dyb3VuZCBcCi0JdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuXG5cblwKLQlTZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzIFwKLQl0byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZSBcCi0JcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOiBsZWZ0LWNsaWNrIGZvciB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgZm9yIHRoZSBcCi0JYmFja2dyb3VuZCBjb2xvci5cblxuXAotCVVzZXMgU1dUJ3MgR0MgYW5kIEZvbnREaWFsb2csIGFuZCBKRmFjZSdzIElucHV0RGlhbG9nIGFuZCBhY3Rpb24gc2V0IHN1cHBvcnQuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2I5NmI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQiCi0gICBuYW1lPSIlcGx1Z2luLlNXVFBhaW50RXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGFpbnQuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuUGFpbnRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYWludF9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LlBhaW50VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYWludF9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5QYWludEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5NDM3ZmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBQYWludFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBQYWludCBwbHVnaW4uCi0JICovCi0JcHVibGljIFBhaW50UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAotCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjUwZjQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIFRoZSB2aWV3IGZvciB0aGUgcGFpbnQgYXBwbGljYXRpb24uCi0gKiBBbGwgcmVuZGVyaW5nIGhhcHBlbnMgaW5zaWRlIHRoZSBhcmVhIGNyZWF0ZWQgYnkgY3JlYXRlUGFydENvbnRyb2woKS4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCVBhaW50RXhhbXBsZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnQgdmlldy4KLQkgKi8KLQlwdWJsaWMgUGFpbnRWaWV3KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5zdGFuY2UgPSBuZXcgUGFpbnRFeGFtcGxlKHBhcmVudCk7Ci0JCWluc3RhbmNlLmNyZWF0ZUdVSShwYXJlbnQpOwotCi0JCS8qKiogQWRkIHRvb2xiYXIgY29udHJpYnV0aW9ucyAqKiovCi0JCWZpbmFsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQlUb29sIHRvb2xzW10gPSBQYWludEV4YW1wbGUudG9vbHM7Ci0JCVN0cmluZyBncm91cCA9IHRvb2xzWzBdLmdyb3VwOwotCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKGdyb3VwKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyBpKyspIHsKLQkJCVRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJaWYgKCF0b29sLmdyb3VwLmVxdWFscyhncm91cCkpIHsKLQkJCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKHRvb2wuZ3JvdXApKTsKLQkJCX0KLQkJCWdyb3VwID0gdG9vbC5ncm91cDsKLQkJCVBhaW50QWN0aW9uIGFjdGlvbiA9IG5ldyBQYWludEFjdGlvbih0b29sKTsKLQkJCXRvb2xiYXJNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoZ3JvdXAsIGFjdGlvbik7Ci0JCQlpZiAoaSA9PSBQYWludEV4YW1wbGUuRGVmYXVsdF90b29sIHx8IGkgPT0gUGFpbnRFeGFtcGxlLkRlZmF1bHRfZmlsbCB8fCBpID09IFBhaW50RXhhbXBsZS5EZWZhdWx0X2xpbmVzdHlsZSkgewotCQkJCWFjdGlvbi5zZXRDaGVja2VkKHRydWUpOwotCQkJfQotCQl9Ci0JCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCi0JCWluc3RhbmNlLnNldERlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IHdlJ3JlIHVzaW5nCi0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlLmdldERpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEFjdGlvbiBzZXQgZ2x1ZS4KLQkgKi8KLQljbGFzcyBQYWludEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByaXZhdGUgaW50IHN0eWxlOwotCQlwcml2YXRlIFJ1bm5hYmxlIGFjdGlvbjsKLQkJcHVibGljIFBhaW50QWN0aW9uKFRvb2wgdG9vbCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCQlzZXRJZChpZCk7Ci0JCQlzdHlsZSA9IHRvb2wudHlwZSA9PSBTV1QuUkFESU8gPyBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTiA6IElBY3Rpb24uQVNfUFVTSF9CVVRUT047Ci0JCQlhY3Rpb24gPSB0b29sLmFjdGlvbjsKLQkJCXNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGlkICsgIi5sYWJlbCIpKTsKLQkJCXNldFRvb2xUaXBUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIudG9vbHRpcCIpKTsKLQkJCXNldERlc2NyaXB0aW9uKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIuZGVzY3JpcHRpb24iKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKAotCQkJCQlQYWludEV4YW1wbGUuY2xhc3MsCi0JCQkJCVBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIuaW1hZ2UiKSkpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7IHJldHVybiBzdHlsZTsgfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7IGFjdGlvbi5ydW4oKTsgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjMxNmI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5OGQxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGdsZXhhbXBsZXMuamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHNyYy8KLSAgICAgICAgICAgICAgIAotc291cmNlLmdsZXhhbXBsZXMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzY2U2NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uT3BlbkdMRXhhbXBsZVNldC5uYW1lID0gU1dUIE9wZW5HTCBFeGFtcGxlcyBQbHVnaW4KLQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLm5hbWUgPSBPcGVuR0wgRXhhbXBsZQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoZSBPcGVuR0wgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIG1hbnkgT3BlbkdMIGZlYXR1cmVzIGluIFwKLQlhbiBTV1QgYXBwbGljYXRpb24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExODcyNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5PcGVuR0xFeGFtcGxlU2V0Lm5hbWUiCi0gICB2ZXJzaW9uPSIwLjUuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0iIj4KLQotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9wZW5nbCIgdmVyc2lvbj0iMC41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSBSdW50aW1lIC0tPgotPHJ1bnRpbWU+Ci0gICA8bGlicmFyeSBuYW1lPSJnbGV4YW1wbGVzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9wZW5HTEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLk9wZW5HTEV4YW1wbGUuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy5PcGVuR0xFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTI3MTMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgT3BlbkdMIEV4YW1wbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZhY2I5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBBbnRpYWxpYXNpbmdUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgQnV0dG9uIGFudGlBbGlhc0J1dHRvbjsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC02LjBmOwotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDExOwotCQkJfQotCQl9KTsKLQotCQlhbnRpQWxpYXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFRleHQoIkFudGktQWxpYXNpbmciKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYW50aUFsaWFzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoYW50aUFsaWFzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTC5nbERpc2FibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTC5nbERlbGV0ZUxpc3RzKDEsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkFudGktYWxpYXNpbmciOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCWZpbmFsIGZsb2F0W10gQkVaSUVSX1BPSU5UUyA9IHsKLQkJCS0xLjVmLCAtMS41ZiwgNC4wZiwgLTAuNWYsIC0xLjVmLCAyLjBmLCAwLjVmLCAtMS41ZiwKLQkJCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJCS0wLjVmLCAzLjBmLCAwLjVmLCAtMC41ZiwgMC4wZiwgMS41ZiwgLTAuNWYsIC0xLjBmLAotCQkJLTEuNWYsIDAuNWYsIDQuMGYsIC0wLjVmLCAwLjVmLCAwLjBmLCAwLjVmLCAwLjVmLAotCQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJCTEuNWYsIC0yLjBmLCAwLjVmLCAxLjVmLCAwLjBmLCAxLjVmLCAxLjVmLCAtMS4wZiwKLQkJfTsKLQkJR0wuZ2xIaW50KEdMLkdMX0xJTkVfU01PT1RIX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcEdyaWQyZigzMCwgMC4wZiwgMS4wZiwgMzAsIDAuMGYsIDEuMGYpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0FVVE9fTk9STUFMKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NUSVBQTEUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfVkVSVEVYXzMpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfTElORSwgMCwgMzAsIDAsIDMwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdCgxKTsJLy8gZHJhdyB0aGUgYmVpemVyIHN1cmZhY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVlZTcyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQXJlYVRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JYWJzdHJhY3QgY2xhc3MgU2hhcGUgewotCQlhYnN0cmFjdCB2b2lkIGRyYXcoKTsKLQl9Ci0JY2xhc3MgU3RhdGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHN0YXRlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdGF0ZQotCQkgKi8KLQkJU3RhdGUgKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXZvaWQgZGlzcGxheSgpIHsKLQkJCUdMLmdsQ2FsbExpc3QoaW5kZXgpOwotCQl9Ci0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCUdMLmdsRGVsZXRlTGlzdHMoaW5kZXgsIDEpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0YXRlW10gc3RhdGVzOwotCXByaXZhdGUgU3RhdGUgY3VycmVudFN0YXRlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTMwLjBmOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDkwLjBmLCB5Um90ID0gMC4wZiwgelJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljLCBkaXNrOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA0MDsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDkwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgb3B0aW9uc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQluZXcgTGFiZWwob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2hhcGU6Iik7Ci0KLQkJZmluYWwgQ29tYm8gc3RhdGVzQ29tYm8gPSBuZXcgQ29tYm8ob3B0aW9uc0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXN0YXRlc0NvbWJvLmFkZChzdGF0ZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzdGF0ZXNDb21iby5zZWxlY3QoMCk7Ci0JCXN0YXRlc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbc3RhdGVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBsaWdodHNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJbGlnaHRzQnV0dG9uLnNldFRleHQoIkxpZ2h0cyIpOwotCQlsaWdodHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlsaWdodHNCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChsaWdodHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMLmdsRGlzYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMoZGlzayk7Ci0JCWlmIChzdGF0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGF0ZXMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIEFORCBvZiB0d28gc2hhcGVzLgotCSAqCi0JICogQHBhcmFtIGEgc2hhcGUgQQotCSAqIEBwYXJhbSBiIHNoYXBlIEIKLQkgKi8KLQl2b2lkIGRyYXdBYW5kQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQiB0aGF0IGFyZSBpbnNpZGUgQQotCQlkcmF3QWluc2lkZUIoYSwgYiwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyB0dXJuIG9uIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0FMV0FZUyk7Ci0JCS8vIHJlbmRlciB0aGUgZnJvbnQgZmFjZSBvZiBCCi0JCWIuZHJhdygpOwotCQkvLyByZXNldCB0aGUgZGVwdGggZnVuY3Rpb24KLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVTUyk7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQSB0aGF0IGFyZSBpbnNpZGUgQgotCQlkcmF3QWluc2lkZUIoYiwgYSwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBjb250ZW50cyBvZiBvbmUgc2hhcGUgdGhhdCBhcHBlYXIgd2l0aGluIGFub3RoZXIuCi0JICoKLQkgKiBAcGFyYW0gYSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqIEBwYXJhbSBiIHRoZSBjb25zdHJhaW5pbmcgc2hhcGUKLQkgKiBAcGFyYW0gZmFjZQotCSAqIEBwYXJhbSB0ZXN0Ci0JICovCi0Jdm9pZCBkcmF3QWluc2lkZUIoU2hhcGUgYSwgU2hhcGUgYiwgaW50IGZhY2UsIGludCB0ZXN0KSB7Ci0JCS8vIHR1cm4gb2ZmIHRoZSBjb2xvciBidWZmZXIKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIEN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIHNoYXBlIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIHNldCBkZXB0aCBtYXNrCi0JCUdMLmdsRGVwdGhNYXNrKGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgdGVzdAotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMCwgMCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gaW5jcmVtZW50IGlmIHRoZSBkZXB0aCB0ZXN0IHBhc3NlcwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9JTkNSKTsKLQkJLy8gdHVybiBvbiBiYWNrIGZhY2UgY3VsbGluZwotCQlHTC5nbEN1bGxGYWNlKEdMLkdMX0JBQ0spOwotCQkvLyByZW5kZXIgQgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IHRoZSBzdGVuY2lsIGJ1ZmZlciB0byBkZWNyZW1lbnQgaWYgdGhlIGRlcHRoIHRlc3QgcGFzc2VzCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0RFQ1IpOwotCQkvLyBjdWxsIHRoZSBmcm9udCBmYWNlCi0JCUdMLmdsQ3VsbEZhY2UoR0wuR0xfRlJPTlQpOwotCQkvLyByZW5kZXIgQiBhZ2FpbgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IGRlcHRoIG1hc2sKLQkJR0wuZ2xEZXB0aE1hc2sodHJ1ZSk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyCi0JCUdMLmdsU3RlbmNpbEZ1bmModGVzdCwgMCwgMSk7Ci0JCS8vIHR1cm4gb2ZmIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIGN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIGRpc2FibGUgc3RlbmNpbCB0ZXN0Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIE9SIG9mIHR3byBzaGFwZXMuCi0JICoKLQkgKiBAcGFyYW0gYSBzaGFwZSBBCi0JICogQHBhcmFtIGIgc2hhcGUgQgotCSAqLwotCXZvaWQgZHJhd0FvckIoU2hhcGUgYSwgU2hhcGUgYikgewotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJYS5kcmF3KCk7Ci0JCWIuZHJhdygpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3Mgb25lIHNoYXBlIHN1YnRyYWN0ZWQgZnJvbSBhbm90aGVyLgotCSAqCi0JICogQHBhcmFtIGEgdGhlIGJhc2Ugc2hhcGUKLQkgKiBAcGFyYW0gYiB0aGUgc2hhcGUgdG8gc3VidHJhY3QKLQkgKi8KLQl2b2lkIGRyYXdBc3ViQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgYmFjayBwYXJ0cyBvZiBCIGluc2lkZSBBCi0JCWRyYXdBaW5zaWRlQihiLCBhLCBHTC5HTF9GUk9OVCwgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gY2hhbmdlIHRoZSBkZXB0aCB0ZXN0IHRvIEdMX0FMV0FZUwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9BTFdBWVMpOwotCQkvLyByZW5kZXIgdGhlIGZyb250IGZhY2Ugb2YgQgotCQlhLmRyYXcoKTsKLQkJLy8gcmVzZXQgdGhlIGRlcHRoIGZ1bmN0aW9uCi0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFU1MpOwotCQkvLyBkcmF3IGZyb250IHBhcnRzIG9mIEEgb3V0c2lkZSBCCi0JCWRyYXdBaW5zaWRlQihhLCBiLCBHTC5HTF9CQUNLLCBHTC5HTF9FUVVBTCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIHNwZWNpZmVkIHNoYXBlLgotCSAqIAotCSAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqLwotCXZvaWQgZHJhd1NoYXBlKFNoYXBlIHNoYXBlKSB7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlzaGFwZS5kcmF3KCk7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJBcmVhIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQkJCi0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJZmxvYXRbXSBsaWdodFBvcyA9IHsgMC4wZiwgNS4wZiwgLTEwLjBmLCAxLjBmIH07Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvcyk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCWRpc2sgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSVNUX01PREUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCUdMLmdsTGlnaHRNb2RlbGkoR0wuR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsIEdMLkdMX1RSVUUpOwotCi0JCWZpbmFsIGZsb2F0W10gc3BoZXJlTWF0ZXJpYWwgPSB7IDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYgfTsKLQkJZmluYWwgZmxvYXRbXSBjeWxpbmRlck1hdGVyaWFsID0geyAxLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0KLQkJU2hhcGUgc3BoZXJlID0gbmV3IFNoYXBlKCkgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbE1hdGVyaWFsZnYoCi0JCQkJCUdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9BTUJJRU5UX0FORF9ESUZGVVNFLAotCQkJCQlzcGhlcmVNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQkJfQotCQl9OwotCQlTaGFwZSBjeWxpbmRlciA9IG5ldyBTaGFwZSgpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KAotCQkJCQlHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwKLQkJCQkJY3lsaW5kZXJNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9JTlNJREUpOwotCQkJCUdMLmdsUHVzaE1hdHJpeCgpOwotCQkJCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDMsIDMsIDYsIDMyLCAzMik7Ci0JCQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIDYuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9PVVRTSURFKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMLmdsUG9wTWF0cml4KCk7Ci0JCQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBjcmVhdGUgdGhlIGRpc3BsYXkgbGlzdHMgYW5kIHN0YXRlcwotCQlzdGF0ZXMgPSBuZXcgU3RhdGVbNl07Ci0JCWludCBpbmRleCA9IDE7Ci0JCQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3U2hhcGUoY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzBdID0gbmV3IFN0YXRlKCJDeWxpbmRlciIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NoYXBlKHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMV0gPSBuZXcgU3RhdGUoIlNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FvckIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMl0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIE9SIFNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FhbmRCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzNdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBBTkQgU3BoZXJlIixpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3QXN1YkIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbNF0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIFNVQiBTcGhlcmUiLGluZGV4KyspOwotCQkKLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FzdWJCKHNwaGVyZSwgY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzVdID0gbmV3IFN0YXRlKCJTcGhlcmUgU1VCIEN5bGluZGVyIixpbmRleCsrKTsKLQotCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2lzU3RlbmNpbFN1cHBvcnROZWVkZWQKLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLQkJY3VycmVudFN0YXRlLmRpc3BsYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRiYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDb2xvclNlbGVjdGlvbkdyb3VwIGltcGxlbWVudHMgTGlzdGVuZXIgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlIHN0eWxlIGJpdHMgdG8gYmUgYXBwbGllZCB0byB0aGUgY29sb3IgZ3JvdXAKLQkgKi8KLQlDb2xvclNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcigpOwotCQlpbml0Q29sb3IocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbG9yR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29sb3JHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoYnV0dG9uLmdldERpc3BsYXkoKSwgMTIsIDEyKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY29sb3IgIT0gbnVsbCkgY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IiKTsKLS8vCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFyZ3VtZW50IHRvIHRoaXMgZ3JvdXAncyBjb2xsZWN0aW9uIG9mCi0JICogY29sb3Igc2VsZWN0aW9uIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIoSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBEcmF3cyB0aGUgY29sb3JlZCBzcXVhcmUgb24gdGhlIHNlbGVjdGlvbiBidXR0b24uCi0JICovCi0Jdm9pZCBkcmF3QnV0dG9uSW1hZ2UoKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlTaGVsbCBzaGVsbCA9IGJ1dHRvbi5nZXRTaGVsbCgpOwotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQigKLQkJCW5ldyBSR0IoY29sb3IuZ2V0UmVkKCksIGNvbG9yLmdldEdyZWVuKCksIGNvbG9yLmdldEJsdWUoKSkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJc2V0UkdCKHJnYik7Ci0JCW5vdGlmeUxpc3RlbmVycyhyZ2IpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb2xvciBieSBxdWVyeWluZyBmb3IgdGhlIGN1cnJlbnQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKi8KLQl2b2lkIGluaXRDb2xvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZG91YmxlW10gY3VycmVudENvbG9yID0gbmV3IGRvdWJsZVs0XTsKLQkJR0wuZ2xHZXREb3VibGV2KEdMLkdMX0NVUlJFTlRfQ09MT1IsIGN1cnJlbnRDb2xvcik7Ci0JCVJHQiByZ2IgPQotCQkJbmV3IFJHQigKLQkJCQkoaW50KSBjdXJyZW50Q29sb3JbMF0gKiAyNTUsCi0JCQkJKGludCkgY3VycmVudENvbG9yWzFdICogMjU1LAotCQkJCShpbnQpIGN1cnJlbnRDb2xvclsyXSAqIDI1NSk7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIGNvbG9yIHNlbGVjdGlvbiBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0Jdm9pZCBub3RpZnlMaXN0ZW5lcnMoUkdCIHJnYikgewotCQlJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcltdIGxpc3RlbmVyc0FyciA9Ci0JCQluZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV07Ci0JCWxpc3RlbmVycy5jb3B5SW50byhsaXN0ZW5lcnNBcnIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyc0Fyci5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzQXJyIFtpXS5oYW5kbGVDb2xvclNlbGVjdGlvbihyZ2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYXJndW1lbnQgZnJvbSB0aGlzIGdyb3VwJ3MgY29sbGVjdGlvbiBvZiBjb2xvciBzZWxlY3Rpb24KLQkgKiBsaXN0ZW5lcnMuICBJZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcmVnaXN0ZXJlZCBsaXN0ZW5lciB0aGVuIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwJ3MgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmdiIHRoZSByZ2Igb2YgdGhlIG5ldyBjb2xvcgotCSAqLwotCXZvaWQgc2V0UkdCKFJHQiByZ2IpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJY29sb3IgPSBuZXcgQ29sb3IoYnV0dG9uLmdldERpc3BsYXkoKSwgcmdiKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjBkNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEZvZ1RhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0KLQlwcml2YXRlIGZsb2F0IHJvdFkgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgeVBvcyA9IDAuMGYsIHhQb3MgPSAwLjBmLCB6UG9zID0gLTE1LjBmOwotCXByaXZhdGUgaW50IGN1YmVMaXN0SW5kZXhCYXNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludFtdIEZPR19UWVBFUyA9IHsgR0wuR0xfTElORUFSLCBHTC5HTF9FWFAsIEdMLkdMX0VYUDIgfTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBGT0dfTkFNRVMgPSB7ICJMSU5FQVIiLCAiR0xfRVhQIiwgIkdMX0VYUDIiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyNCk7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDQpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMjU7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBmb2dUeXBlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQluZXcgTGFiZWwoZm9nVHlwZXNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIkZvZyBUeXBlczoiKTsKLQkJZmluYWwgQ29tYm8gZm9nVHlwZUNvbWJvID0gbmV3IENvbWJvKGZvZ1R5cGVzR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWZvZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmb2dUeXBlQ29tYm8uc2V0SXRlbXMoRk9HX05BTUVTKTsKLQkJZm9nVHlwZUNvbWJvLnNlbGVjdCgwKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiRm9nIERlbnNpdHk6Iik7Ci0JCWZpbmFsIFNsaWRlciBmb2dEZW5zaXR5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWF4aW11bSgzMik7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRUaHVtYigyKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDUpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgZm9nRGVuc2l0eSA9ICgoZmxvYXQpZm9nRGVuc2l0eVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19ERU5TSVRZLCBmb2dEZW5zaXR5KTsKLQkJCX0KLQkJfSk7Ci0JCWZvZ1R5cGVDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50IGN1cnJlbnRTZWxlY3Rpb24gPSBmb2dUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkvLyBmb2cgdHlwZSBHTC5HTF9MSU5FQVIgZG9lcyBub3QgdXRpbGl6ZSBmb2dEZW5zaXR5LCBidXQgdGhlIG90aGVyIGZvZyB0eXBlcyBkbwotCQkJCWZvZ0RlbnNpdHlTbGlkZXIuc2V0RW5hYmxlZChjdXJyZW50U2VsZWN0aW9uICE9IDApOwotCQkJCUdMLmdsRm9nZihHTC5HTF9GT0dfTU9ERSwgRk9HX1RZUEVTW2N1cnJlbnRTZWxlY3Rpb25dKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGN1YmUgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKi8KLSAJdm9pZCBjcmVhdGVDdWJlKCkgewotCQlHTC5nbE5ld0xpc3QoY3ViZUxpc3RJbmRleEJhc2UsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZnJvbnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIC0wLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAtMC41Zik7CS8vIHRvcCByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gbGVmdAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgbGVmdAkKLQkJLy8gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIGxlZnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgbGVmdAotCQkvLyB0b3AKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIC0wLjVmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgLTAuNWYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhjdWJlTGlzdEluZGV4QmFzZSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsJCi0JfQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkZvZyI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCS8vIGZvZyBjb2xvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGNsZWFyIGNvbG9yCi0JCS8vIHRvIGxvb2sgYXBwcm9wcmlhdGUKLQkJZmxvYXRbXSBmb2dDb2xvciA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTC5nbEZvZ2Z2KEdMLkdMX0ZPR19DT0xPUiwgZm9nQ29sb3IpOwotCQlHTC5nbEhpbnQoR0wuR0xfRk9HX0hJTlQsIEdMLkdMX0RPTlRfQ0FSRSk7Ci0JCUdMLmdsRm9nZihHTC5HTF9GT0dfU1RBUlQsIDApOwotCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX0RFTlNJVFksIDAuMGYpOwotCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQgZGlzdGFuY2U7IGFueXRoaW5nID4gMTUKLQkJLy8gdW5pdHMgZnJvbSB0aGUgY2FtZXJhIHdpbGwgYmUgY292ZXJlZCBpbiBmb2cKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19FTkQsIDE1KTsKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19NT0RFLCBGT0dfVFlQRVNbMF0pOwotCQlHTC5nbEVuYWJsZShHTC5HTF9GT0cpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQljdWJlTGlzdEluZGV4QmFzZSA9IEdMLmdsR2VuTGlzdHMoMSk7Ci0JCWNyZWF0ZUN1YmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHJvdFksIDAuMGYsIDEuMGYsIDAuMGYpOwotCi0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMywgMCwgLTMpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0zLCAwLCAtMyk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMCwgMCwgNCk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCXJvdFkgKz0gMC42ZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWQ1ZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgR3JhZGllbnRUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTcuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMTgwLjBmLCB5Um90ID0gMTgwLjBmLCB6Um90ID0gMTgwLjBmOwotCXByaXZhdGUgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0W10gQkVaSUVSX0NPTE9SUyA9IHsKLQkJMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4zZiwgMC42ZiwgMC4xZiwgMC4wZiwKLQkJMC44ZiwgMC4yZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKLQkJMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC44ZiwgMC44ZiwgMC44ZiwgMC4wZgotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXRbXSBCRVpJRVJfUE9JTlRTID0gewotCQktMS41ZiwgLTEuNWYsIDQuMGYsIC0wLjVmLCAtMS41ZiwgMi4wZiwgMC41ZiwgLTEuNWYsCi0JCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJLTAuNWYsIDMuMGYsIDAuNWYsIC0wLjVmLCAwLjBmLCAxLjVmLCAtMC41ZiwgLTEuMGYsCi0JCS0xLjVmLCAwLjVmLCA0LjBmLCAtMC41ZiwgMC41ZiwgMC4wZiwgMC41ZiwgMC41ZiwKLQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJMS41ZiwgLTIuMGYsIDAuNWYsIDEuNWYsIDAuMGYsIDEuNWYsIDEuNWYsIC0xLjBmLAotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUX05BTUVTID0geyAiQmV6aWVyIiwgIlNxdWFyZSIgfTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEyOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMTgwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigxODApOwotCQl5Um90YXRpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlSb3QgPSB5Um90YXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl6Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJelJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJelJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXpSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJelJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl6Um90YXRpb24uc2V0U2VsZWN0aW9uKDE4MCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgb2JqZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMixmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvYmplY3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJbmV3IExhYmVsKG9iamVjdEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiT2JqZWN0OiIpOwotCQlmaW5hbCBDb21ibyBvYmplY3RDb21ibyA9IG5ldyBDb21ibyhvYmplY3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJb2JqZWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2JqZWN0Q29tYm8uc2V0SXRlbXMoT0JKRUNUX05BTUVTKTsKLQkJb2JqZWN0Q29tYm8uc2VsZWN0KDApOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoMSwgMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkdyYWRpZW50cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEhpbnQoR0wuR0xfTElORV9TTU9PVEhfSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRklMTCk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfQ09MT1JfNCwgMCwgMSwgNCwgMSwgMCwgMSwgNCwgNiwgQkVaSUVSX0NPTE9SUyk7Ci0JCUdMLmdsTWFwR3JpZDJmKDIwLCAwLjBmLCAxLjBmLCAyMCwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsU2hhZGVNb2RlbChHTC5HTF9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU1RJUFBMRSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9DT0xPUl80KTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9WRVJURVhfMyk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfRklMTCwgMCwgMjAsIDAsIDIwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCUdMLmdsTmV3TGlzdCgyLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9GQU4pOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KGN1cnJlbnRTZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzU0MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE2NmFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1OwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMWMyMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMMTE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIExXSkdMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKi8KLXB1YmxpYyBjbGFzcyBMV0pHTEV4YW1wbGUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotICAgICAgIAkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIAkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJICAgICAgICB9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotICAgICAgICAJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZTk0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBMaWdodFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdFtdIG1hdGVyaWFsU2hpbmluZXNzID0geyAyNS4wZiB9OwotCXByaXZhdGUgZmxvYXRbXSBsaWdodFBvc2l0aW9uID0geyAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0JcHJpdmF0ZSBmbG9hdFtdW10gY29sb3JWYWx1ZXMgPSB7Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBkaWZmdXNlCi0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBzcGVjdWxhcgotCQl7IDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYgfSwJLy8gbGlnaHQgbWFpbiBhbWJpZW50Ci0JCXsgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBkaWZmdXNlCi0JCXsgMC4zZiwgMC4zZiwgMC4zZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9CS8vIG1hdGVyaWFsIHNwZWN1bGFyCi0JfTsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmLCB4UG9zID0gMC4wZiwgelBvcyA9IC0yMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWMsIHNwaGVyZTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMzA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIHBvc2l0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBvc2l0aW9uR3JvdXAuc2V0VGV4dCgiTGlnaHQgUG9zaXRpb24iKTsKLQkJcG9zaXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciBsaWdodFggPSBuZXcgU2xpZGVyKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRYLnNldEluY3JlbWVudCgxKTsKLQkJbGlnaHRYLnNldE1heGltdW0oMjIpOwotCQlsaWdodFguc2V0TWluaW11bSgwKTsKLQkJbGlnaHRYLnNldFRodW1iKDIpOwotCQlsaWdodFguc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJbGlnaHRYLnNldFNlbGVjdGlvbigxMCk7Ci0JCWxpZ2h0WC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbGlnaHRQb3NpdGlvblswXSA9ICgoZmxvYXQpIGxpZ2h0WC5nZXRTZWxlY3Rpb24oKSAqIDEwKSAtIDEwMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgbGlnaHRZID0gbmV3IFNsaWRlcihwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0WS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWxpZ2h0WS5zZXRNYXhpbXVtKDIyKTsKLQkJbGlnaHRZLnNldE1pbmltdW0oMCk7Ci0JCWxpZ2h0WS5zZXRUaHVtYigyKTsKLQkJbGlnaHRZLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWxpZ2h0WS5zZXRTZWxlY3Rpb24oMTApOwotCQlsaWdodFkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWxpZ2h0UG9zaXRpb25bMV0gPSAoKGZsb2F0KSBsaWdodFkuZ2V0U2VsZWN0aW9uKCkgKiAxMCkgLSAxMDA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIGxpZ2h0WiA9IG5ldyBTbGlkZXIocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsaWdodFouc2V0SW5jcmVtZW50KDEpOwotCQlsaWdodFouc2V0TWF4aW11bSgyMik7Ci0JCWxpZ2h0Wi5zZXRNaW5pbXVtKDApOwotCQlsaWdodFouc2V0VGh1bWIoMik7Ci0JCWxpZ2h0Wi5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlsaWdodFouc2V0U2VsZWN0aW9uKDEwKTsKLQkJbGlnaHRaLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlsaWdodFBvc2l0aW9uWzJdID0gKChmbG9hdCkgbGlnaHRaLmdldFNlbGVjdGlvbigpICogMTApIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIGxpZ2h0Q29sb3JzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0VGV4dCgiTGlnaHQgQ29sb3JzIik7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0RGlmZnVzZUJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRUZXh0KCJEaWZmdXNlIik7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1swXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzBdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMF1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzBdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMF1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzBdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRBbWJpZW50QnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFRleHQoIkFtYmllbnQiKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzFdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMV1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1sxXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1sxXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBsaWdodFNwZWN1bGFyQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbi5zZXRUZXh0KCJTcGVjdWxhciIpOwotCQlsaWdodFNwZWN1bGFyQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzJdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMl1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1syXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzJdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMl1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzJdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRNYWluQW1iaWVudEJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0VGV4dCgiTWFpbiBBbWJpZW50Iik7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbM11bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1szXVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzNdWzJdICogMjU1KSkpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1szXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbWF0ZXJpYWxDb2xvcnNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRUZXh0KCJNYXRlcmlhbCBDb2xvcnMiKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbWF0ZXJpYWxEaWZmdXNlQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFRleHQoIkRpZmZ1c2UiKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzRdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNF1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s0XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s0XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBtYXRlcmlhbEFtYmllbnRCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0VGV4dCgiQW1iaWVudCIpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNV1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s1XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzVdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1s1XVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzVdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s1XVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIG1hdGVyaWFsU3BlY3VsYXJCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uLnNldFRleHQoIlNwZWN1bGFyIik7Ci0JCW1hdGVyaWFsU3BlY3VsYXJCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNl1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s2XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzZdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s2XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIk1hdGVyaWFsIFNoaW5pbmVzczoiKTsKLQkJZmluYWwgU2xpZGVyIHNoaW5lU2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2hpbmVTbGlkZXIuc2V0SW5jcmVtZW50KDUpOwotCQlzaGluZVNsaWRlci5zZXRNYXhpbXVtKDEwMik7Ci0JCXNoaW5lU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCXNoaW5lU2xpZGVyLnNldFRodW1iKDIpOwotCQlzaGluZVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDEwKTsKLQkJc2hpbmVTbGlkZXIuc2V0U2VsZWN0aW9uKDI1KTsKLQkJc2hpbmVTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW1hdGVyaWFsU2hpbmluZXNzWzBdID0gc2hpbmVTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9TSElOSU5FU1MsCi0JCQkJCW1hdGVyaWFsU2hpbmluZXNzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoc3BoZXJlLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJMaWdodCI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlzZXRDb2xvclZhbHVlcygpOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NISU5JTkVTUywgbWF0ZXJpYWxTaGluaW5lc3MpOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsSGludChHTC5HTF9MSU5FX1NNT09USF9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbFBvaW50U2l6ZSgyLjBmKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJc3BoZXJlID0gR0wuZ2xHZW5MaXN0cygxKTsKLQkJR0wuZ2xOZXdMaXN0KHNwaGVyZSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvc2l0aW9uKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbENhbGxMaXN0KHNwaGVyZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvciB2YWx1ZXMgaW50byB0aGUgcmVuZGVyZWQgZGlzcGxheS4KLQkgKi8KLQl2b2lkIHNldENvbG9yVmFsdWVzKCkgewotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBjb2xvclZhbHVlc1swXSk7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRElGRlVTRSwgY29sb3JWYWx1ZXNbNF0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzVdKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgY29sb3JWYWx1ZXNbMV0pOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9TUEVDVUxBUiwgY29sb3JWYWx1ZXNbMl0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NQRUNVTEFSLCBjb2xvclZhbHVlc1s2XSk7Ci0JCUdMLmdsTGlnaHRNb2RlbGZ2KEdMLkdMX0xJR0hUX01PREVMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzNdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdGVyaWFsU2hpbmluZXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODNmMDQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgTnVyYlRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gLTUuMGYsIHlQb3MgPSAtNS4wZiwgelBvcyA9IC0yNS4wZjsKLQlwcml2YXRlIGZsb2F0IHhSb3QgPSAzMzAuMGYsIHlSb3QgPSAwLjBmLCB6Um90ID0gMC4wZjsKLQlwcml2YXRlIGludCBudXJiOwotCi0JLyoqCi0JICogUmV0dXJucyBhIDMgZGltZW5zaW9uYWwgYXJyYXkgdG8gc3RvcmUgdmVydGV4IHBvaW50cyBmb3IgdGhlIG51cmIKLQkgKiBzdXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5Ci0JICovCi0JZmxvYXRbXVtdW10gYnVpbGROdXJiKCkgewotCQlmbG9hdFtdW11bXSBjdHJsID0gbmV3IGZsb2F0WzRdWzRdWzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQkvLyBzZXQgdGhlIHggdmFsdWUKLQkJCQljdHJsW2ldW2pdWzBdID0gMiAqIChpICsgKGZsb2F0KSBNYXRoLmNvcyhpICsgaikpOwotCQkJCS8vIHNldCB0aGUgeSB2YWx1ZQotCQkJCWN0cmxbaV1bal1bMV0gPSAyICogKGogKyAoZmxvYXQpIE1hdGguY29zKGkgKyBqKSk7Ci0JCQkJLy8gc2V0IHRoZSB6IHZhbHVlCi0JCQkJaWYgKChpID09IDEgJiYgaiA9PSAxKSB8fCAoaSA9PSAyICYmIGogPT0gMikpIHsKLQkJCQkJLy8gdGhpcyBtYWtlcyB0aGUgaGlsbAotCQkJCQljdHJsW2ldW2pdWzJdID0gNi4wZjsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsW2ldW2pdWzJdID0gMC4wZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc2V0cyB0aGlzIHBhcnRpY3VsYXIgeiB2YWx1ZSB0byBhIGxhcmdlIG51bWJlciB0byBtYWtlIGEgaGlnaAotCQkvLyBoaWxsCi0JCWN0cmxbMl1bMl1bMl0gPSA4LjBmOwotCi0JCXJldHVybiBjdHJsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgMSBkaW1lbnNpb25hbCBhcnJheSByZXByZXNlbnRpbmcgdGhlIDMgZGltZW5zaW9uYWwKLQkgKiBhcmd1bWVudC4gIFRoaXMgcmVzdWx0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIG51cmIgcmVuZGVyZXIKLQkgKiAKLQkgKiBAcGFyYW0gY3RybCBzb3VyY2UgM0QgYXJyYXkKLQkgKiBAcmV0dXJuIDFEIGFycmF5Ci0JICovCi0JZmxvYXRbXSBjb252ZXJ0KGZsb2F0W11bXVtdIGN0cmwpIHsKLQkJZmxvYXRbXSBwdHMgPQotCQkJbmV3IGZsb2F0W2N0cmwubGVuZ3RoICogY3RybFswXS5sZW5ndGggKiBjdHJsWzBdWzBdLmxlbmd0aF07Ci0JCWludCByb3cgPSAwOwotCQlpbnQgY29sID0gMDsKLQkJLy8gc2V0IHJvd0luY3IgdG8gbnVtYmVyIG9mIGNvbHVtbnMgKiBkZXB0aCAKLQkJaW50IHJvd0luY3IgPSBjdHJsWzBdLmxlbmd0aCAqIGN0cmxbMF1bMF0ubGVuZ3RoOwotCQkvLyBzZXQgY29sSW5jciB0byBkZXB0aCAKLQkJaW50IGNvbEluY3IgPSBjdHJsWzBdWzBdLmxlbmd0aDsKLQkJLy8gbG9vcCB0aHJvdWdoIHJvd3MgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RybC5sZW5ndGg7IGkrKykgewotCQkJY29sID0gMDsKLQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW5zCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGN0cmxbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkvLyBsb29wIHRocm91Z2ggdG8gZ2V0IHRoZSBkZXB0aCB2YWx1ZXMKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGN0cmxbMF1bMF0ubGVuZ3RoOyBrKyspIHsKLQkJCQkJcHRzW3JvdyArIGNvbCArIGtdID0gY3RybFtpXVtqXVtrXTsKLQkJCQl9Ci0JCQkJY29sICs9IGNvbEluY3I7Ci0JCQl9Ci0JCQlyb3cgKz0gcm93SW5jcjsKLQkJfQotCQlyZXR1cm4gcHRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMzMwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2FtcGxpbmcgVG9sZXJhbmNlOiIpOwotCQlmaW5hbCBTbGlkZXIgc1NsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzU2xpZGVyLnNldE1heGltdW0oMTAxKTsKLQkJc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzU2xpZGVyLnNldFRodW1iKDIpOwotCQlzU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNTbGlkZXIuc2V0U2VsZWN0aW9uKDc1KTsKLQkJc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCW51cmIsCi0JCQkJCUdMVS5HTFVfU0FNUExJTkdfVE9MRVJBTkNFLAotCQkJCQlzU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBmaWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZpbGxCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCQludXJiLAotCQkJCQkJR0xVLkdMVV9ESVNQTEFZX01PREUsCi0JCQkJCQlHTFUuR0xVX0ZJTEwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQkJbnVyYiwKLQkJCQkJCUdMVS5HTFVfRElTUExBWV9NT0RFLAotCQkJCQkJR0xVLkdMVV9PVVRMSU5FX1BPTFlHT04pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZU51cmJzUmVuZGVyZXIobnVyYik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIk51cmIiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXQgdXAgbWF0ZXJpYWwgY29sb3Igd2hpY2ggaGVscHMgc2hvdyBjdXJ2ZXMKLQkJZmxvYXQgbWF0X3NwZWN1bGFyW10gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJZmxvYXQgbWF0X3NoaW5pbmVzc1tdID0geyAxMDAuMGYgfTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TUEVDVUxBUiwgbWF0X3NwZWN1bGFyKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdF9zaGluaW5lc3MpOwotCQlHTC5nbENvbG9yTWF0ZXJpYWwoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlRfQU5EX0RJRkZVU0UpOwotCQkKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DT0xPUl9NQVRFUklBTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9BVVRPX05PUk1BTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX05PUk1BTElaRSk7Ci0JCQotCQludXJiID0gR0xVLmdsdU5ld051cmJzUmVuZGVyZXIoKTsKLQotCQlHTFUuZ2x1TnVyYnNQcm9wZXJ0eSgKLQkJCW51cmIsCi0JCQlHTFUuR0xVX1NBTVBMSU5HX01FVEhPRCwKLQkJCUdMVS5HTFVfUEFUSF9MRU5HVEgpOwotCQkvLyBzYW1wbGluZyB0b2xlcmFuY2UgaXMgc3BlY2lmaWMgZm9yIEdMVS5HTFVfUEFUSF9MRU5HVEgKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9TQU1QTElOR19UT0xFUkFOQ0UsIDc1LjBmKTsKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9ESVNQTEFZX01PREUsIEdMVS5HTFVfRklMTCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJLy8gZG8gdHJhbnNsYXRpb24gYW5kIHJvdGF0aW9uCi0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJLy8gZGVmaW5lIG51cmJzIHN1cmZhY2UKLQkJZmxvYXRbXSBrbm90cyA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTFUuZ2x1QmVnaW5TdXJmYWNlKG51cmIpOwotCQlHTFUuZ2x1TnVyYnNTdXJmYWNlKAotCQkJbnVyYiwgOCwga25vdHMsIDgsIGtub3RzLCAxMiwgMywKLQkJCWNvbnZlcnQoYnVpbGROdXJiKCkpLCA0LCA0LCBHTC5HTF9NQVAyX1ZFUlRFWF8zKTsKLQkJR0xVLmdsdUVuZFN1cmZhY2UobnVyYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MWUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIE9iamVjdHNUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgY2xhc3MgU2hhcGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHNoYXBlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzaGFwZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJdm9pZCBkaXNwb3NlKCkgewotCQkJR0wuZ2xEZWxldGVMaXN0cyhpbmRleCwgMSk7Ci0JCX0KLQkJdm9pZCBkcmF3KCkgewotCQkJR0wuZ2xDYWxsTGlzdChpbmRleCk7Ci0JCX0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU2hhcGVbXSBzaGFwZXM7Ci0JcHJpdmF0ZSBTaGFwZSBjdXJyZW50U2hhcGU7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMC4wZiwgeVJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBib29sZWFuIGZpbGwgPSB0cnVlOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfTEVOR1RIID0gNTA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb250cm9scy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCW5ldyBMYWJlbChjb250cm9scywgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0c0NvbWJvID0gbmV3IENvbWJvKGNvbnRyb2xzLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW9iamVjdHNDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJb2JqZWN0c0NvbWJvLnNlbGVjdCgwKTsKLQkJb2JqZWN0c0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbb2JqZWN0c0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gZmlsbFRvZ2dsZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbHMsIFNXVC5DSEVDSyk7Ci0JCWZpbGxUb2dnbGVCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsVG9nZ2xlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbFRvZ2dsZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmlsbCA9IGZpbGxUb2dnbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNoYXBlcyBbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaXJjbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcmFkaXVzCi0JICogQHBhcmFtIHhTaHJpbmsKLQkgKiBAcGFyYW0geVNocmluawotCSAqLwotCXZvaWQgZHJhd0NpcmNsZShmbG9hdCByYWRpdXMsIGZsb2F0IHhTaHJpbmssIGZsb2F0IHlTaHJpbmspIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9QT0xZR09OKTsKLQkJZmxvYXQgZGlhID0gKGZsb2F0KSAyLjAgKiAoZmxvYXQpIE1hdGguUEk7Ci0JCWZvciAoZmxvYXQgYW5nbGUgPSAwLjBmOyBhbmdsZSA8PSBkaWE7IGFuZ2xlICs9IDAuMWYpIHsKLQkJCUdMLmdsVmVydGV4MmQocmFkaXVzICogTWF0aC5jb3MoYW5nbGUpLCByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpOwotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjdWJlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXZvaWQgZHJhd0N1YmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0IAkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIGxlZnQgCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgbGVmdAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gbGVmdAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCBsZWZ0CQotCQkvLyByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0CQkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCBsZWZ0Ci0JCS8vIHRvcAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHB5cmFtaWQgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHBhcmFtIGRlcHRoCi0JICovCi0Jdm9pZCBkcmF3UHlyYW1pZChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBkZXB0aCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyByaWdodAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIHJpZ2h0CQotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wCQkJCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIHJpZ2h0Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBsZWZ0CQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyByaWdodAkJCQotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNxdWFyZSBjZW50ZXJlZCBhdCAwLDAgaW4gdGhlIHZpZXdwb3J0LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQl2b2lkIGRyYXdTcXVhcmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBib3R0b20gbGVmdCAJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgMC4wZik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIDAuMGYpOwkvLyB0b3AgbGVmdAotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmcm9tIGdsdXRfc2hhcGVzLmMgLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICogQHBhcmFtIFIKLQkgKiBAcGFyYW0gbnNpZGVzCi0JICogQHBhcmFtIHJpbmdzCi0JICovCi0Jdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmOwotCQlmbG9hdCBjb3NUaGV0YSA9IDEuMGY7Ci0JCWZsb2F0IHNpblRoZXRhID0gMC4wZjsKLQkJCi0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMLmdsQmVnaW4oR0wuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJCi0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCQotCQkJR0wuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdHJpYW5nbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0Jdm9pZCBkcmF3VHJpYW5nbGUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIG1pZGRsZSAKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBsZWZ0IAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gcmlnaHQJCSAJCQotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiT2JqZWN0cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsTGluZVdpZHRoKDIpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGlzcGxheSBsaXN0cyBhbmQgc2hhcGVzCi0JCXNoYXBlcyA9IG5ldyBTaGFwZVsxMV07Ci0JCWludCBpbmRleCA9IDE7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1RyaWFuZ2xlKDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdQeXJhbWlkKDIuMGYsIDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJQeXJhbWlkIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NxdWFyZSgyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1syXSA9IG5ldyBTaGFwZSgiU3F1YXJlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0N1YmUoMi4wZiwgMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkN1YmUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3Q2lyY2xlKDIuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJDaXJjbGUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UGFydGlhbERpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4LCA5MCwgMTI1KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s1XSA9IG5ldyBTaGFwZSgiUGFydGlhbCBEaXNrIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s2XSA9IG5ldyBTaGFwZSgiRGlzayIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdUb3J1cygxLCAyLCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzddID0gbmV3IFNoYXBlKCJUb3J1cyIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAyLjAsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbOF0gPSBuZXcgU2hhcGUoIlNwaGVyZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDIuMCwgMi4wLCA0LCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzldID0gbmV3IFNoYXBlKCJDeWxpbmRlciIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDAsIDIuMCwgNCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1sxMF0gPSBuZXcgU2hhcGUoIkNvbmUiLCBpbmRleCsrKTsKLQotCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xNC4wZik7Ci0JCS8vIHJvdGF0ZSBhcm91bmQgWCBhbmQgWSBheGlzCi0JCUdMLmdsUm90YXRlZih5Um90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXRzIHBvbHlnb24gZmlsbCBtb2RlCi0JCWlmIChmaWxsKSB7Ci0JCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9GSUxMKTsKLQkJfSBlbHNlIHsKLQkJCUdMLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0xJTkUpOwotCQl9Ci0JCWN1cnJlbnRTaGFwZS5kcmF3KCk7Ci0JCXlSb3QgKz0gMS41OwotCQl4Um90ICs9IDEuNTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNkYTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgT3BlbkdMRXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX29wZW5nbCIpOwotCXByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIE9wZW5HTFRhYltdIHRhYnM7Ci0JcHJpdmF0ZSBpbnQgc2xlZXA7Ci0JCi0JcHVibGljIE9wZW5HTEV4YW1wbGUoKSB7fQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBPcGVuR0xFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBPcGVuR0xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFicyA9Ci0JCQluZXcgT3BlbkdMVGFiW10gewotCQkJCW5ldyBBbnRpYWxpYXNpbmdUYWIoKSwKLQkJCQluZXcgQXJlYVRhYigpLAotCQkJCW5ldyBGb2dUYWIoKSwKLQkJCQluZXcgR3JhZGllbnRUYWIoKSwKLQkJCQluZXcgTGlnaHRUYWIoKSwKLQkJCQluZXcgTnVyYlRhYigpLAotCQkJCW5ldyBPYmplY3RzVGFiKCksCi0JCQkJbmV3IFJlZmxlY3Rpb25UYWIoKSwKLQkJCQluZXcgU3RlbmNpbFRhYigpLAotCQkJCW5ldyBUZXh0dXJlVGFiKCksCi0JCQkJbmV3IFRyYW5zcGFyZW5jeVRhYigpCi0JCQl9OwotCQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KHRhYnNbaV0uZ2V0VGFiVGV4dCgpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbCh0YWJzW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UodGFiRm9sZGVyKSk7Ci0JCX0KLQkJCi0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJT3BlbkdMVGFiIHRhYiA9IHRhYnNbdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCXRhYi5zZXRDdXJyZW50KCk7Ci0JCQkJc2xlZXAgPSB0YWIuZ2V0U2xlZXBMZW5ndGgoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmICh0YWJzLmxlbmd0aCA+IDApIHsKLQkJCXRhYnNbMF0uc2V0Q3VycmVudCgpOwotCQkJc2xlZXAgPSB0YWJzWzBdLmdldFNsZWVwTGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCVJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0YWJGb2xkZXIuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJZGlzcGxheSgpOwotCQkJCXRhYkZvbGRlci5nZXREaXNwbGF5KCkudGltZXJFeGVjKHNsZWVwLCB0aGlzKTsKLQkJCX0KLQkJfTsKLQkJdGltZXIucnVuKCk7Ci0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgb2YgdGhlIGN1cnJlbnQgdGFiLgotCSAqLwotCXZvaWQgZGlzcGxheSgpIHsKLQkJaW50IGluZGV4ID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXRhYnNbaW5kZXhdLnJlbmRlcigpOwotCQl0YWJzW2luZGV4XS5zd2FwKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCBjb250YWluZWQgdGFicy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJdGFic1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlPcGVuR0xFeGFtcGxlIGluc3RhbmNlID0gbmV3IE9wZW5HTEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBPcGVuR0xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5OWU4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci0KLS8qKgotICogPGNvZGU+T3BlbkdMVGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgZGlmZmVyZW50IGV4YW1wbGUuCi0gKgotICogQW4gT3BlbkdMVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEgaGllcmFyY2h5Ci0gKiB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICovCi1hYnN0cmFjdCBjbGFzcyBPcGVuR0xUYWIgewotCXByaXZhdGUgR0xDYW52YXMgZ2xDYW52YXM7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFiRm9sZGVyUGFnZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RlbmNpbFN1cHBvcnQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU0xFRVBfTEVOR1RIID0gMTAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHRhYidzIGNvbnRyb2xzLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCWFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIHRoZSBwYXJlbnQgdGFiIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlkYXRhLnN0ZW5jaWxTaXplID0gODsKLQkJZ2xDYW52YXMgPSBuZXcgR0xDYW52YXModGFiRm9sZGVyUGFnZSwgU1dULk5PX0JBQ0tHUk9VTkQsIGRhdGEpOwotCQlnbENhbnZhcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdsQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlnbENhbnZhcy5zZXRTaXplKDQwMCwgNDAwKTsJCS8vIG5lZWRlZCBmb3Igd2luZG93cwotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlDb21wb3NpdGUgY29udHJvbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBjcmVhdGUgdGhlIE9wZW5HTCBTY3JlZW4gYW5kIGNvbnRyb2xzCi0JCXNldEN1cnJlbnQoKTsKLQkJc2V0dXBWaWV3aW5nQXJlYSgpOwotCi0JCS8vIGRldGVybWluZSBpZiBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotCQlpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2V0SW50ZWdlcnYoR0wuR0xfU1RFTkNJTF9CSVRTLCBwYXJhbSk7Ci0JCXN0ZW5jaWxTdXBwb3J0ID0gcGFyYW1bMF0gIT0gMDsKLQotCQlpbml0KCk7Ci0KLQkJaWYgKCFpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgfHwgaGFzU3RlbmNpbFN1cHBvcnQoKSkgewotCQkJY3JlYXRlQ29udHJvbHMoY29udHJvbENvbXBvc2l0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250cm9sQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KCJUaGlzIHRhYiByZXF1aXJlcyBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0LiIpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyB0YWIuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdsQ2FudmFzIGZvciB0aGlzIHRhYi4KLQkgKiAKLQkgKiBAcmV0dXJuIENhbnZhcwotCSAqLwotCUdMQ2FudmFzIGdldEdsQ2FudmFzKCkgewotCQlyZXR1cm4gZ2xDYW52YXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGV4YW1wbGUKLQkgKiBzaG91bGQgc2xlZXAgYmV0d2VlbiBhbmltYXRpb24gcmVkcmF3cy4gIEFzIHRoaXMgbGVuZ3RoCi0JICogaW5jcmVhc2VzLCB1c2VyIHJlc3BvbnNpdmVuZXNzIGluY3JlYXNlcyBhbmQgdGhlIGZyZXF1ZW5jeSBvZgotCSAqIGFuaW1hdGlvbiByZWRyYXdzIGRlY3JlYXNlcy4gIFN1YmNsYXNzZXMgd2l0aCBtb3ZpbmcgYW5pbWF0aW9ucwotCSAqIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYQotCSAqIHNtYWxsZXIgdmFsdWUgaWYgdGhlaXIgYW5pbWF0aW9ucyBkbyBub3Qgb2NjdXIgZnJlcXVlbnRseSBlbm91Z2guIAotCSAqCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJldHdlZW4gcmVkcmF3cwotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0xFRVBfTEVOR1RIOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXRUYWJUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYWNoaW5lIGhhcyBuYXRpdmUgc3RlbmNpbHMgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1N0ZW5jaWxTdXBwb3J0KCkgewotCQlyZXR1cm4gc3RlbmNpbFN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBPcGVuR0wgcmVzb3VyY2VzIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGluaXQoKTsKLQotCS8qKgotCSAqIExvYWRzIGEgdGV4dHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSB0ZXh0dXJlW10KLQkgKi8KLQlzdGF0aWMgdm9pZCBsb2FkVGV4dHVyZShHTENhbnZhcyBjb250ZXh0LCBTdHJpbmcgZmlsZU5hbWUsIGludCBpbmRleCwgaW50W10gdGV4dHVyZSkgewotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVbaW5kZXhdKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9Ci0JCQluZXcgSW1hZ2VEYXRhKE9wZW5HTFRhYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBzb3VyY2UpOwotCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU2LCAyNTYpOwotCQlHQyBnYyA9IG5ldyBHQyhuZXdJbWFnZSk7Ci0JCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLCAwLCAyNTYsIDI1Nik7Ci0JCXNvdXJjZSA9IG5ld0ltYWdlLmdldEltYWdlRGF0YSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNvdXJjZSA9IEltYWdlRGF0YVV0aWwuY29udmVydEltYWdlRGF0YShzb3VyY2UpOwotCQluZXdJbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJR0wuZ2xUZXhJbWFnZTJEKAotCQkJR0wuR0xfVEVYVFVSRV8yRCwgMCwgMywgCi0JCQlzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQsIDAsCi0JCQlHTC5HTF9SR0IsIEdMLkdMX1VOU0lHTkVEX0JZVEUsIHNvdXJjZS5kYXRhKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXJzIHRoaXMgdGFiLgotCSAqLwotCXZvaWQgcmVuZGVyKCkgewotCQlzZXRDdXJyZW50KCk7Ci0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCXJlbmRlclNjZW5lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgZm9yIHRoaXMgdGFiLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqLwotCWFic3RyYWN0IHZvaWQgcmVuZGVyU2NlbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhYiByZXF1aXJlcyBzdGVuY2lsIHN1cHBvcnQgaW4gb3JkZXIgdG8gZGlzcGxheQotCSAqIHByb3Blcmx5LiBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyByZW5kZXJpbmcgY29udGV4dCB0byBiZSBjdXJyZW50LgotCSAqLwotCXZvaWQgc2V0Q3VycmVudCgpIHsKLQkJZ2xDYW52YXMuc2V0Q3VycmVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSB2aWV3aW5nIGFyZWEgZm9yIHRoZSBPcGVuR0wgc2NyZWVuLiAgVGhlIGRlZmF1bHQKLQkgKiBiZWhhdmlvciBpcyB0byB1c2UgYSBwZXJzcGVjdGl2ZSB2aWV3LCBidXQgdGhlcmUgYWxzbyBleGlzdCBmcnVzdHJ1bQotCSAqIGFuZCBvcnRobyB2aWV3cy4gIFN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXR1cFZpZXdpbmdBcmVhKCkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGdsQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLQkJaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDEpOwotCQlHTC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7CS8vIHNlbGVjdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsJCQkJLy8gcmVzZXQgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0JCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7CS8vIHNlbGVjdCB0aGUgbW9kZWx2aWV3IG1hdHJpeAotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSBidWZmZXJzLgotCSAqLwotCXZvaWQgc3dhcCgpIHsKLQkJZ2xDYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY1NGIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgUmVmbGVjdGlvblRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWSA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWiA9IDEuNjY2NjY2NmY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsUm90ID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVYID0gMi41ZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVZID0gLTIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWiA9IDIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgelBvcyA9IDIyLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdFNwZWVkID0gMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnRbXSB0ZXh0dXJlcyA9IG5ldyBpbnRbM107Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUxJU1RfSU5ERVhfQkFMTCA9IDEsTElTVF9JTkRFWF9CT1ggPSAyLAotCQlMSVNUX0lOREVYX01JUlJPUiA9IDMsIExJU1RfSU5ERVhfUk9PTSA9IDQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCVRFWFRVUkVfSU5ERVhfQkFMTCA9IDAsIFRFWFRVUkVfSU5ERVhfRkxPT1IgPSAxLAotCQlURVhUVVJFX0lOREVYX0JPWCA9IDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSU1BR0VTID0gewotCQkiaW1hZ2VzL0JhbGwuanBnIiwgImltYWdlcy9GbG9vci5qcGciLCAiaW1hZ2VzL0JveC5ibXAiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJhbGwKLQkgKi8KLQl2b2lkIGNyZWF0ZUJhbGwoKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JBTEwsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9CQUxMXSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAwLjM1ZiwgMzIsIDE2KTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJveAotCSAqLwotCXZvaWQgY3JlYXRlQm94KCkgewotCQlmbG9hdCBzaXplID0gMS4wZjsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfQk9YLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJLy8gYmFjawkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAtMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyBsZWZ0CQotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAtc2l6ZSk7Ci0JCS8vIHJpZ2h0CQotCQlHTC5nbE5vcm1hbDNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyB0b3AJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJvdHRvbQkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGJhbGxUcmFuc2xhdGlvbiA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQliYWxsVHJhbnNsYXRpb24uc2V0VGV4dCgiQmFsbCBUcmFuc2xhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldE1heGltdW0oMzgpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDE4KTsKLQkJYmFsbFhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJhbGxYID0gKGZsb2F0KSAoYmFsbFhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAxOCkgLyA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWVBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWSA9IChmbG9hdCkgKGJhbGxZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0TWF4aW11bSgyNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldFRodW1iKDEpOwotCQliYWxsWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWlBvc1NsaWRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWiA9IChmbG9hdCkgKGJhbGxaUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSkgLyAzOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBjdWJlVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3ViZVRyYW5zbGF0aW9uLnNldFRleHQoIkN1YmUgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWFBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxMSk7Ci0JCWN1YmVYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWCA9IChmbG9hdCkgKGN1YmVYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWVBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVlQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVZID0gKGZsb2F0KSAoY3ViZVlQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSA2KSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgY3ViZVpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQljdWJlWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldE1heGltdW0oMTApOwotCQljdWJlWlBvc1NsaWRlci5zZXRNaW5pbXVtKDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIpOwotCQljdWJlWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVogPSAoZmxvYXQpIChjdWJlWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDIpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJSb29tIFJvdGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHNjcmVlblhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHNjcmVlbllQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHNjcmVlblpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQmFsbCBSb3RhdGlvbiBTcGVlZDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxSb3RTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQliYWxsUm90U2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNYXhpbXVtKDIyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsUm90U2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsUm90U2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCQliYWxsUm90U2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsUm90U3BlZWQgPSBiYWxsUm90U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIG1pcnJvcgotCSAqLwotCXZvaWQgY3JlYXRlTWlycm9yKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9NSVJST1IsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAwLjRmKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIHJvb20KLQkgKi8KLQl2b2lkIGNyZWF0ZVJvb20oKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX1JPT00sIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBsZWZ0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gcmlnaHQgd2FsbAotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gY2VpbGluZwkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBiYWNrIHdhbGwgd2l0aCB0cmlhbmdsZSBzdHJpcCB0byBpbGxpbWluYXRlIHQtaW50ZXJzZWN0aW9ucyAKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9TVFJJUCk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJLy8gZHJhdyBmbG9vcgotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9GTE9PUl0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZmxvb3IKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBkcmF3IG1pcnJvciBmcmFtZQotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyB0b3AKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4yZiwgMC4wZik7Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQkvLyBib3R0b20KLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMmYsIDAuMGYpOwotCQkvLyBsZWZ0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CQUxMLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX0JPWCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9NSVJST1IsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfUk9PTSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUmVmbGVjdGlvbiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsR2VuVGV4dHVyZXMoSU1BR0VTLmxlbmd0aCwgdGV4dHVyZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElNQUdFUy5sZW5ndGg7IGkrKykgewotCQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0VTW2ldLCBpLCB0ZXh0dXJlcyk7Ci0JCX0KLQotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0wuR0xfU01PT1RIKTsKLQkJR0xVLmdsdVF1YWRyaWNUZXh0dXJlKHF1YWRyYXRpYywgdHJ1ZSk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFUVVBTCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0KLQkJLy8gc2V0IHVwIHRoZSBsaWdodHMKLQkJZmxvYXRbXSBMaWdodEFtYiA9IHsgMC43ZiwgMC43ZiwgMC43ZiwgMS4wZiB9OwotCQlmbG9hdFtdIExpZ2h0RGlmID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0W10gbGlnaHRzQW1iaWVudCA9IHsgMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsaWdodHNBbWJpZW50KTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgTGlnaHRBbWIpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBMaWdodERpZik7Ci0KLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCi0JCWNyZWF0ZVJvb20oKTsKLQkJY3JlYXRlQmFsbCgpOwotCQljcmVhdGVCb3goKTsKLQkJY3JlYXRlTWlycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMVS5nbHVMb29rQXQoeFBvcywgeVBvcywgelBvcywgMCwgMCwgMCwgMCwgMSwgMCk7Ci0JCS8vIGNsaXAgcGxhbmUgZXF1YXRpb24KLQkJZG91YmxlIGNsaXBFcXVhdGlvbltdID0geyAwLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiB9OwotCQlmbG9hdFtdIExpZ2h0UG9zID0geyAwLjBmLCAyLjBmLCA3LjBmLCAxLjBmIH07Ci0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgYnVmZmVyIGZvciAibWFya2luZyIgdGhlIG1pcnJvcgkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gMSB3aGVyZSBhIHBvbHlnb24gaXMgZHJhd24KLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0VRVUFMLCAxLCAxKTsKLQkJLy8gZHJhdyB3aGVyZSB0aGUgc3RlbmNpbCBpcyAxCQkJCQkJCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DTElQX1BMQU5FMCk7Ci0JCUdMLmdsQ2xpcFBsYW5lKEdMLkdMX0NMSVBfUExBTkUwLCBjbGlwRXF1YXRpb24pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xTY2FsZWYoMS4wZiwgMS4wZiwgLTEuMGYpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgTGlnaHRQb3MpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsJCQkvLyByZWZsZWN0aW9uCi0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihiYWxsWCwgYmFsbFksIGJhbGxaKTsKLQkJR0wuZ2xSb3RhdGVmKGJhbGxSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQkFMTCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7Ci0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoY3ViZVgsIGN1YmVZLCBjdWJlWik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CT1gpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwotCQliYWxsUm90ICs9IGJhbGxSb3RTcGVlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMzN2U2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU3RlbmNpbFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBTaGFwZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIHNoYXBlJ3MgbmFtZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCS8qKgotCQkgKiBEcmF3cyB0aGlzIHNoYXBlLgotCQkgKi8KLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCQkgKiAKLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzID0gbmV3IFNoYXBlWzVdOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAsIHlQb3MgPSAwOwotCXByaXZhdGUgZmxvYXQgc2l6ZSA9IDAuNDVmOwotCXByaXZhdGUgaW50IHRleHR1cmU7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRyb2xzLnNldExheW91dChsYXlvdXQpOwotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIHNoYXBlQ29tYm8gPSBuZXcgQ29tYm8oY29udHJvbHMsIFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkrKykgewotCQkJc2hhcGVDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2hhcGVDb21iby5zZWxlY3QoMCk7Ci0JCXNoYXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1tzaGFwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2l6ZToiKTsKLQkJZmluYWwgU2xpZGVyIHNpemVTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCQlzaXplU2xpZGVyLnNldFZhbHVlcygwLCAxNSwgNzUsIDUsIDUsIDEwKTsKLQkJc2l6ZVNsaWRlci5zZXRTZWxlY3Rpb24oNDUpOwotCQlzaXplU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzaXplID0gKChmbG9hdCkgc2l6ZVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlN0ZW5jaWwiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJaW50W10gdGV4dHVyZU91dCA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2VuVGV4dHVyZXMoMSwgdGV4dHVyZU91dCk7Ci0JCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFLCAwLCB0ZXh0dXJlT3V0KTsKLQkJdGhpcy50ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNyZWF0ZSBzaGFwZXMKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoMC4wZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJEaXNrIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuMGYsIHNpemUsIDMyLCAzMik7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzJdID0gbmV3IFNoYXBlKCJTcXVhcmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsUmVjdGYoLXNpemUsIC1zaXplLCBzaXplLCBzaXplKTsKLQkJCX0KLQkJfTsKLQotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkhvdXIgR2xhc3MiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJTdGFyIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtMC4zZiwgMCwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigyICogc2l6ZSAtIDAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSAtIDAuM2YsIDIgKiBzaXplICogMC44NWYsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAtc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1swXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKAotCQkJKGZsb2F0KSAoMS41ICogTWF0aC5jb3MoeFBvcykpLAotCQkJKGZsb2F0KSAoMS4wICogTWF0aC5zaW4oeVBvcykpLAotCQkJLTMuMGYpOwotCQl4UG9zICs9IDAuMTVmOwotCQl5UG9zICs9IDAuM2Y7Ci0KLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX1JFUExBQ0UpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGxvYWQgdGhlIHRleHR1cmUgYmVoaW5kIHRoZSBzdGVuY2lsIG9iamVjdAotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTMuMWYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAtMC44NWYsIDEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgMC44NWYsIDEuMGYpOwotCQlHTC5nbEVuZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWUxMWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUZXh0dXJlVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHlyb3QgPSAwLCB6cm90ID0gMDsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0yMDsKLQlwcml2YXRlIGludCB0ZXh0dXJlID0gMDsKLQlwcml2YXRlIGZsb2F0W11bXVtdIHBvaW50cyA9IG5ldyBmbG9hdFs0NV1bNDVdWzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUZXh0dXJlIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCS8vR0wuZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuM2YsIDEuMGYpOyAKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRleHR1cmUgPSB0ZXh0dXJlT3V0WzBdOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05ULCBHTC5HTF9MSU5FKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBpbml0aWFsaXplIHBvaW50cwkKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NTsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ1OyB5KyspIHsKLQkJCQlwb2ludHNbeF1beV1bMF0gPSB4IC8gNS4wZiAtIDQuNWY7Ci0JCQkJcG9pbnRzW3hdW3ldWzFdID0geSAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsyXSA9Ci0JCQkJCShmbG9hdCkgTWF0aC5zaW4oCi0JCQkJCQkoKCh4IC8gNS4wZikgKiA0MC4wZikgLyAzNjAuMGYpICogTWF0aC5QSSAqIDIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih5cm90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpyb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCi0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ0OyB4KyspIHsKLQkJCWZvciAoaW50IHkgPSAwOyB5IDwgNDQ7IHkrKykgewotCQkJCWZsb2F0IGZ4ID0geCAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ5ID0geSAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ4YiA9ICh4ICsgMSkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeWIgPSAoeSArIDEpIC8gNDQuMGY7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3hdW3ldWzBdLAotCQkJCQlwb2ludHNbeF1beV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5XVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5Yik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4YiwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMV0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMl0pOwotCQkJfQotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JCS8vIHBlcmZvcm0gd2F2ZSBtb3Rpb24KLQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQlmbG9hdCBob2xkID0gcG9pbnRzWzBdW3ldWzJdOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzJdID0gcG9pbnRzW3ggKyAxXVt5XVsyXTsKLQkJCX0KLQkJCXBvaW50c1s0NF1beV1bMl0gPSBob2xkOwotCQl9Ci0JCXlyb3QgKz0gMC45ZjsKLQkJenJvdCArPSAwLjZmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlkYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUcmFuc3BhcmVuY3lUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBhbHBoYXMgPSB7IDAuM2YsIDAuNWYsIDEuMGYgfTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudFNlbGVjdGlvbiA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUlOREVYX1RSSUFOR0xFID0gMSwgSU5ERVhfU1BIRVJFID0gMiwgSU5ERVhfRElTSyA9IDM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUUyA9IHsiVHJpYW5nbGUiLCAiU3BoZXJlIiwgIkRpc2siIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBvYmplY3RHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVFMpOwotCQlvYmplY3RDb21iby5zZWxlY3QoMCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiVHJhbnNwYXJlbmN5OiIpOwotCQlmaW5hbCBTbGlkZXIgdHJhbnNwYXJlbmN5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJdHJhbnNwYXJlbmN5U2xpZGVyLnNldFZhbHVlcygwLCAwLCAxMSwgMSwgMSwgMik7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oNyk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgYWxwaGEgPSB0cmFuc3BhcmVuY3lTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWxwaGEgPSAxLjBmIC0gYWxwaGEgLyAxMDsKLQkJCQlhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdID0gYWxwaGE7Ci0JCQl9Ci0JCX0pOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oCi0JCQkJCShpbnQpICgoMS4wZiAtIGFscGhhc1tjdXJyZW50U2VsZWN0aW9uIC0gMV0pICogMTApKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfRElTSywgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfU1BIRVJFLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhJTkRFWF9UUklBTkdMRSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVHJhbnNwYXJlbmN5IjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwkJCi0JCUdMLmdsTmV3TGlzdChJTkRFWF9TUEhFUkUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAxLjUsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfRElTSywgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9GSUxMKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAxLjAsIDMsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfVFJJQU5HTEUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uVGFiLnByb2Nlc3NQaWNrIChpbnRbXSwgaW50KQotCSAqLwotCXZvaWQgcHJvY2Vzc1BpY2soaW50W10gcFNlbGVjdEJ1ZmYsIGludCBoaXRzKSB7Ci0JCWludCB6RGVwdGg7Ci0JCWludCB0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbM107Ci0JCXpEZXB0aCA9IHBTZWxlY3RCdWZmWzJdOwotCQkvLyBwaWNrIG9iamVjdCB3aXRoIGxhcmdlc3QgeiB2YWx1ZQotCQlmb3IgKGludCBpID0gNDsgaSA8PSA0ICogKGhpdHMgLSAxKTsgaSA9IGkgKyA0KSB7Ci0JCQlpZiAoekRlcHRoID4gcFNlbGVjdEJ1ZmZbaSArIDJdKSB7Ci0JCQkJekRlcHRoID0gcFNlbGVjdEJ1ZmZbaSArIDJdOwotCQkJCXRlbXBTZWxlY3Rpb24gPSBwU2VsZWN0QnVmZltpICsgM107Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBTZWxlY3Rpb24gPiAwKSBjdXJyZW50U2VsZWN0aW9uID0gdGVtcFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJLy8gZHJhdyBpdGVtcyB3aXRoIHRyYW5zcGFyZW50IHF1YWxpdGllcyBpbiByZXZlcnNlIFogb3JkZXIKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQlHTC5nbFB1c2hOYW1lKDApOwotCi0JCS8vIGRyYXcgZGlzawotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0xLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjRmKDAuMGYsIDEuMGYsIDAuMGYsIGFscGhhc1syXSk7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfRElTSyk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfRElTSyk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX0RJU0spIHsKLQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9MSU5FKTsKLQkJCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC45OCwgMy4wMiwgMzIsIDMyKTsKLQkJfQotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCS8vIGRyYXcgdHJpYW5nbGUKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsICszLjBmKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAwLjBmLCAwLjBmLCBhbHBoYXNbMF0pOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1RSSUFOR0xFKTsKLQkJR0wuZ2xQb2ludFNpemUoNS4wZik7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1RSSUFOR0xFKSB7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1BPSU5UUyk7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCQlHTC5nbEVuZCgpOwotCQl9Ci0KLQkJLy8gZHJhdyBzcGhlcmUKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAwLjBmLCAxLjBmLCBhbHBoYXNbMV0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX1NQSEVSRSk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfU1BIRVJFKTsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gPT0gSU5ERVhfU1BIRVJFKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41MSwgOCwgOCk7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODkwZDI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWY2NjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNGM5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNzVkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ2YWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVjZTE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFhYTkzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHNuaXBwZXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMDIxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU1dUIFNuaXBwZXRzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZDVhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTBiMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc0ZWI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBEcmF3IHVzaW5nIHRyYW5zZm9ybWF0aW9ucywgcGF0aHMgYW5kIGFscGhhIGJsZW5kaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiQWR2YW5jZWQgR3JhcGhpY3MiKTsKLQkJRm9udERhdGEgZmQgPSBzaGVsbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZmluYWwgRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCA2MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNjQwLCA0ODApOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxPdmFsKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7CQkJCQotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJdHIudHJhbnNsYXRlKDUwLCAxMjApOwotCQkJCXRyLnJvdGF0ZSgtMzApOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHJlY3Qud2lkdGggLyAyLCByZWN0LmhlaWdodCAvIDIpOwotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmZjgwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9udCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhcmdlIGZvbnQgZm9yIHVzZSBieSBhIHRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkpOwotCXRleHQuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCAxNTApOwotCUZvbnQgaW5pdGlhbEZvbnQgPSB0ZXh0LmdldEZvbnQoKTsKLQlGb250RGF0YVtdIGZvbnREYXRhID0gaW5pdGlhbEZvbnQuZ2V0Rm9udERhdGEoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWZvbnREYXRhW2ldLnNldEhlaWdodCgyNCk7Ci0JfQotCUZvbnQgbmV3Rm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbmV3Rm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGU5NzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FLCAxKTsKLQlpdGVtLnNldFRleHQgKCIqKiogTmV3IEl0ZW0gIiArIHRhYmxlLmluZGV4T2YgKGl0ZW0pICsgIiAqKioiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDU2YjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0cmVlIGl0ZW0gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FLCAxKTsKLQlUcmVlSXRlbSBbXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMgKCk7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGggJiYgaXRlbXMgW2luZGV4XSAhPSBpdGVtKSBpbmRleCsrOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgaW5kZXggKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjczZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIHRhYmxlIGl0ZW0gdGV4dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMyB7Ci0KLXN0YXRpYyBjaGFyIGNvbnRlbnQgPSAnYSc7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDI0MCk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxNjAsIDE2MCk7Ci0KLQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bNF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSkuc2V0V2lkdGgoNDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJcG9wdWxhdGVJdGVtKGl0ZW1zW2ldKTsKLQl9Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTgwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZUl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQlTdHJpbmcgc3RyaW5nQ29udGVudCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQpOwotCWl0ZW0uc2V0VGV4dCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQgfSk7Ci0JY29udGVudCsrOwotCWlmIChjb250ZW50ID4gJ3onKSBjb250ZW50ID0gJ2EnOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDM4ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNwbGFzaCBzY3JlZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgaW50IFtdIGNvdW50ID0gbmV3IGludCBbXSB7NH07Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzAwLCAzMDApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5kcmF3VGV4dCgiU3BsYXNoIFNjcmVlbiIsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNwbGFzaCA9IG5ldyBTaGVsbChTV1QuT05fVE9QKTsKLQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JYmFyLnNldE1heGltdW0oY291bnRbMF0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwbGFzaCwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0Jc3BsYXNoLnNldExheW91dChsYXlvdXQpOwotCUZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JRm9ybURhdGEgcHJvZ3Jlc3NEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCXByb2dyZXNzRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCA1KTsKLQlwcm9ncmVzc0RhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCXByb2dyZXNzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCWJhci5zZXRMYXlvdXREYXRhKHByb2dyZXNzRGF0YSk7Ci0Jc3BsYXNoLnBhY2soKTsKLQlSZWN0YW5nbGUgc3BsYXNoUmVjdCA9IHNwbGFzaC5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCWludCB4ID0gKGRpc3BsYXlSZWN0LndpZHRoIC0gc3BsYXNoUmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gKGRpc3BsYXlSZWN0LmhlaWdodCAtIHNwbGFzaFJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc3BsYXNoLnNldExvY2F0aW9uKHgsIHkpOwotCXNwbGFzaC5vcGVuKCk7Ci0JZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGxbY291bnRbMF1dOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50WzBdOyBpKyspIHsKLQkJCQlzaGVsbHMgW2ldID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxscyBbaV0uc2V0U2l6ZSAoMzAwLCAzMDApOwotCQkJCXNoZWxscyBbaV0uYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQktLWNvdW50WzBdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbihpKzEpOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQotCQkJfQotCQkJc3BsYXNoLmNsb3NlKCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0ub3BlbigpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jd2hpbGUgKGNvdW50IFswXSAhPSAwKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2QzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgYW4gZXh0ZXJuYWwgYmF0Y2ggZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0ubGF1bmNoKCJjOlxcY3lnd2luXFxjeWd3aW4uYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzNhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgY29sdW1uIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmaW5hbCBUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucyAoKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgajxjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGk8Y29sdW1ucy5sZW5ndGg7IGkrKykgY29sdW1ucyBbaV0ucGFjayAoKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlmaW5hbCBpbnQgaW5kZXggPSAxOwotCWJ1dHRvbi5zZXRUZXh0ICgiSW5zZXJ0IENvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoaW5kZXgsICJJdGVtICIgKyBpICsgImEiKTsKLQkJCX0KLQkJCWNvbHVtbi5wYWNrICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzY5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc3BsaXR0ZXIgKHdpdGggYSAyMCBwaXhlbCBsaW1pdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQnV0dG9uIDIiKTsKLQkKLQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm0pOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24xRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQotCWZpbmFsIGludCBsaW1pdCA9IDIwLCBwZXJjZW50ID0gNTA7Ci0JZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAocGVyY2VudCwgMCk7Ci0Jc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0Jc2FzaC5zZXRMYXlvdXREYXRhIChzYXNoRGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIHNoZWxsUmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgcmlnaHQgPSBzaGVsbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIGxpbWl0OwotCQkJZS54ID0gTWF0aC5tYXggKE1hdGgubWluIChlLngsIHJpZ2h0KSwgbGltaXQpOwotCQkJaWYgKGUueCAhPSBzYXNoUmVjdC54KSAgewotCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIGUueCk7Ci0JCQkJc2hlbGwubGF5b3V0ICgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoc2FzaCwgMCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMkRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmYTNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkVudGVyIHlvdXIgbmFtZToiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDEwMCwgU1dULkRFRkFVTFQpKTsKLQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPSyIpOwotCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0JCX0KLQl9KTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWwiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGNhbmNlbCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2hGb3JtIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCBmb3JtIHdpdGggdGhyZWUgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlTYXNoRm9ybSBmb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLFNXVC5IT1JJWk9OVEFMKTsKLQlmb3JtLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQxID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDEsU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGluIHBhbmUgMSIpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IEJ1dHRvbihjaGlsZDIsU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiBpbiBwYW5lMiIpOwotCi0JQ29tcG9zaXRlIGNoaWxkMyA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQzLFNXVC5QVVNIKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lMyIpOwotCQotCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezMwLDQwLDMwfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NDgwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChpLWJlYW0pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmRhMGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAod29ya3MgZm9yIGFueSB0YWJsZSBzdHlsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplIChzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmdldFRvcEluZGV4ICgpOwotCQkJd2hpbGUgKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzIChjbGllbnRBcmVhKSkgewotCQkJCQkJdmlzaWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aXNpYmxlKSByZXR1cm47Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmVkMWU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0cmVlIGl0ZW0gKGluIHBsYWNlLCBmYW5jeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtSSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtSS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajwxNjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbSAoaXRlbUksIFNXVC5OT05FKTsKLQkJCWl0ZW1KLnNldFRleHQgKCJJdGVtICIgKyBqKTsKLQkJfQotCX0KLQlmaW5hbCBUcmVlSXRlbSBbXSBsYXN0SXRlbSA9IG5ldyBUcmVlSXRlbSBbMV07Ci0JZmluYWwgVHJlZUVkaXRvciBlZGl0b3IgPSBuZXcgVHJlZUVkaXRvciAodHJlZSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtID09IGxhc3RJdGVtIFswXSkgewotCQkJCWJvb2xlYW4gc2hvd0JvcmRlciA9IHRydWU7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpZiAoc2hvd0JvcmRlcikgY29tcG9zaXRlLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJZmluYWwgaW50IGluc2V0ID0gc2hvd0JvcmRlciA/IDEgOiAwOwotCQkJCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJCQl0ZXh0LnNldEJvdW5kcyAocmVjdC54ICsgaW5zZXQsIHJlY3QueSArIGluc2V0LCByZWN0LndpZHRoIC0gaW5zZXQgKiAyLCByZWN0LmhlaWdodCAtIGluc2V0ICogMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVmVyaWZ5OgotCQkJCQkJCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJCQkJU3RyaW5nIGxlZnRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKDAsIGUuc3RhcnQpOwotCQkJCQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKGUuZW5kLCBuZXdUZXh0Lmxlbmd0aCAoKSk7Ci0JCQkJCQkJCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQkJCQkJCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKGxlZnRUZXh0ICsgZS50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQkJCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUgKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCQkJCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKSwgcmVjdCA9IHRyZWUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWF4IChzaXplLngsIGl0ZW1SZWN0LndpZHRoKSArIGluc2V0ICogMjsKLQkJCQkJCQkJaW50IGxlZnQgPSBpdGVtUmVjdC54LCByaWdodCA9IHJlY3QueCArIHJlY3Qud2lkdGg7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBNYXRoLm1pbiAoZWRpdG9yLm1pbmltdW1XaWR0aCwgcmlnaHQgLSBsZWZ0KTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1IZWlnaHQgPSBzaXplLnkgKyBpbnNldCAqIDI7Ci0JCQkJCQkJCWVkaXRvci5sYXlvdXQgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgdGV4dExpc3RlbmVyKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChjb21wb3NpdGUsIGl0ZW0pOwotCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJfQotCQkJbGFzdEl0ZW0gWzBdID0gaXRlbTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTMyYTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBpbWFnZSBpbiBhIGdyb3VwCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlncm91cC5zZXRUZXh0ICgiYSBzcXVhcmUiKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoZ3JvdXAsIFNXVC5OT05FKTsKLQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3SW1hZ2UgKGltYWdlLCAwLCAwKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEzNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRhYmxlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzZmYzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdHJlZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMjI0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogZm9yY2UgcmFkaW8gYmVoYXZpb3Igb24gdHdvIGRpZmZlcmVudCBjb21wb3NpdGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIENvbXBvc2l0ZSBbXSBjb21wb3NpdGVzID0gbmV3IENvbXBvc2l0ZSBbXSB7YzEsIGMyfTsKLQlMaXN0ZW5lciByYWRpb0dyb3VwID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y29tcG9zaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjb21wb3NpdGVzIFtpXTsKLQkJCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2pdOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGlsZDsKLQkJCQkJCWlmICgoYnV0dG9uLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSBidXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgKGkgKyA0KSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTVlZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTYgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JdGV4dC5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmU5ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBhZGQgYSBzZWxlY3QgYWxsIG1lbnUgaXRlbSB0byB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0gICAgdC5zZXRUZXh0ICgiaGVyZSBpcyBzb21lIHRleHQgdG8gYmUgc2VsZWN0ZWQiKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAoIkVkaXQiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWVkaXRJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkKLQkvLyBOb3RlIHRoYXQgYXMgbG9uZyBhcyB5b3VyIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3ZlcnJpZGRlbiAKLQkvLyB0aGUgZ2xvYmFsIGFjY2VsZXJhdG9ycyBmb3IgY29weSwgcGFzdGUsIGFuZCBjdXQgCi0JLy8oQ1RSTCtDIG9yIENUUkwrSU5TRVJULCBDVFJMK1Ygb3IgU0hJRlQrSU5TRVJULCBhbmQgQ1RSTCtYIG9yIFNISUZUK0RFTEVURSkKLQkvLyB0aGVzZSBiZWhhdmlvdXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBieSBkZWZhdWx0LgotCS8vIElmIHlvdXIgYXBwbGljYXRpb24gb3ZlcnJpZGVzIHRoZXNlIGFjY2VsZXJhdG9ycywKLQkvLyB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgVGV4dC5jb3B5KCksIFRleHQucGFzdGUoKSBhbmQgVGV4dC5jdXQoKQotCS8vIGZyb20gdGhlIFNlbGVjdGlvbiBjYWxsYmFjayBmb3IgdGhlIGFjY2VsZXJhdG9yIHdoZW4gdGhlIAotCS8vIHRleHQgd2lkZ2V0IGhhcyBmb2N1cy4KLQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY1MGM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYW4gaW1hZ2UgZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlmaW5hbCBDdXJzb3JbXSBjdXJzb3IgPSBuZXcgQ3Vyc29yWzFdOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSBjdXJzb3IiKTsKLQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYnV0dG9uLnNldFNpemUoc2l6ZSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmljbyIsICIqLmdpZiIsICIqLioifSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQlJbWFnZURhdGEgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKG5hbWUpOwotCQkJQ3Vyc29yIG9sZEN1cnNvciA9IGN1cnNvclswXTsKLQkJCWN1cnNvclswXSA9IG5ldyBDdXJzb3IoZGlzcGxheSwgaW1hZ2UsIDAsIDApOwotCQkJc2hlbGwuc2V0Q3Vyc29yKGN1cnNvclswXSk7Ci0JCQlpZiAob2xkQ3Vyc29yICE9IG51bGwpIG9sZEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoY3Vyc29yWzBdICE9IG51bGwpIGN1cnNvclswXS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjc5MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExOSB7Ci0KLXN0YXRpYyBieXRlW10gc3JjRGF0YSA9IHsKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsIAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDEwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1MCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwKLX07Ci0KLXN0YXRpYyBieXRlW10gbXNrRGF0YSA9IHsKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwLCAKLQkoYnl0ZSkweDFmLCAoYnl0ZSkweGY4LAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweGZlLCAoYnl0ZSkweDdmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDNmLCAoYnl0ZSkweGZjLAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgwMywgKGJ5dGUpMHhjMAotfTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCA0Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQltdIHsKLQkJYmxhY2suZ2V0UkdCKCksIHdoaXRlLmdldFJHQigpLCB5ZWxsb3cuZ2V0UkdCKCksIAotCQlyZWQuZ2V0UkdCKCksIGJsdWUuZ2V0UkdCKCksIGdyZWVuLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDQsIHBhbGV0dGUsIDEsIHNyY0RhdGEpOwotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHtibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlLCAxLCBtc2tEYXRhKTsKLQotCS8vU2V0IG1hc2sKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbWFza0RhdGEuZGF0YTsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSBtYXNrRGF0YS5zY2FubGluZVBhZDsKLQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDEwLCAxMCk7Ci0KLQkvL1JlbW92ZSBtYXNrIHRvIGRyYXcgdGhlbSBzZXBhcmF0ZWx5IGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc291cmNlRGF0YS5tYXNrRGF0YSA9IG51bGw7Ci0Jc291cmNlRGF0YS5tYXNrUGFkID0gLTE7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWludCB4ID0gMTAsIHkgPSAxMDsKLQkJCVN0cmluZyBzdHJpbmdTb3VyY2UgPSAic291cmNlOiAiOwotCQkJU3RyaW5nIHN0cmluZ01hc2sgPSAibWFzazogIjsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nU291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nTWFzaywgeCwgeSArIDMwKTsKLQkJCXggKz0gTWF0aC5tYXgoZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ1NvdXJjZSkueCwgZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ01hc2spLngpOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgeCwgeSk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgeCwgeSArIDMwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2E5OTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHNlbGVjdGlvbiAoc3RhcnQsIGVuZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoIkxpbmUgIiArIGkgKyAiXG4iKTsKLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoMzAsIDM4KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1vbml0b3IgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBzaGVsbCBvbiB0aGUgcHJpbWFyeSBtb25pdG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCU1vbml0b3IgcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IgKCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzICgpOwotCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzICgpOwotCWludCB4ID0gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC0gcmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc2hlbGwuc2V0TG9jYXRpb24gKHgsIHkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTZhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgcGFzc3dvcmQgKHNldCB0aGUgZWNobyBjaGFyYWN0ZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldEVjaG9DaGFyICgnKicpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmYmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUvZGlzYWJsZSBtZW51IGRlcGVuZGluZyBvbiBjbGlwYm9hcmQgY29udGVudCBhdmFpbGFiaWxpdHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWNvcHlJdGVtLnNldFRleHQoIkNvcHkiKTsKLQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W117c2VsZWN0aW9ufTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCQkJY2Iuc2V0Q29udGVudHMoZGF0YSwgdHlwZXMpOwotCQl9Ci0JfSk7Ci0JZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlwYXN0ZUl0ZW0uc2V0VGV4dCAoIlBhc3RlIik7Ci0JcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKShjYi5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB0ZXh0Lmluc2VydChzdHJpbmcpOwotCQl9Ci0JfSk7Ci0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCS8vIGlzIGNvcHkgdmFsaWQ/Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbi5sZW5ndGgoKSA+IDApOwotCQkJLy8gaXMgcGFzdGUgdmFsaWQ/Ci0JCQlUcmFuc2ZlckRhdGFbXSBhdmFpbGFibGUgPSBjYi5nZXRBdmFpbGFibGVUeXBlcygpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYXZhaWxhYmxlW2ldKSkgewotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9KTsKLQl0ZXh0LnNldE1lbnUgKG1lbnUpOwotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM2ZGZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGdldCBldmVudHMgZnJvbSBJRSBjb250cm9sICh3aW4zMiBvbmx5KQotICogCi0gKiBUaGlzIHNuaXBwZXQgb25seSBydW5zIGFzLWlzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGJlY2F1c2UgaXQgdXNlcwotICogamF2YSBpbnRlZ2VycyB0byByZXByZXNlbnQgbmF0aXZlIHBvaW50ZXJzLiAgImxvbmciIGNvbW1lbnRzIGFyZSBpbmNsdWRlZAotICogdGhyb3VnaG91dCB0aGUgc25pcHBldCB0byBzaG93IHdoZXJlIGludCBzaG91bGQgYmUgY2hhbmdlZCB0byBsb25nIGluCi0gKiBvcmRlciB0byBydW4gb24gYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLgotICogCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIGEgbmV3IGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZS4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCi0JCQkvLyBSZXF1ZXN0IHRvIGJlIG5vdGlmaWVkIG9mIGNsaWNrLCBkb3VibGUgY2xpY2sgYW5kIGtleSBkb3duIGV2ZW50cwotCQkJRXZlbnREaXNwYXRjaCBteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmNsaWNrKTsKLQkJCUlEaXNwYXRjaCBpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCVZhcmlhbnQgZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25jbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmRibGNsaWNrKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25kYmxjbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmtleWRvd24pOwotCQkJaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmtleWRvd24sIGRpc3BhdGNoKTsKLQkJCQotCQkJLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0JCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQotLy8gRXZlbnREaXNwYXRjaCBpbXBsZW1lbnRzIGEgc2ltcGxlIElEaXNwYXRjaCBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWQgCi0vLyB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC4KLWNsYXNzIEV2ZW50RGlzcGF0Y2ggewotCXByaXZhdGUgQ09NT2JqZWN0IGlEaXNwYXRjaDsKLQlwcml2YXRlIGludCByZWZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRJRDsKLQkKLQlmaW5hbCBzdGF0aWMgaW50IG9uaGVscCA9IDB4ODAwMTE3N2Q7Ci0JZmluYWwgc3RhdGljIGludCBvbmNsaWNrID0gMHg4MDAxMTc3ODsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZGJsY2xpY2sgPSAweDgwMDExNzc5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXl1cCA9IDB4ODAwMTE3NzY7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleWRvd24gPSAweDgwMDExNzc1OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlwcmVzcyA9IDB4ODAwMTE3Nzc7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNldXAgPSAweDgwMDExNzczOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZWRvd24gPSAweDgwMDExNzcyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW1vdmUgPSAweDgwMDExNzc0OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW91dCA9IDB4ODAwMTE3NzE7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlb3ZlciA9IDB4ODAwMTE3NzA7Ci0JZmluYWwgc3RhdGljIGludCBvbnJlYWR5c3RhdGVjaGFuZ2UgPSAweDgwMDExNzg5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25hZnRlcnVwZGF0ZSA9IDB4ODAwMTE3ODY7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2V4aXQ9IDB4ODAwMTE3ODI7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2VudGVyID0gMHg4MDAxMTc4MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZHJhZ3N0YXJ0ID0gMHg4MDAxMTc5MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uc2VsZWN0c3RhcnQgPSAweDgwMDExNzk1OwotCi0JRXZlbnREaXNwYXRjaChpbnQgZXZlbnRJRCkgewotCQl0aGlzLmV2ZW50SUQgPSBldmVudElEOwotCQljcmVhdGVDT01JbnRlcmZhY2VzKCk7Ci0JfQotCWludCAvKmxvbmcqLyBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gaURpc3BhdGNoLmdldEFkZHJlc3MoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0JCWlEaXNwYXRjaCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDEsIDMsIDQsIDh9KXsKLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMChpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIFF1ZXJ5SW50ZXJmYWNlKGFyZ3NbMF0sIGFyZ3NbMV0pO30KLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMShpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIEFkZFJlZigpO30KLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMihpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIFJlbGVhc2UoKTt9Ci0JCQkvLyBtZXRob2QzIEdldFR5cGVJbmZvQ291bnQgLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDQgR2V0VHlwZUluZm8gLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDUgR2V0SURzT2ZOYW1lcyAtIG5vdCBpbXBsZW1lbnRlZAotCQkJcHVibGljIGludCAvKmxvbmcqLyBtZXRob2Q2KGludCAvKmxvbmcqL1tdIGFyZ3MpIHtyZXR1cm4gSW52b2tlKChpbnQpLyo2NCovYXJnc1swXSwgYXJnc1sxXSwgKGludCkvKjY0Ki9hcmdzWzJdLCAoaW50KS8qNjQqL2FyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0sIGFyZ3NbN10pO30KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDT01JbnRlcmZhY2VzKCkgewotCQlpZiAoaURpc3BhdGNoICE9IG51bGwpCi0JCQlpRGlzcGF0Y2guZGlzcG9zZSgpOwotCQlpRGlzcGF0Y2ggPSBudWxsOwotCQkKLQl9Ci0JcHJpdmF0ZSBpbnQgQWRkUmVmKCkgewotCQlyZWZDb3VudCsrOwotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotCXByaXZhdGUgaW50IEludm9rZShpbnQgZGlzcElkTWVtYmVyLCBpbnQgLypsb25nKi8gcmlpZCwgaW50IGxjaWQsIGludCBkd0ZsYWdzLCBpbnQgLypsb25nKi8gcERpc3BQYXJhbXMsIGludCAvKmxvbmcqLyBwVmFyUmVzdWx0LCBpbnQgLypsb25nKi8gcEV4Y2VwSW5mbywgaW50IC8qbG9uZyovIHBBcmdFcnIpCXsKLQkJc3dpdGNoIChldmVudElEKSB7Ci0JCQljYXNlIG9uaGVscDogU3lzdGVtLm91dC5wcmludGxuKCJvbmhlbHAiKTsgYnJlYWs7Ci0JCQljYXNlIG9uY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25jbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25kYmxjbGljazogU3lzdGVtLm91dC5wcmludGxuKCJvbmRibGNsaWNrIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5dXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5ZG93bjogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5cHJlc3M6IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlwcmVzcyIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2V1cCIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vtb3ZlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vtb3ZlIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3V0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2VvdmVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdmVyIik7IGJyZWFrOwotCQkJY2FzZSBvbnJlYWR5c3RhdGVjaGFuZ2U6IFN5c3RlbS5vdXQucHJpbnRsbigib25yZWFkeXN0YXRlY2hhbmdlIik7IGJyZWFrOwotCQkJY2FzZSBvbmFmdGVydXBkYXRlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uYWZ0ZXJ1cGRhdGUiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZXhpdDogU3lzdGVtLm91dC5wcmludGxuKCJvbnJvd2V4aXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZW50ZXI6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dlbnRlciIpOyBicmVhazsKLQkJCWNhc2Ugb25kcmFnc3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25kcmFnc3RhcnQiKTsgYnJlYWs7Ci0JCQljYXNlIG9uc2VsZWN0c3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25zZWxlY3RzdGFydCIpOyBicmVhazsKLQkJfQotCQlyZXR1cm4gQ09NLlNfT0s7Ci0JfQotCXByaXZhdGUgaW50IFF1ZXJ5SW50ZXJmYWNlKGludCAvKmxvbmcqLyByaWlkLCBpbnQgLypsb25nKi8gcHB2T2JqZWN0KSB7Ci0JCWlmIChyaWlkID09IDAgfHwgcHB2T2JqZWN0ID09IDApIHJldHVybiBDT00uRV9JTlZBTElEQVJHOwotCQlHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotCQlDT00uTW92ZU1lbW9yeShndWlkLCByaWlkLCBHVUlELnNpemVvZik7Ci0JCi0JCWlmIChDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElVbmtub3duKSB8fCBDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElEaXNwYXRjaCkpIHsKLQkJCUNPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludCAvKmxvbmcqL1tdIHtpRGlzcGF0Y2guZ2V0QWRkcmVzcygpfSwgT1MuUFRSX1NJWkVPRik7Ci0JCQlBZGRSZWYoKTsKLQkJCXJldHVybiBDT00uU19PSzsKLQkJfQotCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnQgLypsb25nKi9bXSB7MH0sIE9TLlBUUl9TSVpFT0YpOwotCQlyZXR1cm4gQ09NLkVfTk9JTlRFUkZBQ0U7Ci0JfQotCWludCBSZWxlYXNlKCkgewotCQlyZWZDb3VudC0tOwotCQlpZiAocmVmQ291bnQgPT0gMCkgewotCQkJZGlzcG9zZUNPTUludGVyZmFjZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDFmYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IGEgY2VsbCBpbiBhIHRhYmxlIChpbiBwbGFjZSwgZmFuY3kpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjQgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyIiICsgaSwgIiIgKyBpICwgIiIgKyBpfSk7Ci0JfQotCWZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRUb3BJbmRleCAoKTsKLQkJCXdoaWxlIChpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCWJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkJCWZpbmFsIFRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKGkpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJCQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJdGV4dC5kaXNwb3NlICgpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTV1QuVHJhdmVyc2U6Ci0JCQkJCQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKGNvbHVtbiwgdGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQllZGl0b3Iuc2V0RWRpdG9yICh0ZXh0LCBpdGVtLCBpKTsKLQkJCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0IChpKSk7Ci0JCQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQkJCXRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyAoY2xpZW50QXJlYSkpIHsKLQkJCQkJCXZpc2libGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghdmlzaWJsZSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhYjc1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBmYWtlIHRvb2wgdGlwcyBmb3IgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIml0ZW0gIiArIGkpOwotCX0KLQkvLyBEaXNhYmxlIG5hdGl2ZSB0b29sdGlwCi0JdGFibGUuc2V0VG9vbFRpcFRleHQgKCIiKTsKLQkKLQkvLyBJbXBsZW1lbnQgYSAiZmFrZSIgdG9vbHRpcAotCWZpbmFsIExpc3RlbmVyIGxhYmVsTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gbGFiZWwuZ2V0U2hlbGwgKCk7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQkJCWUuaXRlbSA9IChUYWJsZUl0ZW0pIGxhYmVsLmdldERhdGEgKCJfVEFCTEVJVEVNIik7Ci0JCQkJCS8vIEFzc3VtaW5nIHRhYmxlIGlzIHNpbmdsZSBzZWxlY3QsIHNldCB0aGUgc2VsZWN0aW9uIGFzIGlmCi0JCQkJCS8vIHRoZSBtb3VzZSBkb3duIGV2ZW50IHdlbnQgdGhyb3VnaCB0byB0aGUgdGFibGUKLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uIChuZXcgVGFibGVJdGVtIFtdIHsoVGFibGVJdGVtKSBlLml0ZW19KTsKLQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJdGFibGUuc2V0Rm9jdXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJCQlzaGVsbC5kaXNwb3NlICgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JCi0JTGlzdGVuZXIgdGFibGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVNoZWxsIHRpcCA9IG51bGw7Ci0JCUxhYmVsIGxhYmVsID0gbnVsbDsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCWNhc2UgU1dULktleURvd246Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiB7Ci0JCQkJCWlmICh0aXAgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCXRpcC5kaXNwb3NlICgpOwotCQkJCQl0aXAgPSBudWxsOwotCQkJCQlsYWJlbCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAobmV3IFBvaW50IChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJCWlmICh0aXAgIT0gbnVsbCAgJiYgIXRpcC5pc0Rpc3Bvc2VkICgpKSB0aXAuZGlzcG9zZSAoKTsKLQkJCQkJCXRpcCA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0JCQkJCQl0aXAuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCQkJCQl0aXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwgKHRpcCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0RGF0YSAoIl9UQUJMRUlURU0iLCBpdGVtKTsKLQkJCQkJCWxhYmVsLnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoKSk7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlQb2ludCBzaXplID0gdGlwLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoMCk7Ci0JCQkJCQlQb2ludCBwdCA9IHRhYmxlLnRvRGlzcGxheSAocmVjdC54LCByZWN0LnkpOwotCQkJCQkJdGlwLnNldEJvdW5kcyAocHQueCwgcHQueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJdGlwLnNldFZpc2libGUgKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmFjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYXJiaXRyYXJ5IGNvbnRyb2xzIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGggKDEwMCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JfQotCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJY29tYm8uc2V0VGV4dCgiQ0NvbWJvIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAxIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAyIik7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IoY29tYm8sIGl0ZW1zW2ldLCAwKTsKLQkJZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQl0ZXh0LnNldFRleHQoIlRleHQiKTsKLQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0LCBpdGVtc1tpXSwgMSk7Ci0JCWVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrICgpOwotCQllZGl0b3IubWluaW11bVdpZHRoID0gYnV0dG9uLmdldFNpemUgKCkueDsKLQkJZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJZWRpdG9yLnNldEVkaXRvciAoYnV0dG9uLCBpdGVtc1tpXSwgMik7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGVmZWJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBUYWIgZnJvbSB0cmF2ZXJzaW5nIG91dCBvZiBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiQ2FuJ3QgVHJhdmVyc2UiKTsKLQlidXR0b24xLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX05FWFQ6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOiB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQoIkNhbiBUcmF2ZXJzZSIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODkxZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVRvb2xJdGVtIGl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUJhY2suc2V0VGV4dCgiQmFjayIpOwotCQlUb29sSXRlbSBpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Gb3J3YXJkLnNldFRleHQoIkZvcndhcmQiKTsKLQkJVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtU3RvcC5zZXRUZXh0KCJTdG9wIik7Ci0JCVRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVJlZnJlc2guc2V0VGV4dCgiUmVmcmVzaCIpOwotCQlUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtR28uc2V0VGV4dCgiR28iKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBsYWJlbEFkZHJlc3MgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbGFiZWxBZGRyZXNzLnNldFRleHQoIkFkZHJlc3MiKTsKLQkJCi0JCWZpbmFsIFRleHQgbG9jYXRpb24gPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2F0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgc3RhdHVzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIFByb2dyZXNzQmFyIHByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qIGV2ZW50IGhhbmRsaW5nICovCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgc3RyaW5nID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHN0cmluZy5lcXVhbHMoIkJhY2siKSkgYnJvd3Nlci5iYWNrKCk7IAotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkZvcndhcmQiKSkgYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiU3RvcCIpKSBicm93c2VyLnN0b3AoKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJSZWZyZXNoIikpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkdvIikpIGJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCSAgIH0KLQkJfTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KGV2ZW50LnRleHQpOwkKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50b3ApIGxvY2F0aW9uLnNldFRleHQoZXZlbnQubG9jYXRpb24pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1TdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlsb2NhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL2VjbGlwc2Uub3JnIik7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTAwMWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNvbG9yIGNlbGxzIGFuZCByb3dzIGluIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI5IHsKLSAKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEJhY2tncm91bmQoZ3JheSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBmb3JlZ3JvdW5kIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJub3JtYWwiLCJibHVlIGZvcmVncm91bmQiLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMSwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBiYWNrZ3JvdW5kIiwicmVkIGJhY2tncm91bmQifSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IndoaXRlIGZvcmUvYmx1ZSBiYWNrIiwibm9ybWFsIiwid2hpdGUgZm9yZS9yZWQgYmFjayJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMCwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQlpdGVtLnNldEZvcmVncm91bmQoMiwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCWNvbHVtbjMucGFjaygpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YThkMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogZHJhdyBhIHRoaWNrIGxpbmUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2Muc2V0TGluZVdpZHRoICg0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlICgyMCwgMjAsIDEwMCwgMTAwKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwY2I4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXN5SW5kaWNhdG9yIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBidXN5IGN1cnNvciBkdXJpbmcgbG9uZyBydW5uaW5nIHRhc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIGludFtdIG5leHRJZCA9IG5ldyBpbnRbMV07Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludm9rZSBsb25nIHJ1bm5pbmcgam9iIik7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUnVubmFibGUgbG9uZ0pvYiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCWludCBpZDsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJaWQgPSBuZXh0SWRbMF0rKzsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuU3RhcnQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZG8gdGFzayB0aGF0IHRha2VzIGEgbG9uZyB0aW1lIGluIGEgc2VwYXJhdGUgdGhyZWFkICIraWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodGV4dC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCQl0ZXh0LmFwcGVuZCgiXG5Db21wbGV0ZWQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCQkJZGlzcGxheS53YWtlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQl0aHJlYWQuc3RhcnQoKTsKLQkJCQkJCXdoaWxlICghZG9uZSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIGxvbmdKb2IpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgyNTAsIDE1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwYzA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSBwb3B1cCBtZW51ICh3YWl0IGZvciBpdCB0byBjbG9zZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKCJNZW51IEl0ZW0iKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSBTZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0pOwotCQkJbWVudS5zZXRMb2NhdGlvbiAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJd2hpbGUgKCFtZW51LmlzRGlzcG9zZWQgKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJbWVudS5kaXNwb3NlICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzAwOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCAiSGVsbG8gV29ybGQhIiBpbiBibGFjaywgb3V0bGluZWQgaW4gcmVkLCB0byBkZWZhdWx0IHByaW50ZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IE5vIGRlZmF1bHQgcHJpbnRlci4iKTsKLQkJcmV0dXJuOwotCX0KLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlpZiAocHJpbnRlci5zdGFydEpvYigiU1dUIFByaW50aW5nIFNuaXBwZXQiKSkgewotCQlDb2xvciBibGFjayA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJQ29sb3Igd2hpdGUgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JCUNvbG9yIHJlZCA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQkJaW50IGxlZnRNYXJnaW4gPSBkcGkueCArIHRyaW0ueDsgLy8gb25lIGluY2ggZnJvbSBsZWZ0IHNpZGUgb2YgcGFwZXIKLQkJaW50IHRvcE1hcmdpbiA9IGRwaS55IC8gMiArIHRyaW0ueTsgLy8gb25lLWhhbGYgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQlpZiAocHJpbnRlci5zdGFydFBhZ2UoKSkgewotCQkJZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLQkJCVN0cmluZyB0ZXN0U3RyaW5nID0gIkhlbGxvIFdvcmxkISI7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIGxlZnRNYXJnaW4sIHRvcE1hcmdpbik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKGxlZnRNYXJnaW4sIHRvcE1hcmdpbiwgZXh0ZW50LngsIGV4dGVudC55KTsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcHJpbnRlci5lbmRKb2IoKTsKLQl9Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTljNjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBQcmludGluZyBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHRleHQgdG8gcHJpbnRlciwgd2l0aCB3b3JkIHdyYXAgYW5kIHBhZ2luYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzMgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHRleHQ7Ci0JRm9udCBmb250OwotCUNvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCQotCVByaW50ZXIgcHJpbnRlcjsKLQlHQyBnYzsKLQlGb250RGF0YVtdIHByaW50ZXJGb250RGF0YTsKLQlSR0IgcHJpbnRlckZvcmVncm91bmQsIHByaW50ZXJCYWNrZ3JvdW5kOwotCi0JaW50IGxpbmVIZWlnaHQgPSAwOwotCWludCB0YWJXaWR0aCA9IDA7Ci0JaW50IGxlZnRNYXJnaW4sIHJpZ2h0TWFyZ2luLCB0b3BNYXJnaW4sIGJvdHRvbU1hcmdpbjsKLQlpbnQgeCwgeTsKLQlpbnQgaW5kZXgsIGVuZDsKLQlTdHJpbmcgdGV4dFRvUHJpbnQ7Ci0JU3RyaW5nIHRhYnM7Ci0JU3RyaW5nQnVmZmVyIHdvcmRCdWZmZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTMzKCkub3BlbigpOwotCX0KLQkKLQl2b2lkIG9wZW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJQcmludCBUZXh0Iik7Ci0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCImT3Blbi4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ08nKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJGb250Li4uIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVGb250KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9yZWdyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9yZWdyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQmFja2dyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJlByaW50Li4uIik7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJFJnhpdCIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCQotCXZvaWQgbWVudU9wZW4oKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXh0U3RyaW5nOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSByZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRQYXRoKCkpOwotCQkJdHJ5IHsKLQkJCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJCWNoYXJbXSByZWFkQnVmZmVyPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKChpbnQpIGZpbGUubGVuZ3RoKCkpOwotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQl0ZXh0U3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJCWJveC5zZXRNZXNzYWdlKCJFcnJvciByZWFkaW5nIGZpbGU6XG4iICsgbmFtZSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiRmlsZSBub3QgZm91bmQ6XG4iICsgbmFtZSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9CQotCQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JfQotCi0Jdm9pZCBtZW51Rm9udCgpIHsKLQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coc2hlbGwpOwotCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCkpOwotCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCQkJdGV4dC5zZXRGb250KGZvbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51Rm9yZWdyb3VuZENvbG9yKCkgewotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQih0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKSk7Ci0JCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUJhY2tncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IodGV4dC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVQcmludCgpIHsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVByaW50ZXJEYXRhIGRhdGEgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChkYXRhLnByaW50VG9GaWxlKSB7Ci0JCQlkYXRhLmZpbGVOYW1lID0gInByaW50Lm91dCI7IC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIGFzayB0aGUgdXNlciBmb3IgYSBmaWxlbmFtZQotCQl9Ci0JCQotCQkvKiBHZXQgdGhlIHRleHQgdG8gcHJpbnQgZnJvbSB0aGUgVGV4dCB3aWRnZXQgKHlvdSBjb3VsZCBnZXQgaXQgZnJvbSBhbnl3aGVyZSwgaS5lLiB5b3VyIGphdmEgbW9kZWwpICovCi0JCXRleHRUb1ByaW50ID0gdGV4dC5nZXRUZXh0KCk7Ci0KLQkJLyogR2V0IHRoZSBmb250ICYgZm9yZWdyb3VuZCAmIGJhY2tncm91bmQgZGF0YS4gKi8KLQkJcHJpbnRlckZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJcHJpbnRlckZvcmVncm91bmQgPSB0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJcHJpbnRlckJhY2tncm91bmQgPSB0ZXh0LmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJCi0JCS8qIERvIHRoZSBwcmludGluZyBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHNvIHRoYXQgc3Bvb2xpbmcgZG9lcyBub3QgZnJlZXplIHRoZSBVSS4gKi8KLQkJcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQlUaHJlYWQgcHJpbnRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCJQcmludGluZyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcmludChwcmludGVyKTsKLQkJCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJcHJpbnRpbmdUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0Jdm9pZCBwcmludChQcmludGVyIHByaW50ZXIpIHsKLQkJaWYgKHByaW50ZXIuc3RhcnRKb2IoIlRleHQiKSkgeyAgIC8vIHRoZSBzdHJpbmcgaXMgdGhlIGpvYiBuYW1lIC0gc2hvd3MgdXAgaW4gdGhlIHByaW50ZXIncyBqb2IgbGlzdAotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCQlyaWdodE1hcmdpbiA9IGNsaWVudEFyZWEud2lkdGggLSBkcGkueCArIHRyaW0ueCArIHRyaW0ud2lkdGg7IC8vIG9uZSBpbmNoIGZyb20gcmlnaHQgc2lkZSBvZiBwYXBlcgotCQkJdG9wTWFyZ2luID0gZHBpLnkgKyB0cmltLnk7IC8vIG9uZSBpbmNoIGZyb20gdG9wIGVkZ2Ugb2YgcGFwZXIKLQkJCWJvdHRvbU1hcmdpbiA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gZHBpLnkgKyB0cmltLnkgKyB0cmltLmhlaWdodDsgLy8gb25lIGluY2ggZnJvbSBib3R0b20gZWRnZSBvZiBwYXBlcgotCQkJCi0JCQkvKiBDcmVhdGUgYSBidWZmZXIgZm9yIGNvbXB1dGluZyB0YWIgd2lkdGguICovCi0JCQlpbnQgdGFiU2l6ZSA9IDQ7IC8vIGlzIHRhYiB3aWR0aCBhIHVzZXIgc2V0dGluZyBpbiB5b3VyIFVJPwotCQkJU3RyaW5nQnVmZmVyIHRhYkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYlNpemU7IGkrKykgdGFiQnVmZmVyLmFwcGVuZCgnICcpOwotCQkJdGFicyA9IHRhYkJ1ZmZlci50b1N0cmluZygpOwotCi0JCQkvKiBDcmVhdGUgcHJpbnRlciBHQywgYW5kIGNyZWF0ZSBhbmQgc2V0IHRoZSBwcmludGVyIGZvbnQgJiBmb3JlZ3JvdW5kIGNvbG9yLiAqLwotCQkJZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCQlGb250IHByaW50ZXJGb250ID0gbmV3IEZvbnQocHJpbnRlciwgcHJpbnRlckZvbnREYXRhKTsKLQkJCUNvbG9yIHByaW50ZXJGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcHJpbnRlckZvcmVncm91bmQpOwotCQkJQ29sb3IgcHJpbnRlckJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihwcmludGVyLCBwcmludGVyQmFja2dyb3VuZCk7IAotCQkJCi0JCQlnYy5zZXRGb250KHByaW50ZXJGb250KTsKLQkJCWdjLnNldEZvcmVncm91bmQocHJpbnRlckZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IpOwotCQkJdGFiV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQodGFicykueDsKLQkJCWxpbmVIZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQkKLQkJCS8qIFByaW50IHRleHQgdG8gY3VycmVudCBnYyB1c2luZyB3b3JkIHdyYXAgKi8KLQkJCXByaW50VGV4dCgpOwotCQkJcHJpbnRlci5lbmRKb2IoKTsKLQotCQkJLyogQ2xlYW51cCBncmFwaGljcyByZXNvdXJjZXMgdXNlZCBpbiBwcmludGluZyAqLwotCQkJcHJpbnRlckZvbnQuZGlzcG9zZSgpOwotCQkJcHJpbnRlckZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlwcmludGVyQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIHByaW50VGV4dCgpIHsKLQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJd29yZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJeCA9IGxlZnRNYXJnaW47Ci0JCXkgPSB0b3BNYXJnaW47Ci0JCWluZGV4ID0gMDsKLQkJZW5kID0gdGV4dFRvUHJpbnQubGVuZ3RoKCk7Ci0JCXdoaWxlIChpbmRleCA8IGVuZCkgewotCQkJY2hhciBjID0gdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoYyAhPSAwKSB7Ci0JCQkJaWYgKGMgPT0gMHgwYSB8fCBjID09IDB4MGQpIHsKLQkJCQkJaWYgKGMgPT0gMHgwZCAmJiBpbmRleCA8IGVuZCAmJiB0ZXh0VG9QcmludC5jaGFyQXQoaW5kZXgpID09IDB4MGEpIHsKLQkJCQkJCWluZGV4Kys7IC8vIGlmIHRoaXMgaXMgY3ItbGYsIHNraXAgdGhlIGxmCi0JCQkJCX0KLQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCW5ld2xpbmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYyAhPSAnXHQnKSB7Ci0JCQkJCQl3b3JkQnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCQlpZiAoYyA9PSAnXHQnKSB7Ci0JCQkJCQkJeCArPSB0YWJXaWR0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoeSArIGxpbmVIZWlnaHQgPD0gYm90dG9tTWFyZ2luKSB7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcHJpbnRXb3JkQnVmZmVyKCkgewotCQlpZiAod29yZEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyB3b3JkID0gd29yZEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IHdvcmRXaWR0aCA9IGdjLnN0cmluZ0V4dGVudCh3b3JkKS54OwotCQkJaWYgKHggKyB3b3JkV2lkdGggPiByaWdodE1hcmdpbikgewotCQkJCS8qIHdvcmQgZG9lc24ndCBmaXQgb24gY3VycmVudCBsaW5lLCBzbyB3cmFwICovCi0JCQkJbmV3bGluZSgpOwotCQkJfQotCQkJZ2MuZHJhd1N0cmluZyh3b3JkLCB4LCB5LCBmYWxzZSk7Ci0JCQl4ICs9IHdvcmRXaWR0aDsKLQkJCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld2xpbmUoKSB7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ICs9IGxpbmVIZWlnaHQ7Ci0JCWlmICh5ICsgbGluZUhlaWdodCA+IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCQlpZiAoaW5kZXggKyAxIDwgZW5kKSB7Ci0JCQkJeSA9IHRvcE1hcmdpbjsKLQkJCQlwcmludGVyLnN0YXJ0UGFnZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4MTlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBub24tcmVjdGFuZ3VsYXIgd2luZG93Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzQgewotCi1zdGF0aWMgaW50W10gY2lyY2xlKGludCByLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKLQlpbnRbXSBwb2x5Z29uID0gbmV3IGludFs4ICogciArIDRdOwotCS8veF4yICsgeV4yID0gcl4yCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyICogciArIDE7IGkrKykgewotCQlpbnQgeCA9IGkgLSByOwotCQlpbnQgeSA9IChpbnQpTWF0aC5zcXJ0KHIqciAtIHgqeCk7Ci0JCXBvbHlnb25bMippXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDJdID0gb2Zmc2V0WCArIHg7Ci0JCXBvbHlnb25bOCpyIC0gMippIC0gMV0gPSBvZmZzZXRZIC0geTsKLQl9Ci0JcmV0dXJuIHBvbHlnb247Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gdGhhdCBsb29rcyBsaWtlIGEga2V5IGhvbGUKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCXJlZ2lvbi5hZGQoY2lyY2xlKDY3LCA2NywgNjcpKTsKLQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA2NywgNTApKTsKLQlyZWdpb24uc3VidHJhY3QobmV3IGludFtdezY3LCA1MCwgNTUsIDEwNSwgNzksIDEwNX0pOwotCS8vZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgc2hlbGwgdXNpbmcgc2V0UmVnaW9uCi0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JUmVjdGFuZ2xlIHNpemUgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBtb3ZlIHNoZWxsIGFyb3VuZAotCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCVBvaW50IG9yaWdpbjsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCW9yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9yaWdpbiA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIGUueCwgZS55KTsKLQkJCQkJCXNoZWxsLnNldExvY2F0aW9uKHAueCAtIG9yaWdpbi54LCBwLnkgLSBvcmlnaW4ueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLQkvL2FkZCBhYmlsaXR5IHRvIGNsb3NlIHNoZWxsCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7Ci0JYi5zZXRUZXh0KCJjbG9zZSIpOwotCWIucGFjaygpOwotCWIuc2V0TG9jYXRpb24oMTAsIDY4KTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGY3MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBTd2luZy9BV1QgaW4gU1dUCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNSB7Ci0KLQlzdGF0aWMgY2xhc3MgRmlsZVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewkJCi0JCUZpbGVbXSBmaWxlczsgICAgICAgIAotCQlTdHJpbmdbXSBjb2x1bW5zTmFtZSA9IHsiTmFtZSIsICJTaXplIiwgIkRhdGUgTW9kaWZpZWQifTsKLQkJCi0JCXB1YmxpYyBGaWxlVGFibGVNb2RlbCAoRmlsZVtdIGZpbGVzKSB7Ci0JCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCAoKSB7Ci0JCQlyZXR1cm4gY29sdW1uc05hbWUubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyAoaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gTG9uZy5jbGFzczsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQgKCkgewotCQkJcmV0dXJuIGZpbGVzID09IG51bGwgPyAwIDogZmlsZXMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdCAoaW50IHJvdywgaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAwKSByZXR1cm4gZmlsZXNbcm93XS5nZXROYW1lKCk7Ci0JCQlpZiAoY29sID09IDEpIHJldHVybiBuZXcgTG9uZyhmaWxlc1tyb3ddLmxlbmd0aCgpKTsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIG5ldyBEYXRlKGZpbGVzW3Jvd10ubGFzdE1vZGlmaWVkKCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSAoaW50IGNvbCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lW2NvbF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJTV1QgYW5kIFN3aW5nL0FXVCBFeGFtcGxlIik7Ci0KLQkJTGlzdGVuZXIgZXhpdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCQkJZGlhbG9nLnNldFRleHQoIlF1ZXN0aW9uIik7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoIkV4aXQ/Iik7Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpIGUuZG9pdCA9IGZhbHNlOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFNXVC5PSykgcmV0dXJuOwotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsJCi0JCUxpc3RlbmVyIGFib3V0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmluYWwgU2hlbGwgcyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlzLnNldFRleHQoIkFib3V0Iik7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJCQlzLnNldExheW91dChsYXlvdXQpOwotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHMsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJTV1QgYW5kIEFXVCBFeGFtcGxlLiIpOwotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHMsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXMucGFjaygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcy5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeCA9IHBhcmVudEJvdW5kcy54ICsgKHBhcmVudEJvdW5kcy53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJCWludCB5ID0gcGFyZW50Qm91bmRzLnkgKyAocGFyZW50Qm91bmRzLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCQlzLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCXMub3BlbigpOwotCQkJCXdoaWxlICghcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1iLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVJdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlNZW51SXRlbSBleGl0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlleGl0SXRlbS5zZXRUZXh0KCImRXhpdFx0Q3RybCtYIik7Ci0JCWV4aXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ1gnKTsKLQkJZXhpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJTWVudUl0ZW0gYWJvdXRJdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWFib3V0SXRlbS5zZXRUZXh0KCImQWJvdXRcdEN0cmwrQSIpOwotCQlhYm91dEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNPTlRST0wgKyAnQScpOwotCQlhYm91dEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0JCVJHQiBjb2xvciA9IHNoZWxsLmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJTGFiZWwgc2VwYXJhdG9yMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbG9jYXRpb25MYiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxiLnNldFRleHQoIkxvY2F0aW9uOiIpOwotCQlDb21wb3NpdGUgbG9jYXRpb25Db21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQkJVG9vbEl0ZW0gZXhpdFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJZXhpdFRvb2xJdGVtLnNldFRleHQoIiZFeGl0Iik7Ci0JCWV4aXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBleGl0TGlzdGVuZXIpOwotCQlUb29sSXRlbSBhYm91dFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJYWJvdXRUb29sSXRlbS5zZXRUZXh0KCImQWJvdXQiKTsKLQkJYWJvdXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBhYm91dExpc3RlbmVyKTsKLQkJTGFiZWwgc2VwYXJhdG9yMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFRyZWUgZmlsZVRyZWUgPSBuZXcgVHJlZShjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVNhc2ggc2FzaCA9IG5ldyBTYXNoKGNvbXAsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5FTUJFRERFRCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdGF0dXNDb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBsb2NhdGlvbkZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUobG9jYXRpb25Db21wKTsKLQkJZmluYWwgamF2YS5hd3QuVGV4dEZpZWxkIGxvY2F0aW9uVGV4dCA9IG5ldyBqYXZhLmF3dC5UZXh0RmllbGQoKTsKLQkJbG9jYXRpb25GcmFtZS5hZGQobG9jYXRpb25UZXh0KTsKLQotCQlqYXZhLmF3dC5GcmFtZSBmaWxlVGFibGVGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHRhYmxlQ29tcCk7Ci0JCWphdmEuYXd0LlBhbmVsIHBhbmVsID0gbmV3IGphdmEuYXd0LlBhbmVsKG5ldyBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQoKSk7Ci0JCWZpbGVUYWJsZUZyYW1lLmFkZChwYW5lbCk7Ci0JCWZpbmFsIEpUYWJsZSBmaWxlVGFibGUgPSBuZXcgSlRhYmxlKG5ldyBGaWxlVGFibGVNb2RlbChudWxsKSk7Ci0JCWZpbGVUYWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJZmlsZVRhYmxlLnNldFNob3dHcmlkKGZhbHNlKTsKLQkJZmlsZVRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUoZmlsZVRhYmxlKTsKLQkJcGFuZWwuYWRkKHNjcm9sbFBhbmUpOwotCi0JCWphdmEuYXd0LkZyYW1lIHN0YXR1c0ZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoc3RhdHVzQ29tcCk7Ci0JCXN0YXR1c0ZyYW1lLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKLQkJZmluYWwgamF2YS5hd3QuTGFiZWwgc3RhdHVzTGFiZWwgPSBuZXcgamF2YS5hd3QuTGFiZWwoKTsKLQkJc3RhdHVzRnJhbWUuYWRkKHN0YXR1c0xhYmVsKTsKLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiU2VsZWN0IGEgZmlsZSIpOwotCi0JCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuRFJBRykgcmV0dXJuOwotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpZmlsZVRyZWUuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCVJlY3RhbmdsZSB0cmltID0gZmlsZVRyZWUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSBlLnggLSB0cmltLndpZHRoOwotCQkJCWNvbXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUZpbGVbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0oZmlsZVRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl0cmVlSXRlbS5zZXREYXRhKGZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JCX0KLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxKSB7Ci0JCQkJCVRyZWVJdGVtIGZpcnN0SXRlbSA9IGl0ZW0uZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGZpcnN0SXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCQlmaXJzdEl0ZW0uZGlzcG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlmaW5hbCBGaWxlIHJvb3QgPSAoRmlsZSlpdGVtLmdldERhdGEoKTsKLQkJCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KHJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJZmlsZVRhYmxlLnNldE1vZGVsKG5ldyBGaWxlVGFibGVNb2RlbChyb290Lmxpc3RGaWxlcygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlsb2NhdGlvbkxiLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGxvY2F0aW9uVGV4dC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlsb2NhdGlvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLmhlaWdodEhpbnQgPSBzdGF0dXNMYWJlbC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlzdGF0dXNDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsJCQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWZpbGVUcmVlLnNldExheW91dERhdGEoZGF0YSk7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGVDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTUwYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCBmcm9tIG1lbW9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlTdHJpbmcgaHRtbCA9ICI8SFRNTD48SEVBRD48VElUTEU+SFRNTCBUZXN0PC9USVRMRT48L0hFQUQ+PEJPRFk+IjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgaHRtbCArPSAiPFA+VGhpcyBpcyBsaW5lICIraSsiPC9QPiI7Ci0JCWh0bWwgKz0gIjwvQk9EWT48L0hUTUw+IjsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjZjc0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHJlbmRlciBIVE1MIHRoYXQgaW5jbHVkZXMgcmVsYXRpdmUgbGlua3MgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JLyogUmVsYXRpdmUgbGlua3M6IHVzZSB0aGUgSFRNTCBiYXNlIHRhZyAqLwotCVN0cmluZyBodG1sID0gIjxodG1sPjxoZWFkPiIrCi0JCSI8YmFzZSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvXCIgPiIrCi0JCSI8dGl0bGU+SFRNTCBUZXN0PC90aXRsZT48L2hlYWQ+IisKLQkJIjxib2R5PjxhIGhyZWY9XCJmYXEucGhwXCI+bG9jYWwgbGluazwvYT48L2JvZHk+PC9odG1sPiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjODQyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogc2V0IGljb25zIHdpdGggZGlmZmVyZW50IHJlc29sdXRpb25zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCUltYWdlIHNtYWxsID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JCUdDIGdjID0gbmV3IEdDKHNtYWxsKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbEFyYygwLCAwLCAxNiwgMTYsIDQ1LCAyNzApOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlJbWFnZSBsYXJnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpOwotCQlnYyA9IG5ldyBHQyhsYXJnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMzIsIDMyLCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJLyogUHJvdmlkZSBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgZm9yIGljb25zIHRvIGdldAotCQkgKiBoaWdoIHF1YWxpdHkgcmVuZGVyaW5nIHdoZXJldmVyIHRoZSBPUyBuZWVkcyAKLQkJICogbGFyZ2UgaWNvbnMuIEZvciBleGFtcGxlLCB0aGUgQUxUK1RBQiB3aW5kb3cgCi0JCSAqIG9uIGNlcnRhaW4gc3lzdGVtcyB1c2VzIGEgbGFyZ2VyIGljb24uCi0JCSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU21hbGwgYW5kIExhcmdlIGljb25zIik7Ci0JCXNoZWxsLnNldEltYWdlcyhuZXcgSW1hZ2VbXSB7c21hbGwsIGxhcmdlfSk7Ci0KLQkJLyogTm8gbGFyZ2UgaWNvbjogdGhlIE9TIHdpbGwgc2NhbGUgdXAgdGhlCi0JCSAqIHNtYWxsIGljb24gd2hlbiBpdCBuZWVkcyBhIGxhcmdlIG9uZS4KLQkJICovCi0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldFRleHQoIlNtYWxsIGljb24iKTsKLQkJc2hlbGwyLnNldEltYWdlKHNtYWxsKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwyLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJc21hbGwuZGlzcG9zZSgpOwotCQlsYXJnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0OWZhZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUaGlzIHNuaXBwZXQgd2FzIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXMgaW4gCi0gKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmRyYXcyZC8/Y3Zzcm9vdD1Ub29sc19Qcm9qZWN0Ci0gKiBieSBQcmF0aWsgU2hhaC4KLSAqCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHJvdGF0ZSBhbmQgZmxpcCBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzkgewkKLQotc3RhdGljIEltYWdlRGF0YSByb3RhdGUoSW1hZ2VEYXRhIHNyY0RhdGEsIGludCBkaXJlY3Rpb24pIHsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IHNyY0RhdGEuYnl0ZXNQZXJMaW5lIC8gc3JjRGF0YS53aWR0aDsKLQlpbnQgZGVzdEJ5dGVzUGVyTGluZSA9IChkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbCA6IHNyY0RhdGEuaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlWyhkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLmhlaWdodCAqIGRlc3RCeXRlc1BlckxpbmUgOiBzcmNEYXRhLndpZHRoICogZGVzdEJ5dGVzUGVyTGluZV07Ci0JaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pewotCQkJCWNhc2UgU1dULkxFRlQ6IC8vIGxlZnQgOTAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY1k7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUklHSFQ6IC8vIHJpZ2h0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQlkZXN0WSA9IHNyY1g7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS5oZWlnaHQ7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEud2lkdGg7IAotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ET1dOOiAvLyAxODAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEud2lkdGg7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEuaGVpZ2h0OyAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBzcmNEYXRhLmRlcHRoLCBzcmNEYXRhLnBhbGV0dGUsIHNyY0RhdGEuc2NhbmxpbmVQYWQsIG5ld0RhdGEpOwotfQotc3RhdGljIEltYWdlRGF0YSBmbGlwKEltYWdlRGF0YSBzcmNEYXRhLCBib29sZWFuIHZlcnRpY2FsKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW3NyY0RhdGEuZGF0YS5sZW5ndGhdOwotCWZvciAoaW50IHNyY1kgPSAwOyBzcmNZIDwgc3JjRGF0YS5oZWlnaHQ7IHNyY1krKykgewotCQlmb3IgKGludCBzcmNYID0gMDsgc3JjWCA8IHNyY0RhdGEud2lkdGg7IHNyY1grKykgewotCQkJaW50IGRlc3RYID0gMCwgZGVzdFkgPSAwLCBkZXN0SW5kZXggPSAwLCBzcmNJbmRleCA9IDA7Ci0JCQlpZiAodmVydGljYWwpewotCQkJCWRlc3RYID0gc3JjWDsKLQkJCQlkZXN0WSA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3RYID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCWRlc3RZID0gc3JjWTsgCi0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YShzcmNEYXRhLndpZHRoLCBzcmNEYXRhLmhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBzcmNEYXRhLnNjYW5saW5lUGFkLCBuZXdEYXRhKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGhlIHdvcmQgImhlbGxvIiBvbiBpdAotCWZpbmFsIEltYWdlIGltYWdlMCA9IG5ldyBJbWFnZShkaXNwbGF5LCA1MCwgMzApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlMC5nZXRCb3VuZHMoKSk7Ci0JZ2MuZHJhd1N0cmluZygiaGVsbG8iLAk1LCA1LCB0cnVlKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZTAuZ2V0SW1hZ2VEYXRhKCk7Ci0JLy8gcm90YXRlIGFuZCBmbGlwIHRoaXMgaW1hZ2UKLQlmaW5hbCBJbWFnZSBpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5MRUZUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UyID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuUklHSFQpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTMgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5ET1dOKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2U0ID0gbmV3IEltYWdlKGRpc3BsYXksIGZsaXAoZGF0YSwgdHJ1ZSkpOwotCWZpbmFsIEltYWdlIGltYWdlNSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIGZhbHNlKSk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkvLyBkcmF3IHRoZSByZXN1bHRzIG9uIHRoZSBzaGVsbAotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3VGV4dCgiT3JpZ2luYWwgSW1hZ2U6IiwgMTAsIDEwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMCwgMTAsIDQwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkxlZnQsIFJpZ2h0LCAxODA6IiwgMTAsIDgwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMSwgMTAsIDExMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTIsIDUwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UzLCA5MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkZsaXBwZWQgVmVydGljYWwsIEhvcml6b250YWw6IiwgMTAsIDE3MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTQsIDEwLCAyMDApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U1LCA3MCwgMjAwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlMC5kaXNwb3NlKCk7Ci0JaW1hZ2UxLmRpc3Bvc2UoKTsKLQlpbWFnZTIuZGlzcG9zZSgpOwotCWltYWdlMy5kaXNwb3NlKCk7Ci0JaW1hZ2U0LmRpc3Bvc2UoKTsKLQlpbWFnZTUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzZiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBlbnRlciwgZXhpdCBhbmQgaG92ZXIgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVOVEVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVYSVQiKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkhPVkVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2U4Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBkcm9wLWRvd24gYSBjaGV2cm9uIG1lbnUgY29udGFpbmluZyBoaWRkZW4gdG9vbCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQwIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgQ29vbEJhciBjb29sQmFyOwotCXN0YXRpYyBNZW51IGNoZXZyb25NZW51ID0gbnVsbDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQljb29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUIHwgU1dULldSQVApOwotCWludCBtaW5XaWR0aCA9IDA7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJaW50IHdpZHRoID0gMDsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQiIgKyBqKTsKLQkJd2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCS8qIGZpbmQgdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgdG9vbCAqLwotCQlpZiAod2lkdGggPiBtaW5XaWR0aCkgbWluV2lkdGggPSB3aWR0aDsKLQl9Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShtaW5XaWR0aCwgY29vbFNpemUueSk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCUNvb2xJdGVtIGl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpIGl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCQlUb29sSXRlbVtdIHRvb2xzID0gYmFyLmdldEl0ZW1zICgpOwotCQkJCQotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHRvb2xzLmxlbmd0aCkgewotCQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQkJcHQgPSBiYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJCQkKLQkJCQkJLyogRmlndXJlIG91dCB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB0b29sIGJ5IGxvb2tpbmcgYXQgdGhlCi0JCQkJCSAqIGludGVyc2VjdGlvbiBvZiB0aGUgdG9vbCBib3VuZHMgd2l0aCB0aGUgY29vbCBpdGVtIGJvdW5kcy4gKi8KLQkJCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkJICAJCQotCQkJCQkvKiBJZiB0aGUgdG9vbCBpcyBub3QgY29tcGxldGVseSB3aXRoaW4gdGhlIGNvb2wgaXRlbSBib3VuZHMsIHRoZW4gaXQKLQkJCQkJICogaXMgcGFydGlhbGx5IGhpZGRlbiwgYW5kIGFsbCByZW1haW5pbmcgdG9vbHMgYXJlIGNvbXBsZXRlbHkgaGlkZGVuLiAqLwotCQkJICAJCWlmICghaW50ZXJzZWN0aW9uLmVxdWFscyAodG9vbEJvdW5kcykpIGJyZWFrOwotCQkJICAJCWkrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogQ3JlYXRlIGEgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBjb21wbGV0ZWx5IGhpZGRlbiBidXR0b25zLiAqLwotCQkJCWlmIChjaGV2cm9uTWVudSAhPSBudWxsKSBjaGV2cm9uTWVudS5kaXNwb3NlKCk7Ci0JCQkJY2hldnJvbk1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29scy5sZW5ndGg7IGorKykgewotCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAoY2hldnJvbk1lbnUsIFNXVC5QVVNIKTsKLQkJCQkJbWVudUl0ZW0uc2V0VGV4dCAodG9vbHNbal0uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogRHJvcCBkb3duIHRoZSBtZW51IGJlbG93IHRoZSBjaGV2cm9uLCB3aXRoIHRoZSBsZWZ0IGVkZ2VzIGFsaWduZWQuICovCi0JCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCWNoZXZyb25NZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQljaGV2cm9uTWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMWU2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBhbmltYXRlZCBHSUYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDEgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBHQyBzaGVsbEdDOwotCXN0YXRpYyBDb2xvciBzaGVsbEJhY2tncm91bmQ7Ci0Jc3RhdGljIEltYWdlTG9hZGVyIGxvYWRlcjsKLQlzdGF0aWMgSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7Ci0Jc3RhdGljIFRocmVhZCBhbmltYXRlVGhyZWFkOwotCXN0YXRpYyBJbWFnZSBpbWFnZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VHSUZCYWNrZ3JvdW5kID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsR0MgPSBuZXcgR0Moc2hlbGwpOwotCQlzaGVsbEJhY2tncm91bmQgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouZ2lmIn0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQl0cnkgewotCQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCWFuaW1hdGVUaHJlYWQgPSBuZXcgVGhyZWFkKCJBbmltYXRpb24iKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLyogQ3JlYXRlIGFuIG9mZi1zY3JlZW4gaW1hZ2UgdG8gZHJhdyBvbiwgYW5kIGZpbGwgaXQgd2l0aCB0aGUgc2hlbGwgYmFja2dyb3VuZC4gKi8KLQkJCQkJCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKDAsIDAsIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCQkJCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLyogQ3JlYXRlIHRoZSBmaXJzdCBpbWFnZSBhbmQgZHJhdyBpdCBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZS4gKi8KLQkJCQkJCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsJCi0JCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJCQkJCQkvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBpbWFnZXMsIGNyZWF0aW5nIGFuZCBkcmF3aW5nIGVhY2ggb25lCi0JCQkJCQkJCSAqIG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlIGJlZm9yZSBkcmF3aW5nIGl0IG9uIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJaW50IHJlcGVhdENvdW50ID0gbG9hZGVyLnJlcGVhdENvdW50OwotCQkJCQkJCQl3aGlsZSAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EOgotCQkJCQkJCQkJCS8qIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCQkJCQlpZiAodXNlR0lGQmFja2dyb3VuZCAmJiBsb2FkZXIuYmFja2dyb3VuZFBpeGVsICE9IC0xKSB7Ci0JCQkJCQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNXVC5ETV9GSUxMX1BSRVZJT1VTOgotCQkJCQkJCQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGltYWdlIGJlZm9yZSBkcmF3aW5nLiAqLwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCQkJCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQkJCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBEcmF3IHRoZSBvZmYtc2NyZWVuIGltYWdlIHRvIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJCXNoZWxsR0MuZHJhd0ltYWdlKG9mZlNjcmVlbkltYWdlLCAwLCAwKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSAoYWRkaW5nIGNvbW1vbmx5LXVzZWQgc2xvdy1kb3duIGZ1ZGdlIGZhY3RvcnMpLiAqLwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpbnQgbXMgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCQkJCQkJCQkJaWYgKG1zIDwgMjApIG1zICs9IDMwOwotCQkJCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UsIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50IGFuZCBzdGFydCBhZ2Fpbi4gKi8KLQkJCQkJCQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSBpbWFnZURhdGFBcnJheS5sZW5ndGggLSAxKSByZXBlYXRDb3VudC0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGFuaW1hdGluZyB0aGUgR0lGIik7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlICE9IG51bGwgJiYgIW9mZlNjcmVlbkltYWdlLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2VHQyAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZUdDLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2VHQy5kaXNwb3NlKCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWFuaW1hdGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgR0lGIik7Ci0JCQl9Ci0JCX0KLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmMTRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IG1vdXNlIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsU1dULk5PTkUpOwotCWJ1dHRvbi5zZXRTaXplKDEwMCwxMDApOwotCWJ1dHRvbi5zZXRUZXh0KCJDbGljayIpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIERvd24gKGJ1dHRvbjogIiArIGUuYnV0dG9uICsgIiB4OiAiICsgZS54ICsgIiB5OiAiICsgZS55ICsgIikiKTsKLQkJfQotCX0pOwotCWZpbmFsIFBvaW50IHB0ID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIDUwLCA1MCk7Ci0JbmV3IFRocmVhZCgpewotCQlFdmVudCBldmVudDsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLQkJCWV2ZW50LnggPSBwdC54OwotCQkJZXZlbnQueSA9IHB0Lnk7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGE5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVHJheSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFuIGljb24gd2l0aCBhIHBvcHVwIG1lbnUgb24gdGhlIHN5c3RlbSB0cmF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCWZpbmFsIFRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSAoKTsKLQlpZiAodHJheSA9PSBudWxsKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRoZSBzeXN0ZW0gdHJheSBpcyBub3QgYXZhaWxhYmxlIik7Ci0JfSBlbHNlIHsKLQkJZmluYWwgVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSAodHJheSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QgVHJheUl0ZW0iKTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3ciKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5IaWRlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJoaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0IHNlbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQltaS5zZXRUZXh0ICgiSXRlbSIgKyBpKTsKLQkJCW1pLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiAiICsgZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChpID09IDApIG1lbnUuc2V0RGVmYXVsdEl0ZW0obWkpOwotCQl9Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0Jc2hlbGwuc2V0Qm91bmRzKDUwLCA1MCwgMzAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5NjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ0IHsKLQotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaW5kZXgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtLmdldFRleHQgKCkpOwotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNjUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgaW50ZXJuYXRpb25hbGl6ZWQgc3R5bGVkIHRleHQgb24gYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQkKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIk1TIE1pbmNobyIsIDIwLCBTV1QuSVRBTElDKTsKLQkJRm9udCBmb250MyA9IG5ldyBGb250KGRpc3BsYXksICJBcmFiaWMgVHJhbnNwYXJlbnQiLCAxOCwgU1dULk5PUk1BTCk7Ci0JCQotCQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JCQotCQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgeWVsbG93LCBibHVlKTsKLQkJVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGdyZWVuLCBudWxsKTsKLQkJVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGJsdWUsIGdyYXkpOwotCQkKLQkJbGF5b3V0LnNldFRleHQoIkVuZ2xpc2ggXHU2NUU1XHU2NzJDXHU4QTlFICBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2NTFcdTA2MjkiKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMCwgNik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTIsIDgsIDEwKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMTMsIDIxKTsKLQkJCQkJCi0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgMTAsIDEwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJZm9udDMuZGlzcG9zZSgpOwotCQlsYXlvdXQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjI5YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3Qga2V5IGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0U2l6ZSh0ZXh0LmNvbXB1dGVTaXplKDE1MCwgU1dULkRFRkFVTFQpKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW5ldyBUaHJlYWQoKXsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIkxvdmUgdGhlIG1ldGhvZC4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KGkpOwotCQkJCWJvb2xlYW4gc2hpZnQgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpOwotCQkJCWNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLQkJCQlpZiAoc2hpZnQpIHsKLQkJCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCQkJZXZlbnQuY2hhcmFjdGVyID0gY2g7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSBTV1QuU0hJRlQ7Ci0JCQkJCWRpc3BsYXkucG9zdChldmVudCk7CQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI5ZDViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc3RvcCBDUiBmcm9tIGdvaW5nIHRvIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ3ICB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIFNXVC5OT05FKTsKLQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQljb21iby5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21ibyBkZWZhdWx0IHNlbGVjdGVkIChvdmVycmlkZXMgZGVmYXVsdCBidXR0b24pIik7Ci0JCX0KLQl9KTsKLQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTVjMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogY2hlY2sgaWYgdGhlIGJyb3dzZXIgaXMgYXZhaWxhYmxlIG9yIG5vdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ4IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQkvKiBUaGUgQnJvd3NlciB3aWRnZXQgdGhyb3dzIGFuIFNXVEVycm9yIGlmIGl0IGZhaWxzIHRvCi0JCQkgKiBpbnN0YW50aWF0ZSBwcm9wZXJseS4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgY2F0Y2gKLQkJCSAqIHRoaXMgU1dURXJyb3IgYW5kIGRpc2FibGUgYW55IGZlYXR1cmUgcmVxdWlyaW5nIHRoZQotCQkJICogQnJvd3NlciB3aWRnZXQuCi0JCQkgKiBQbGF0Zm9ybSByZXF1aXJlbWVudHMgZm9yIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgYXJlIGF2YWlsYWJsZQotCQkJICogZnJvbSB0aGUgU1dUIEZBUSB3ZWJzaXRlLiAKLQkJCSAqLwotCQl9Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCS8qIFRoZSBCcm93c2VyIHdpZGdldCBjYW4gYmUgdXNlZCAqLwotCQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJfQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzYzMTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBwcm9ncmVzcyBiYXIgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JCXRhYmxlLmdldENvbHVtbiAoMCkuc2V0VGV4dCAoIlRhc2siKTsKLQkJdGFibGUuZ2V0Q29sdW1uICgxKS5zZXRUZXh0ICgiUHJvZ3Jlc3MiKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIlRhc2sgIiArIGkpOwotCQkJaWYgKCBpICUgNSA9PSAwKSB7Ci0JCQkJUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWJhci5zZXRTZWxlY3Rpb24gKGkpOwotCQkJCVRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQkJCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkJCWVkaXRvci5zZXRFZGl0b3IgKGJhciwgaXRlbSwgMSk7Ci0JCQl9Ci0JCX0KLQkJdGFibGUuZ2V0Q29sdW1uICgwKS5wYWNrICgpOwotCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnNldFdpZHRoICgxMjgpOwotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZWRjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWlJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMCkgLSIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gakl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGlJdGVtLCAwKTsKLQkJCWpJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMSkgLSIgKyBqKTsKLQkJCWZvciAoaW50IGs9MDsgazw0OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBrSXRlbSA9IG5ldyBUcmVlSXRlbSAoakl0ZW0sIDApOwotCQkJCWtJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMikgLSIgKyBrKTsKLQkJCQlmb3IgKGludCBsPTA7IGw8NDsgbCsrKSB7Ci0JCQkJCVRyZWVJdGVtIGxJdGVtID0gbmV3IFRyZWVJdGVtIChrSXRlbSwgMCk7Ci0JCQkJCWxJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMykgLSIgKyBsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmMTJmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2xiYXIgKHJlbGF5b3V0IHdoZW4gcmVzaXplZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTAgewotCi1zdGF0aWMgaW50IGl0ZW1Db3VudDsKLXN0YXRpYyBDb29sSXRlbSBjcmVhdGVJdGVtKENvb2xCYXIgY29vbEJhciwgaW50IGNvdW50KSB7Ci0gICAgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1Db3VudCsrICsiIik7Ci0gICAgfQotICAgIHRvb2xCYXIucGFjaygpOwotICAgIFBvaW50IHNpemUgPSB0b29sQmFyLmdldFNpemUoKTsKLSAgICBDb29sSXRlbSBpdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0gICAgUG9pbnQgcHJlZmVycmVkID0gaXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0gICAgaXRlbS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZCk7Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIENvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAzKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDIpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMyk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCA0KTsKLSAgICBpbnQgc3R5bGUgPSBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBzdHlsZSk7Ci0gICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotICAgIHNoZWxsLnNldExheW91dChsYXlvdXQpOwotICAgIEZvcm1EYXRhIGNvb2xEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgY29vbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGNvb2xEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sQmFyLnNldExheW91dERhdGEoY29vbERhdGEpOwotICAgIGNvb2xCYXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgc2hlbGwubGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBGb3JtRGF0YSB0ZXh0RGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIHRleHREYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgdGV4dERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICB0ZXh0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29vbEJhcik7Ci0gICAgdGV4dERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKHRleHREYXRhKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiMmRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSB2aXJ0dWFsIHRhYmxlIGFuZCBhZGQgMTAwMCBlbnRyaWVzIHRvIGl0IGV2ZXJ5IDUwMCBtcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTEgewotCi1zdGF0aWMgaW50W10gZGF0YSA9IG5ldyBpbnRbMF07Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVklSVFVBTCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0gIitkYXRhW2luZGV4XSk7Ci0JCX0KLQl9KTsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCQl3aGlsZSAoY291bnQrKyA8IDUwMCkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkvLyBhZGQgMTAgcmFuZG9tIG51bWJlcnMgdG8gYXJyYXkgYW5kIHNvcnQKLQkJCQlpbnQgZ3JvdyA9IDEwOwotCQkJCWludFtdIG5ld0RhdGEgPSBuZXcgaW50W2RhdGEubGVuZ3RoICsgZ3Jvd107Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCQkJaW50IGluZGV4ID0gZGF0YS5sZW5ndGg7Ci0JCQkJZGF0YSA9IG5ld0RhdGE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBncm93OyBqKyspIHsKLQkJCQkJZGF0YVtpbmRleCsrXSA9IHJhbmRvbS5uZXh0SW50KCk7Ci0JCQkJfQotCQkJCUFycmF5cy5zb3J0KGRhdGEpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQl0YWJsZS5zZXRJdGVtQ291bnQoZGF0YS5sZW5ndGgpOwotCQkJCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDUwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9Ci0JCQl9Ci0JCX0KLQl9OwotCXRocmVhZC5zdGFydCgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkgfHwgdGhyZWFkLmlzQWxpdmUoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTJkNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIGFuIGl0ZW0gaXMgYXJtZWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgTGlzdGVuZXIgYXJtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBzaG93TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSAoTWVudSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQoaXRlbS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBoaWRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBGb3JtRGF0YSBsYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotICAgIE1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLSAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgIE1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBmaWxlSXRlbS5zZXRUZXh0KCJGaWxlIik7Ci0gICAgZmlsZUl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBlZGl0SXRlbS5zZXRUZXh0KCJFZGl0Iik7Ci0gICAgZWRpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgZmlsZUl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0gICAgU3RyaW5nW10gZmlsZVN0cmluZ3MgPSB7ICJOZXciLCAiQ2xvc2UiLCAiRXhpdCIgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGZpbGVTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIE1lbnUgZWRpdE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgU3RyaW5nW10gZWRpdFN0cmluZ3MgPSB7ICJDdXQiLCAiQ29weSIsICJQYXN0ZSIgfTsKLSAgICBlZGl0SXRlbS5zZXRNZW51KGVkaXRNZW51KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGVkaXRTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2ODYyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHN0YXR1cyBsaW5lIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGEgVG9vbEl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUzIHsKLQkKLXN0YXRpYyBTdHJpbmcgc3RhdHVzVGV4dCA9ICIiOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotICAgIGZpbmFsIFRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIGJhci5zZXRCb3VuZHMoMTAsIDEwLCAxNTAsIDUwKTsKLSAgICBmaW5hbCBMYWJlbCBzdGF0dXNMaW5lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBzdGF0dXNMaW5lLnNldEJvdW5kcygxMCwgOTAsIDE1MCwgMzApOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDEiKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAyIik7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMyIpOwotICAgIGJhci5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIFRvb2xJdGVtIGl0ZW0gPSBiYXIuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGl0ZW0uZ2V0VGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdGF0dXNUZXh0LmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpbmUuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0pOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5N2NhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgYSBKVGFibGUgaW4gU1dUIChubyBmbGlja2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5QYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyoKLQkJKiBTZXQgYSBXaW5kb3dzIHNwZWNpZmljIEFXVCBwcm9wZXJ0eSB0aGF0IHByZXZlbnRzIGhlYXZ5d2VpZ2h0Ci0JCSogY29tcG9uZW50cyBmcm9tIGVyYXNpbmcgdGhlaXIgYmFja2dyb3VuZC4gTm90ZSB0aGF0IHRoaXMKLQkJKiBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBhbmQgY2Fubm90IGJlIHNjb3BlZC4gSXQgbWlnaHQgbm90IGJlCi0JCSogc3VpdGFibGUgZm9yIHlvdXIgYXBwbGljYXRpb24uCi0JCSovCi0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoInN1bi5hd3Qubm9lcmFzZWJhY2tncm91bmQiLCJ0cnVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGVycm9yKSB7fQotCi0JCS8qIENyZWF0ZSBhbmQgc2V0dGluZyB1cCBmcmFtZSAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCVBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSkgewotCQkJcHVibGljIHZvaWQgdXBkYXRlKGphdmEuYXd0LkdyYXBoaWNzIGcpIHsKLQkJCQkvKiBEbyBub3QgZXJhc2UgdGhlIGJhY2tncm91bmQgKi8gCi0JCQkJcGFpbnQoZyk7Ci0JCQl9Ci0JCX07Ci0JCWZyYW1lLmFkZChwYW5lbCk7Ci0JCUpSb290UGFuZSByb290ID0gbmV3IEpSb290UGFuZSgpOwotCQlwYW5lbC5hZGQocm9vdCk7Ci0JCWphdmEuYXd0LkNvbnRhaW5lciBjb250ZW50UGFuZSA9IHJvb3QuZ2V0Q29udGVudFBhbmUoKTsKLQotCQkvKiBDcmVhdGluZyBjb21wb25lbnRzICovCi0JCWludCBucm93cyA9IDEwMDAsIG5jb2x1bW5zID0gMTA7Ci0JCVZlY3RvciByb3dzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5yb3dzOyBpKyspIHsKLQkJCVZlY3RvciByb3cgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKLQkJCQlyb3cuYWRkRWxlbWVudCgiSXRlbSAiICsgaSArICItIiArIGopOwotCQkJfQotCQkJcm93cy5hZGRFbGVtZW50KHJvdyk7Ci0JCX0KLQkJVmVjdG9yIGNvbHVtbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbHVtbnM7IGkrKykgewotCQkJY29sdW1ucy5hZGRFbGVtZW50KCJDb2x1bW4gIiArIGkpOwotCQl9Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUocm93cywgY29sdW1ucyk7Ci0JCXRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9PRkYpOwotCQl0YWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRhYmxlKTsKLQkJY29udGVudFBhbmUuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWNvbnRlbnRQYW5lLmFkZChzY3JvbGxQYW5lKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjNkOGVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYW4gWCB1c2luZyBBV1QgR3JhcGhpY3MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5DYW52YXM7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyogRHJhdyBhbiBYIHVzaW5nIEFXVCAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnQgKEdyYXBoaWNzIGcpIHsKLQkJCQlEaW1lbnNpb24gZCA9IGdldFNpemUoKTsKLQkJCQlnLmRyYXdMaW5lKDAsIDAsIGQud2lkdGgsIGQuaGVpZ2h0KTsKLQkJCQlnLmRyYXdMaW5lKGQud2lkdGgsIDAsIDAsIGQuaGVpZ2h0KTsKLQkJCX0KLQkJfTsKLQkJZnJhbWUuYWRkKGNhbnZhcyk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTA5NDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGNvbnZlcnQgYmV0d2VlbiBTV1QgSW1hZ2UgYW5kIEFXVCBCdWZmZXJlZEltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGlyZWN0Q29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbmRleENvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NiB7Ci0JCi1zdGF0aWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG9BV1QoSW1hZ2VEYXRhIGRhdGEpIHsKLQlDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSBudWxsOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBkYXRhLnBhbGV0dGU7Ci0JaWYgKHBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJY29sb3JNb2RlbCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHBhbGV0dGUucmVkTWFzaywgcGFsZXR0ZS5ncmVlbk1hc2ssIHBhbGV0dGUuYmx1ZU1hc2spOwotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCVJHQiByZ2IgPSBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQkJcGl4ZWxBcnJheVswXSA9IHJnYi5yZWQ7Ci0JCQkJcGl4ZWxBcnJheVsxXSA9IHJnYi5ncmVlbjsKLQkJCQlwaXhlbEFycmF5WzJdID0gcmdiLmJsdWU7Ci0JCQkJcmFzdGVyLnNldFBpeGVscyh4LCB5LCAxLCAxLCBwaXhlbEFycmF5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9IGVsc2UgewotCQlSR0JbXSByZ2JzID0gcGFsZXR0ZS5nZXRSR0JzKCk7Ci0JCWJ5dGVbXSByZWQgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBncmVlbiA9IG5ldyBieXRlW3JnYnMubGVuZ3RoXTsKLQkJYnl0ZVtdIGJsdWUgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmdicy5sZW5ndGg7IGkrKykgewotCQkJUkdCIHJnYiA9IHJnYnNbaV07Ci0JCQlyZWRbaV0gPSAoYnl0ZSlyZ2IucmVkOwotCQkJZ3JlZW5baV0gPSAoYnl0ZSlyZ2IuZ3JlZW47Ci0JCQlibHVlW2ldID0gKGJ5dGUpcmdiLmJsdWU7Ci0JCX0KLQkJaWYgKGRhdGEudHJhbnNwYXJlbnRQaXhlbCAhPSAtMSkgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUsIGRhdGEudHJhbnNwYXJlbnRQaXhlbCk7Ci0JCX0gZWxzZSB7Ci0JCQljb2xvck1vZGVsID0gbmV3IEluZGV4Q29sb3JNb2RlbChkYXRhLmRlcHRoLCByZ2JzLmxlbmd0aCwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCX0JCQotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCXBpeGVsQXJyYXlbMF0gPSBwaXhlbDsKLQkJCQlyYXN0ZXIuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNvbnZlcnRUb1NXVChCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UpIHsKLQlpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBEaXJlY3RDb2xvck1vZGVsKSB7Ci0JCURpcmVjdENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChEaXJlY3RDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKGNvbG9yTW9kZWwuZ2V0UmVkTWFzaygpLCBjb2xvck1vZGVsLmdldEdyZWVuTWFzaygpLCBjb2xvck1vZGVsLmdldEJsdWVNYXNrKCkpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKHBpeGVsQXJyYXlbMF0sIHBpeGVsQXJyYXlbMV0sIHBpeGVsQXJyYXlbMl0pKTsKLQkJCQlkYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBkYXRhOwkJCi0JfSBlbHNlIGlmIChidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbCkgewotCQlJbmRleENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChJbmRleENvbG9yTW9kZWwpYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCk7Ci0JCWludCBzaXplID0gY29sb3JNb2RlbC5nZXRNYXBTaXplKCk7Ci0JCWJ5dGVbXSByZWRzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBncmVlbnMgPSBuZXcgYnl0ZVtzaXplXTsKLQkJYnl0ZVtdIGJsdWVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWNvbG9yTW9kZWwuZ2V0UmVkcyhyZWRzKTsKLQkJY29sb3JNb2RlbC5nZXRHcmVlbnMoZ3JlZW5zKTsKLQkJY29sb3JNb2RlbC5nZXRCbHVlcyhibHVlcyk7Ci0JCVJHQltdIHJnYnMgPSBuZXcgUkdCW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCXJnYnNbaV0gPSBuZXcgUkdCKHJlZHNbaV0gJiAweEZGLCBncmVlbnNbaV0gJiAweEZGLCBibHVlc1tpXSAmIDB4RkYpOwotCQl9Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShidWZmZXJlZEltYWdlLmdldFdpZHRoKCksIGJ1ZmZlcmVkSW1hZ2UuZ2V0SGVpZ2h0KCksIGNvbG9yTW9kZWwuZ2V0UGl4ZWxTaXplKCksIHBhbGV0dGUpOwotCQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBjb2xvck1vZGVsLmdldFRyYW5zcGFyZW50UGl4ZWwoKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5WzBdKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXN0YXRpYyBJbWFnZURhdGEgY3JlYXRlU2FtcGxlSW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAwLCAxMDApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShib3VuZHMpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQlnYy5maWxsT3ZhbCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZHJhd0xpbmUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kcmF3TGluZShib3VuZHMud2lkdGgsIDAsIDAsIGJvdW5kcy5oZWlnaHQpOwotCWdjLmRpc3Bvc2UoKTsKLQlJbWFnZURhdGEgZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU1dUIEltYWdlIik7Ci0JSW1hZ2VEYXRhIGRhdGE7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBhcmdzWzBdOwotCQlkYXRhID0gbmV3IEltYWdlRGF0YShmaWxlTmFtZSk7Ci0JfSBlbHNlIHsKLQkJZGF0YSA9IGNyZWF0ZVNhbXBsZUltYWdlKGRpc3BsYXkpOwotCX0KLQlmaW5hbCBJbWFnZSBzd3RJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlmaW5hbCBCdWZmZXJlZEltYWdlIGF3dEltYWdlID0gY29udmVydFRvQVdUKGRhdGEpOwotCWZpbmFsIEltYWdlIHN3dEltYWdlMiA9IG5ldyBJbWFnZShkaXNwbGF5LCBjb252ZXJ0VG9TV1QoYXd0SW1hZ2UpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaW50IHkgPSAxMDsKLQkJCWlmIChzd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UsIDEwLCB5KTsKLQkJCQl5ICs9IHN3dEltYWdlLmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQotCQkJaWYgKHN3dEltYWdlMiAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UyLCAxMCwgeSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZSgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQkJaWYgKGF3dEltYWdlICE9IG51bGwpIHsKLQkJCQlnLmRyYXdJbWFnZShhd3RJbWFnZSwgMTAgKyBpbnNldHMubGVmdCwgMTAgKyBpbnNldHMudG9wLCBudWxsKTsKLQkJCX0KLQkJfQotCX07Ci0JZnJhbWUuc2V0VGl0bGUoIkFXVCBJbWFnZSIpOwotCXNoZWxsLnNldExvY2F0aW9uKDUwLCA1MCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHN3dEltYWdlLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoYm91bmRzLndpZHRoICsgNTAsIGJvdW5kcy5oZWlnaHQgKiAyICsgMTAwKTsKLQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCVBvaW50IGxvY2F0aW9uID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQlJbnNldHMgaW5zZXRzID0gZnJhbWUuZ2V0SW5zZXRzKCk7Ci0JZnJhbWUuc2V0TG9jYXRpb24obG9jYXRpb24ueCArIHNpemUueCArIDEwLCBsb2NhdGlvbi55KTsKLQlmcmFtZS5zZXRTaXplKHNpemUueCAtIChpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCksIHNpemUueSAtIChpbnNldHMudG9wICsgaW5zZXRzLmJvdHRvbSkpOwotCWZyYW1lLnNldFZpc2libGUodHJ1ZSk7CQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYgKHN3dEltYWdlICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlpZiAoc3d0SW1hZ2UyICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlmcmFtZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JLyogTm90ZTogSWYgeW91IGFyZSB1c2luZyBKREsgMS4zLngsIHlvdSBuZWVkIHRvIHVzZSBTeXN0ZW0uZXhpdCgwKSBhdCB0aGUgZW5kIG9mIHlvdXIgcHJvZ3JhbSB0byBleGl0IEFXVC4KLQkgKiBUaGlzIGlzIGJlY2F1c2UgaW4gMS4zLngsIEFXVCBkb2VzIG5vdCBleGl0IHdoZW4gdGhlIGZyYW1lIGlzIGRpc3Bvc2VkLCBiZWNhdXNlIHRoZSBBV1QgdGhyZWFkIGlzIG5vdCBhIGRhZW1vbi4KLQkgKiBUaGlzIHdhcyBmaXhlZCBpbiBKREsgMS40Lnggd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIEFXVCBTaHV0ZG93biB0aHJlYWQuCi0JICovCi19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWNkZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogRW1iZWQgV29yZCBpbiBhbiBhcHBsZXQgKHdpbjMyIG9ubHkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0JCi1pbXBvcnQgamF2YS5hcHBsZXQuKjsKLQkgCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NyBleHRlbmRzIEFwcGxldCB7Ci0JCi0Jb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSBkaXNwbGF5OwotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHN3dFBhcmVudDsKLQlqYXZhLmF3dC5DYW52YXMgYXd0UGFyZW50OwotCi1wdWJsaWMgdm9pZCBpbml0ICgpIHsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCAobmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCXNldExheW91dChuZXcgamF2YS5hd3QuR3JpZExheW91dCAoMSwgMSkpOwotCQkJYXd0UGFyZW50ID0gbmV3IGphdmEuYXd0LkNhbnZhcyAoKTsKLQkJCWFkZCAoYXd0UGFyZW50KTsKLQkJCWRpc3BsYXkgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSAoKTsKLQkJCXN3dFBhcmVudCA9IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVC5uZXdfU2hlbGwgKGRpc3BsYXksIGF3dFBhcmVudCk7Ci0JCQlzd3RQYXJlbnQuc2V0TGF5b3V0IChuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0ICgpKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgZnJhbWUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZSAoc3d0UGFyZW50LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PTkUpOwotCQkJb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlIHNpdGU7Ci0JCQl0cnkgewotCQkJCXNpdGUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlIChmcmFtZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIpOwotCQkJfSBjYXRjaCAob3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICJDcmVhdGUgT2xlQ2xpZW50U2l0ZSBFcnJvciIgKyBlLnRvU3RyaW5nICgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZXRTaXplICg1MDAsIDUwMCk7Ci0JCQl2YWxpZGF0ZSAoKTsKLQkJCXNpdGUuZG9WZXJiIChvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRS5PTEVJVkVSQl9TSE9XKTsKLQkJCQotCQkJd2hpbGUgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7CQkKLQkJCX0JCi0JCX0KLQl9KTsKLQl0aHJlYWQuc3RhcnQgKCk7Ci19Ci0gcHVibGljIHZvaWQgc3RvcCAoKXsKLSAJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkICgpKXsKLSAJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlICgpIHsKLSAJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotIAkJCQlpZiAoc3d0UGFyZW50ICE9IG51bGwgJiYgIXN3dFBhcmVudC5pc0Rpc3Bvc2VkICgpKSBzd3RQYXJlbnQuZGlzcG9zZSAoKTsKLSAJCQkJc3d0UGFyZW50ID0gbnVsbDsKLSAJCQkJZGlzcGxheS5kaXNwb3NlICgpOwotIAkJCQlkaXNwbGF5ID0gbnVsbDsKLSAJCQl9Ci0gCQl9KTsKLSAJCXJlbW92ZSAoYXd0UGFyZW50KTsKLSAJCWF3dFBhcmVudCA9IG51bGw7Ci0gCX0KLSB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc5ZmRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZXRlcm1pbmUgbmF0aXZlIGRhdGEgdHlwZXMgYXZhaWxhYmxlIChtb3RpZiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OCBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDE1OCBfaW5zdGFuY2UgPSBuZXcgU25pcHBldDE1OCgpOwotcHJpdmF0ZSBpbnRbXSBpZHM7Ci1wcml2YXRlIFN0cmluZ1tdIG5hbWVzOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIGNvbnRyb2wgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dCgiRHJhZyBkYXRhIG92ZXIgdGhpcyBzaXRlIHRvIHNlZSB0aGUgbmF0aXZlIHRyYW5zZmVyIHR5cGUuIik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9NT1ZFKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1NuaXBwZXQxNTguZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDE1OCBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLVNuaXBwZXQxNTgoKSB7Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewotCXJldHVybiAiSGVsbG8gV29ybGQiOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuYW1lczsKLX0KLXN0YXRpYyBpbnQgc2hlbGxIYW5kbGU7Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCWlmIChpZHMgPT0gbnVsbCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaW50IHdpZGdldENsYXNzID0gT1MudG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzICgpOwotCQlzaGVsbEhhbmRsZSA9IE9TLlh0QXBwQ3JlYXRlU2hlbGwgKG51bGwsIG51bGwsIHdpZGdldENsYXNzLCBkaXNwbGF5LnhEaXNwbGF5LCBudWxsLCAwKTsKLQkJT1MuWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCAoc2hlbGxIYW5kbGUsIGZhbHNlKTsKLQkJT1MuWHRSZWFsaXplV2lkZ2V0IChzaGVsbEhhbmRsZSk7Ci0JCQotCQlpZHMgPSBuZXcgaW50Wzg0MF07Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1s4NDBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJaWRzW2ldID0gaStpOwotCQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkrMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGlkczsKLX0KLXN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21JZChpbnQgaWQpIHsKLQlpbnQgeERpc3BsYXkgPSBPUy5YdERpc3BsYXkgKHNoZWxsSGFuZGxlKTsKLQlpbnQgcHRyID0gMDsKLQl0cnkgewotCQlwdHIgPSBPUy5YbUdldEF0b21OYW1lKHhEaXNwbGF5LCBpZCk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQl9Ci0JaWYgKHB0ciA9PSAwKSByZXR1cm4gImludmFsaWQgIitpZDsKLQlpbnQgbGVuZ3RoID0gT1Muc3RybGVuKHB0cik7Ci0JYnl0ZVtdIG5hbWVCdWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwotCU9TLm1lbW1vdmUobmFtZUJ1ZiwgcHRyLCBsZW5ndGgpOwotCU9TLlhGcmVlKHB0cik7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoQ29udmVydGVyLm1iY3NUb1djcyhudWxsLCBuYW1lQnVmKSkudG9Mb3dlckNhc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MzJiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IG1vZGlmeSBIVE1MIHRpdGxlIHRhZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgbmV3VGl0bGUgPSAiTmV3IFZhbHVlIGZvciBUaXRsZSI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGVFdmVudDogIitldmVudC50aXRsZSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogU2V0IEhUTUwgdGl0bGUgdGFnIHVzaW5nIEphdmFTY3JpcHQgYW5kIERPTSB3aGVuIHBhZ2UgaGFzIGJlZW4gbG9hZGVkICovCi0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoImRvY3VtZW50LnRpdGxlPSciK25ld1RpdGxlKyInIik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCS8qIExvYWQgYW4gSFRNTCBkb2N1bWVudCAqLwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZjYTMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIG9uZSByZXBlYXRpbmcgdGltZXIgKGV2ZXJ5IDUwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBpbnQgdGltZSA9IDUwMDsKLQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlQb2ludCBwb2ludCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcyAoKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zIChwb2ludCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJPdXQiKTsKLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7CQotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1YmEyYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHF1ZXJ5IERPTSBub2RlIHZhbHVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlicm93c2VyLnNldERhdGEoInF1ZXJ5IiwgZXZlbnQudGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogCi0JCQkJICogVXNlIEphdmFTY3JpcHQgdG8gcXVlcnkgdGhlIGRlc2lyZWQgbm9kZSBjb250ZW50IHRocm91Z2ggdGhlIERvY3VtZW50IE9iamVjdCBNb2RlbAotCQkJCSAqIAotCQkJCSAqIEFzc2lnbiByZXN1bHQgdG8gdGhlIHdpbmRvdyBwcm9wZXJ0eSBzdGF0dXMgdG8gcGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBTdGF0dXNUZXh0TGlzdGVuZXIKLQkJCQkgKiBUaGlzIHRyaWNrIGlzIHJlcXVpcmVkIHNpbmNlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IGRvZXMgbm90IHJldHVybiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgotCQkJCSAqIGRpcmVjdGx5LgotCQkJCSAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJ3aW5kb3cuc3RhdHVzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7Iik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYnJvd3Nlci5nZXREYXRhKCJxdWVyeSIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSB2YWx1ZTogIit2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDNkODkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgRE9NIChleGVjdXRpbmcgamF2YXNjcmlwdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIGh0bWwgPSAiPGh0bWw+PHRpdGxlPlNuaXBwZXQ8L3RpdGxlPjxib2R5PjxwIGlkPSdteWlkJz5CZXN0IEZyaWVuZHM8L3A+PHAgaWQ9J215aWQyJz5DYXQgYW5kIERvZzwvcD48L2JvZHk+PC9odG1sPiI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuTVVMVEkpOwotCQl0ZXh0LnNldFRleHQoInZhciBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUCcpOyBcclxuIisKLQkJCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkJCSJuZXdOb2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkJCSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4iKwotCQkJCSJcclxuIisKLQkJCQkiZG9jdW1lbnQuYmdDb2xvcj0neWVsbG93JzsiKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiRXhlY3V0ZSBTY3JpcHQiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUodGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMjg2YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFkZGluZyBhbiBhY2Nlc3NpYmxlIGxpc3RlbmVyIHRvIHByb3ZpZGUgc3RhdGUgaW5mb3JtYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjIgewotCi1maW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRFID0gIkNoZWNrZWRJbmRpY2VzIjsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JSW1hZ2UgY2hlY2tlZEltYWdlID0gZ2V0Q2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlJbWFnZSB1bmNoZWNrZWRJbWFnZSA9IGdldFVuY2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0xLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJmaXJzdCBpdGVtIiwgImEiLCAiYiJ9KTsKLQlpdGVtMS5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldEltYWdlICgyLCB1bmNoZWNrZWRJbWFnZSk7Ci0JaXRlbTEuc2V0RGF0YSAoU1RBVEUsIG51bGwpOwotCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTIuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InNlY29uZCBpdGVtIiwgImMiLCAiZCJ9KTsKLQlpdGVtMi5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsyfSk7Ci0JVGFibGVJdGVtIGl0ZW0zID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMy5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsidGhpcmQiLCAiZSIsICJmIn0pOwotCWl0ZW0zLnNldEltYWdlICgxLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsxLCAyfSk7Ci0JY29sdW1uMS5wYWNrICgpOwotCWNvbHVtbjIucGFjayAoKTsKLQljb2x1bW4zLnBhY2sgKCk7Ci0JQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdGFibGUuZ2V0QWNjZXNzaWJsZSAoKTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldE5hbWUgKGUpOwotCQkJaWYgKGUuY2hpbGRJRCA+PSAwICYmIGUuY2hpbGRJRCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoZS5jaGlsZElEKTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChpKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlpbnQgW10gZGF0YSA9IChpbnQgW10pIGl0ZW0uZ2V0RGF0YSAoU1RBVEUpOwotCQkJCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChkYXRhIFtqXSA9PSBpKSB7Ci0JCQkJCQkJCQljaGVja2VkID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZS5yZXN1bHQgPSBpdGVtLmdldFRleHQgKGkpICsgIiAiICsgKGNoZWNrZWQgPyAiY2hlY2tlZCIgOiAidW5jaGVja2VkIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFN0YXRlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldFN0YXRlIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMgKGRhdGEgW2ldKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQkJZS5kZXRhaWwgfD0gQUNDLlNUQVRFX0NIRUNLRUQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQl1bmNoZWNrZWRJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotc3RhdGljIEltYWdlIGdldENoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0RBUktfR1JFRU4pKTsKLQlnYy5kcmF3TGluZSAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kcmF3TGluZSAoMTYsIDAsIDAsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotc3RhdGljIEltYWdlIGdldFVuY2hlY2tlZEltYWdlIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsT3ZhbCAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2ZkNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNldHRpbmcgdGhlIGZvbnQgc3R5bGUsIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIFN0eWxlZFRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIGJvbGQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgcmVkIGZvbnQKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogaGF2ZSBhIGJsdWUgYmFja2dyb3VuZAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk0NWY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBPdmVycmlkZSB0aGUgdGV4dCB0aGF0IGlzIHNwb2tlbiBmb3IgYSBuYXRpdmUgQnV0dG9uLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCi0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiJlR5cGljYWwgYnV0dG9uIik7Ci0JYnV0dG9uMS5zZXRCb3VuZHMoMTAsMTAsMTgwLDMwKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCImT3ZlcmlkZGVuIGJ1dHRvbiIpOwotCWJ1dHRvbjIuc2V0Qm91bmRzKDEwLDUwLDE4MCwzMCk7Ci0JYnV0dG9uMi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSAiU3BlYWsgdGhpcyBpbnN0ZWFkIG9mIHRoZSBidXR0b24gdGV4dCI7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNiMThiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBDVGFiRm9sZGVyIHdpdGggbWluIGFuZCBtYXggYnV0dG9ucywgYXMgd2VsbCBhcyBjbG9zZSBidXR0b24gYW5kIAotICogaW1hZ2Ugb25seSBvbiBzZWxlY3RlZCB0YWIuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTYsIDE2KTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxSZWN0YW5nbGUoMywgMywgMTAsIDEwKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCWZvbGRlci5zZXRTaW1wbGUoZmFsc2UpOwotCWZvbGRlci5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZShmYWxzZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl0ZXh0LnNldFRleHQoIlRleHQgZm9yIGl0ZW0gIitpKyJcblxub25lLCB0d28sIHRocmVlXG5cbmFiY2RlZmdoaWprbG1ub3AiKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQlmb2xkZXIuc2V0TWluaW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7Ci0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbWluaW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlmb2xkZXIuc2V0TWluaW1pemVkKHRydWUpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1heGltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1heGltaXplZCh0cnVlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TWF4aW1pemVkKGZhbHNlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyN2YwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBTY3JvbGxlZENvbXBvc2l0ZSB3aXRoIHdyYXBwaW5nIGNvbnRlbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZTEgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dPUktJTkcpOwotCUltYWdlIGltYWdlMiA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCUltYWdlIGltYWdlMyA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCi0JZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2Nyb2xsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JZm9yKGludCBpID0gMDsgaSA8PSA1MDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlpZiAoaSAlIDMgPT0gMCkgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UxKTsKLQkJaWYgKGkgJSAzID09IDEpIGxhYmVsLnNldEltYWdlKGltYWdlMik7Ci0JCWlmIChpICUgMyA9PSAyKSBsYWJlbC5zZXRJbWFnZShpbWFnZTMpOwotCX0KLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChwYXJlbnQpOwotCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByID0gc2Nyb2xsQ29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCXNjcm9sbENvbXBvc2l0ZS5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShyLndpZHRoLCBTV1QuREVGQVVMVCkpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjIxMWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSB0d28gU2Nyb2xsZWRDb21wb3NpdGVzIHRoYXQgc2Nyb2xsIGluIHRhbmRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24gKHNjMSwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JYnV0dG9uMS5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2MxLnNldENvbnRlbnQgKGJ1dHRvbjEpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNjMiwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkJ1dHRvbiAyIik7Ci0JYnV0dG9uMi5zZXRTaXplICgzMDAsIDQwMCk7Ci0Jc2MyLnNldENvbnRlbnQgKGJ1dHRvbjIpOwotCi0JZmluYWwgU2Nyb2xsQmFyIHZCYXIxID0gc2MxLmdldFZlcnRpY2FsQmFyICgpOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyMiA9IHNjMi5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjEgPSBzYzEuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjIgPSBzYzIuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMS5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIxLmdldE1heGltdW0oKSAtIGhCYXIxLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMS5nZXRNYXhpbXVtKCkgLSB2QmFyMS5nZXRUaHVtYigpKTsKLQkJCXNjMi5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMi5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIyLmdldE1heGltdW0oKSAtIGhCYXIyLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMi5nZXRNYXhpbXVtKCkgLSB2QmFyMi5nZXRUaHVtYigpKTsKLQkJCXNjMS5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQl2QmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQloQmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQl2QmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQloQmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDI0NWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgbGluZXMgYW5kIHBvbHlnb25zIHdpdGggZGlmZmVyZW50IGNhcCBhbmQgam9pbiBzdHlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgeCA9IDIwLCB5ID0gMjAsIHcgPSAxMjAsIGggPSA2MDsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JCQlpbnRbXSBjYXBzID0ge1NXVC5DQVBfRkxBVCwgU1dULkNBUF9ST1VORCwgU1dULkNBUF9TUVVBUkV9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZ2Muc2V0TGluZUNhcChjYXBzW2ldKTsKLQkJCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgdywgeSk7Ci0JCQkJeSArPSAyMDsKLQkJCX0KLQkJCWludFtdIGpvaW5zID0ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVKb2luKGpvaW5zW2ldKTsKLQkJCQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10ge3gsIHksIHggKyB3LzIsIHkgKyBoLCB4ICsgdywgeX0pOwotCQkJCXkgKz0gaCArIDIwOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTMyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIHRvZ2dsZSBidXR0b24gaGF2ZSByYWRpbyBiZWhhdmlvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IHNoZWxsLmdldENoaWxkcmVuICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCQlpZiAoZS53aWRnZXQgIT0gY2hpbGQgJiYgY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24gJiYgKGNoaWxkLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCkgewotCQkJCQkoKEJ1dHRvbikgY2hpbGQpLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCSgoQnV0dG9uKSBlLndpZGdldCkuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX07Ci0JZm9yIChpbnQgaT0wOyBpPDIwOyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaWYgKGkgPT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmY4M2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2xpZGVyIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2Nyb2xsIGV2ZW50IGRldGFpbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQlzbGlkZXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNsaWRlci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlNXVC5OT05FIjsKLQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuRFJBRzogc3RyaW5nID0gIlNXVC5EUkFHIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuSE9NRTogc3RyaW5nID0gIlNXVC5IT01FIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRU5EOiBzdHJpbmcgPSAiU1dULkVORCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX0RPV046IHN0cmluZyA9ICJTV1QuQVJST1dfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX1VQOiBzdHJpbmcgPSAiU1dULkFSUk9XX1VQIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUEFHRV9ET1dOOiBzdHJpbmcgPSAiU1dULlBBR0VfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfVVA6IHN0cmluZyA9ICJTV1QuUEFHRV9VUCI7IGJyZWFrOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2Nyb2xsIGRldGFpbCAtPiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkYzNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IENyZWF0ZSBhIFRyZWUgd2l0aCBjb2x1bW5zCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMyA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JCWNvbHVtbjMuc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uMy5zZXRXaWR0aCgyMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgIml0ZW0gIiArIGksICJhYmMiLCAiZGVmZ2hpIiB9KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJzdWJpdGVtICIgKyBqLCAiamtsbW5vcCIsICJxcnMiIH0pOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgInN1YnN1Yml0ZW0gIiArIGssICJ0dXYiLCAid3h5eiIgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2JhZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGRhdGEgdHJhbnNmZXIgdHlwZXMgdGhhdCBzdWJjbGFzcyBlYWNoCi0gKiBvdGhlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcxIHsKLQotLyoKLSAqIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZQotICogTXlUeXBlIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJNeXR5cGVUcmFuc2ZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZSBkYXRhID0gKE15VHlwZSkgb2JqZWN0OwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IGRhdGEuZmlsZU5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEubGFzdE1vZGlmaWVkKTsKLQkJCWJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlPYmplY3QgYnl0ZUFycmF5VG9KYXZhKGJ5dGVbXSBieXRlcykgewotCQlNeVR5cGUgZGF0YSA9IG5ldyBNeVR5cGUoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZmZlciA9IGphdmFUb0J5dGVBcnJheShvYmplY3QpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSkgc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gYnl0ZUFycmF5VG9KYXZhKGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1ZVFlQRU5BTUUgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IE1ZVFlQRUlEIH07Ci0JfQotCi0JYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTI8L2JvbGQ+Ci0gKiB3aGVyZSBNeVR5cGUyIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZTIgZXh0ZW5kcyBNeVR5cGUgewotCVN0cmluZyB2ZXJzaW9uOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlcjIgZXh0ZW5kcyBNeVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEUyTkFNRSA9ICJNeXR5cGUyVHJhbnNmZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEUySUQgPSByZWdpc3RlclR5cGUoTVlUWVBFMk5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNWVRZUEUyTkFNRSB9OwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgTVlUWVBFMklEIH07Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZTIgZGF0YSA9IChNeVR5cGUyKSBvYmplY3Q7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQlieXRlW10gYnVmZmVyID0gZGF0YS5maWxlTmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEuZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5sYXN0TW9kaWZpZWQpOwotCQkJYnVmZmVyID0gZGF0YS52ZXJzaW9uLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQlidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCQlyZXR1cm4gYnVmZmVyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JT2JqZWN0IGJ5dGVBcnJheVRvSmF2YShieXRlW10gYnl0ZXMpIHsKLQkJTXlUeXBlMiBkYXRhID0gbmV3IE15VHlwZTIoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLnZlcnNpb24gPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghY2hlY2tNeVR5cGUyKG9iamVjdCkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlzdXBlci5qYXZhVG9OYXRpdmUob2JqZWN0LCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCWJvb2xlYW4gY2hlY2tNeVR5cGUyKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCFjaGVja015VHlwZShvYmplY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja015VHlwZTIob2JqZWN0KTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQoIkRyYWcgU291cmNlIGZvciBNeURhdGEgYW5kIE15RGF0YTIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwyLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwzLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEyIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJTXlUcmFuc2ZlcjIuZ2V0SW5zdGFuY2UoKSB9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlNeVR5cGUyIG15VHlwZSA9IG5ldyBNeVR5cGUyKCk7Ci0JCQlteVR5cGUuZmlsZU5hbWUgPSAiQzpcXGFiYy50eHQiOwotCQkJbXlUeXBlLmZpbGVMZW5ndGggPSAxMDAwOwotCQkJbXlUeXBlLmxhc3RNb2RpZmllZCA9IDEyMzEyMzEzOwotCQkJbXlUeXBlLnZlcnNpb24gPSAidmVyc2lvbiAyIjsKLQkJCWV2ZW50LmRhdGEgPSBteVR5cGU7Ci0JCX0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldE15VHlwZSA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsMiwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldE15VHlwZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl0YXJnZXRNeVR5cGUuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUgbXlUeXBlID0gKE15VHlwZSkgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNeVR5cGU6ICIgKyBteVR5cGUuZmlsZU5hbWU7Ci0JCQkJCWxhYmVsMi5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldE15VHlwZTIgPSBuZXcgRHJvcFRhcmdldChsYWJlbDMsIERORC5EUk9QX0NPUFkJfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXRNeVR5cGUyLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2ZlcjIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl0YXJnZXRNeVR5cGUyLmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlMiBteVR5cGUgPSAoTXlUeXBlMikgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNeVR5cGUyOiAiICsgbXlUeXBlLmZpbGVOYW1lICsgIjoiCi0JCQkJCQkJKyBteVR5cGUudmVyc2lvbjsKLQkJCQkJbGFiZWwzLnNldFRleHQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxZWZmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgR3JpZExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWY3ZWU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlciB3aXRoIHBvcC11cCBibG9ja2VyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCXNoZWxsLm9wZW4oKTsKLQkvKiBhbnkgd2Vic2l0ZSB3aXRoIHBvcHVwcyAqLwotCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3LmNubi5jb20iKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0vKiByZWdpc3RlciBXaW5kb3dFdmVudCBsaXN0ZW5lcnMgKi8KLXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJLyogcG9wdXAgYmxvY2tlciAtIGlnbm9yZSB3aW5kb3dzIHdpdGggbm8gc3R5bGUgKi8KLQkJCWlmICghZXZlbnQuYWRkcmVzc0JhciAmJiAhZXZlbnQubWVudUJhciAmJiAhZXZlbnQuc3RhdHVzQmFyICYmICFldmVudC50b29sQmFyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQb3B1cCBibG9ja2VkLiIpOwotCQkJCWV2ZW50LmRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQlpZiAoZXZlbnQuc2l6ZSAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LnNpemU7Ci0JCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQl9Ci0JfSk7Ci0JYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2VkMmY3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICBJQk0gQ29ycG9yYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IGRyYXcgYSBzcXVhcmUKLSAqIAotICogVGhpcyBzbmlwcGV0IHJlcXVpcmVzIHRoZSBleHBlcmltZW50YWwgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbCBwbHVnaW4sIHdoaWNoCi0gKiBpcyBub3QgaW5jbHVkZWQgaW4gU1dUIGJ5IGRlZmF1bHQgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB2ZXJzaW9ucyBvZgotICogU1dUIHByaW9yIHRvIDMuMi4gIEZvciBpbmZvcm1hdGlvbiBvbiB1c2luZyBPcGVuR0wgaW4gU1dUIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvb3BlbmdsLyAuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRUZXh0KCJPcGVuR0wgaW4gU1dUIik7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIEdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSgpOwotICAgIGRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLSAgICBmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5ELCBkYXRhKTsKLSAgICBjYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgIHJlc2l6ZShjYW52YXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgaW5pdChjYW52YXMpOwotICAgIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLSAgICAgICAgICAgIHJlbmRlcigpOwotICAgICAgICAgICAgY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0gICAgICAgICAgICBjYW52YXMuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyg1MCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9LnJ1bigpOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXQoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICByZXNpemUoY2FudmFzKTsKLSAgICBHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0gICAgR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDAuMGYpOwotICAgIEdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLSAgICBHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLSAgICBHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotfQotCi1zdGF0aWMgdm9pZCByZW5kZXIoKSB7Ci0gICAgR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTYuMGYpOwotICAgIEdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigxLjBmLCAtMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigtMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsRW5kKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2l6ZShHTENhbnZhcyBjYW52YXMpIHsKLSAgICBjYW52YXMuc2V0Q3VycmVudCgpOwotICAgIFJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLSAgICBpbnQgd2lkdGggPSByZWN0LndpZHRoOwotICAgIGludCBoZWlnaHQgPSBNYXRoLm1heChyZWN0LmhlaWdodCwgMSk7Ci0gICAgR0wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0gICAgR0xVLmdsdVBlcnNwZWN0aXZlKDQ1LjBmLCBhc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYzk3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBFeGNsdWRlIGEgd2lkZ2V0IGZyb20gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAwIik7Ci0KLQlmaW5hbCBCdXR0b24gYkhpZGRlbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliSGlkZGVuLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JYkhpZGRlbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiA0Iik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoImhpZGUiKTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGJIaWRkZW4uZ2V0TGF5b3V0RGF0YSgpOwotCQkJZGF0YS5leGNsdWRlID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWJIaWRkZW4uc2V0VmlzaWJsZSghZGF0YS5leGNsdWRlKTsKLQkJCXNoZWxsLmxheW91dChmYWxzZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhZjc1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUm93TGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSByb3cKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKTsKLQlsYXlvdXQud3JhcCA9IHRydWU7Ci0JbGF5b3V0LmZpbGwgPSBmYWxzZTsKLQlsYXlvdXQuanVzdGlmeSA9IHRydWU7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQotCWIuc2V0VGV4dCgiQnV0dG9uIDIiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIk5vdCBzaG93biIpOwotCWIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JUm93RGF0YSBkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIGhpZ2giKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmhlaWdodCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCB3aWRlIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS53aWR0aCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YThlY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJvd0xheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgY29sdW1uCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gdHJ1ZTsKLQlsYXlvdXQuanVzdGlmeSA9IGZhbHNlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1NGJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSG93IHRvIGFjY2VzcyBBYm91dCwgUHJlZmVyZW5jZXMgYW5kIFF1aXQgbWVudXMgb24gY2FyYm9uLgotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzggewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRQcmVmZXJlbmNlcyA9ICgncCcgPDwgMjQpICsgKCdyJyA8PCAxNikKLQkJCSsgKCdlJyA8PCA4KSArICdmJzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kQWJvdXQgPSAoJ2EnIDw8IDI0KSArICgnYicgPDwgMTYpCi0JCQkrICgnbycgPDwgOCkgKyAndSc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZFNlcnZpY2VzID0gKCdzJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KQotCQkJKyAoJ3InIDw8IDgpICsgJ3YnOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHsKLQlEaXNwbGF5LnNldEFwcE5hbWUoIkFwcE1lbnUiKTsgLy8gc2V0cyBuYW1lIGluIERvY2sKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWhvb2tBcHBsaWNhdGlvbk1lbnUoZGlzcGxheSwgIkFib3V0IEFwcE1lbnUiKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIFdpbmRvdyIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhvb2tBcHBsaWNhdGlvbk1lbnUoRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTdHJpbmcgYWJvdXROYW1lKSB7Ci0JLy8gQ2FsbGJhY2sgdGFyZ2V0Ci0JT2JqZWN0IHRhcmdldCA9IG5ldyBPYmplY3QoKSB7Ci0JCWludCBjb21tYW5kUHJvYyhpbnQgbmV4dEhhbmRsZXIsIGludCB0aGVFdmVudCwgaW50IHVzZXJEYXRhKSB7Ci0JCQlpZiAoT1MuR2V0RXZlbnRLaW5kKHRoZUV2ZW50KSA9PSBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCkgewotCQkJCUhJQ29tbWFuZCBjb21tYW5kID0gbmV3IEhJQ29tbWFuZCgpOwotCQkJCU9TLkdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBPUy5rRXZlbnRQYXJhbURpcmVjdE9iamVjdCwKLQkJCQkJCU9TLnR5cGVISUNvbW1hbmQsIG51bGwsIEhJQ29tbWFuZC5zaXplb2YsIG51bGwsCi0JCQkJCQljb21tYW5kKTsKLQkJCQlzd2l0Y2ggKGNvbW1hbmQuY29tbWFuZElEKSB7Ci0JCQkJY2FzZSBrSElDb21tYW5kUHJlZmVyZW5jZXM6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKCJQcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBrSElDb21tYW5kQWJvdXQ6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKGFib3V0TmFtZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIE9TLmV2ZW50Tm90SGFuZGxlZEVycjsKLQkJfQotCi0JCWludCBoYW5kbGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQkJTWVzc2FnZUJveCBwcmVmZXJlbmNlcyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HKTsKLQkJCXByZWZlcmVuY2VzLnNldFRleHQoY29tbWFuZCk7Ci0JCQlwcmVmZXJlbmNlcy5vcGVuKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gT1Mubm9FcnI7Ci0JCX0KLQl9OwotCi0JZmluYWwgQ2FsbGJhY2sgY29tbWFuZENhbGxiYWNrID0gbmV3IENhbGxiYWNrKHRhcmdldCwgImNvbW1hbmRQcm9jIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQlpbnQgY29tbWFuZFByb2MgPSBjb21tYW5kQ2FsbGJhY2suZ2V0QWRkcmVzcygpOwotCWlmIChjb21tYW5kUHJvYyA9PSAwKSB7Ci0JCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCXJldHVybjsgLy8gZ2l2ZSB1cAotCX0KLQotCS8vIEluc3RhbGwgZXZlbnQgaGFuZGxlciBmb3IgY29tbWFuZHMKLQlpbnRbXSBtYXNrID0gbmV3IGludFtdIHsgT1Mua0V2ZW50Q2xhc3NDb21tYW5kLCBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCB9OwotCU9TLkluc3RhbGxFdmVudEhhbmRsZXIoT1MuR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpLCBjb21tYW5kUHJvYywKLQkJCW1hc2subGVuZ3RoIC8gMiwgbWFzaywgMCwgbnVsbCk7Ci0KLQkvLyBjcmVhdGUgQWJvdXQgLi4uIG1lbnUgY29tbWFuZAotCWludFtdIG91dE1lbnUgPSBuZXcgaW50WzFdOwotCXNob3J0W10gb3V0SW5kZXggPSBuZXcgc2hvcnRbMV07Ci0JaWYgKE9TLkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCgwLCBrSElDb21tYW5kUHJlZmVyZW5jZXMsIDEsCi0JCQlvdXRNZW51LCBvdXRJbmRleCkgPT0gT1Mubm9FcnIKLQkJCSYmIG91dE1lbnVbMF0gIT0gMCkgewotCQlpbnQgbWVudSA9IG91dE1lbnVbMF07Ci0KLQkJaW50IGwgPSBhYm91dE5hbWUubGVuZ3RoKCk7Ci0JCWNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltsXTsKLQkJYWJvdXROYW1lLmdldENoYXJzKDAsIGwsIGJ1ZmZlciwgMCk7Ci0JCWludCBzdHIgPSBPUy5DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE9TLmtDRkFsbG9jYXRvckRlZmF1bHQsCi0JCQkJYnVmZmVyLCBsKTsKLQkJT1MuSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKG1lbnUsIHN0ciwgKHNob3J0KSAwLCAwLAotCQkJCWtISUNvbW1hbmRBYm91dCk7Ci0JCU9TLkNGUmVsZWFzZShzdHIpOwotCi0JCS8vIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBBYm91dCAmIFByZWZlcmVuY2VzCi0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCAwLCAoc2hvcnQpIDEsCi0JCQkJT1Mua01lbnVJdGVtQXR0clNlcGFyYXRvciwgMCk7Ci0KLQkJLy8gZW5hYmxlIHByZWYgbWVudQotCQlPUy5FbmFibGVNZW51Q29tbWFuZChtZW51LCBrSElDb21tYW5kUHJlZmVyZW5jZXMpOwotCi0JCS8vIGRpc2FibGUgc2VydmljZXMgbWVudQotCQlPUy5EaXNhYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFNlcnZpY2VzKTsKLQl9Ci0KLQkvLyBzY2hlZHVsZSBkaXNwb3NhbCBvZiBjYWxsYmFjayBvYmplY3QKLQlkaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJY29tbWFuZENhbGxiYWNrLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzgwNWY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHZlcmlmeSBpbnB1dCAoZm9ybWF0IGZvciBkYXRlKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiWVlZWS9NTS9ERCIpOzsJCi0JZmluYWwgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCXRleHQuYWRkTGlzdGVuZXIoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyKCkgewotCQlib29sZWFuIGlnbm9yZTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZSkgcmV0dXJuOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbYnVmZmVyLmxlbmd0aCgpXTsKLQkJCWJ1ZmZlci5nZXRDaGFycygwLCBjaGFycy5sZW5ndGgsIGNoYXJzLCAwKTsKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAvKiBbWV1ZWVkgKi8KLQkJCQkJCWNhc2UgMTogLyogWVtZXVlZICovCi0JCQkJCQljYXNlIDI6IC8qIFlZW1ldWSAqLwotCQkJCQkJY2FzZSAzOiAvKiBZWVlbWV0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1knKTsgCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA1OiAvKiBbTV1NKi8KLQkJCQkJCWNhc2UgNjogLyogTVtNXSAqL3sKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdNJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA4OiAvKiBbRF1EICovCi0JCQkJCQljYXNlIDk6IC8qIERbRF0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ0QnKTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQljYXNlIDQ6IC8qIFlZWVlbL11NTSAqLwotCQkJCQkJY2FzZSA3OiAvKiBNTVsvXUREICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCcvJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkKLQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQlpZiAoc3RhcnQgPiA5KSByZXR1cm47Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDQgfHwgc3RhcnQgKyBpbmRleCA9PSA3KSB7Ci0JCQkJCWlmIChjaGFyc1tpXSA9PSAnLycpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWZmZXIuaW5zZXJ0KGluZGV4KyssICcvJyk7Ci0JCQkJfQotCQkJCWlmIChjaGFyc1tpXSA8ICcwJyB8fCAnOScgPCBjaGFyc1tpXSkgcmV0dXJuOwotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDUgJiYgICcxJyA8IGNoYXJzW2ldKSByZXR1cm47IC8qIFtNXU0gKi8KLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA4ICYmICAnMycgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbRF1EICovCi0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJCVN0cmluZyBuZXdUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpbnQgbGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJCVN0cmluZ0J1ZmZlciBkYXRlID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQlkYXRlLnJlcGxhY2UoZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCwgbmV3VGV4dCk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgMTkwMSk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIENhbGVuZGFyLkpBTlVBUlkpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBVEUsIDEpOwotCQkJU3RyaW5nIHl5eXkgPSBkYXRlLnN1YnN0cmluZygwLCA0KTsKLQkJCWlmICh5eXl5LmluZGV4T2YoJ1knKSA9PSAtMSkgewotCQkJCWludCB5ZWFyID0gSW50ZWdlci5wYXJzZUludCh5eXl5KTsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcik7Ci0JCQl9Ci0JCQlTdHJpbmcgbW0gPSBkYXRlLnN1YnN0cmluZyg1LCA3KTsKLQkJCWlmIChtbS5pbmRleE9mKCdNJykgPT0gLTEpIHsKLQkJCQlpbnQgbW9udGggPSAgSW50ZWdlci5wYXJzZUludChtbSkgLSAxOwotCQkJCWludCBtYXhNb250aCA9IGNhbGVuZGFyLmdldEFjdHVhbE1heGltdW0oQ2FsZW5kYXIuTU9OVEgpOwotCQkJCWlmICgwID4gbW9udGggfHwgbW9udGggPiBtYXhNb250aCkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5NT05USCwgbW9udGgpOwotCQkJfQotCQkJU3RyaW5nIGRkID0gZGF0ZS5zdWJzdHJpbmcoOCwxMCk7Ci0JCQlpZiAoZGQuaW5kZXhPZignRCcpID09IC0xKSB7Ci0JCQkJaW50IGRheSA9IEludGVnZXIucGFyc2VJbnQoZGQpOwotCQkJCWludCBtYXhEYXkgPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLkRBVEUpOwotCQkJCWlmICgxID4gZGF5IHx8IGRheSA+IG1heERheSkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCBkYXkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSAgPT0gQ2FsZW5kYXIuRkVCUlVBUlkpIHsKLQkJCQkJY2hhciBmaXJzdENoYXIgPSBkYXRlLmNoYXJBdCg4KTsKLQkJCQkJaWYgKGZpcnN0Q2hhciAhPSAnRCcgJiYgJzInIDwgZmlyc3RDaGFyKSByZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCk7Ci0JCQlpZ25vcmUgPSB0cnVlOwotCQkJdGV4dC5pbnNlcnQobmV3VGV4dCk7Ci0JCQlpZ25vcmUgPSBmYWxzZTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGJmYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRvb2wgYmFyICh0ZXh0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKCk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQliYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3ZjMxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHNoZWxsIHRvIHNpbXVsYXRlIHRyYW5zcGFyZW5jeQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JLy9TaGVsbCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCBzdHlsZSBTV1QuTk9fVFJJTQotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0Jc2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkvL2RlZmluZSBhIHJlZ2lvbiAKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCAyMDA7IHkrPTIpIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjAwOyB4Kz0yKSB7Ci0JCQkJcGl4ZWwueCA9IHg7Ci0JCQkJcGl4ZWwueSA9IHk7Ci0JCQkJcmVnaW9uLmFkZChwaXhlbCk7Ci0JCQl9Ci0JCX0KLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxMCwgMTAsIHNpemUueC0yMCwgc2l6ZS55LTIwKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDE1ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGFuZCByZW9yZGVyIGNvbHVtbnMgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgxIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSgtMSwgMzAwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiA0Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIgMCIsIGkrIiAxIiwgaSsiIDIiLCBpKyIgMyIsIGkrIiA0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5wYWNrKCk7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHRydWUpOwotCQkJY29sdW1uc1tpXS5hZGRMaXN0ZW5lcihTV1QuTW92ZSwgbGlzdGVuZXIpOwotCQl9Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludmVydCBjb2x1bW4gb3JkZXIiKTsKLQkJYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50W10gb3JkZXIgPSB0YWJsZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzEwZjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlsaW5rLnNldFRleHQoIlRoaXMgYSB2ZXJ5IHNpbXBsZSA8QT5saW5rPC9BPiB3aWRnZXQuIik7Ci0JCWxpbmsuc2V0U2l6ZSgxNDAsIDQwKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM1YTFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IHNlbGVjdGlvbiBldmVudHMgaW4gYSBsaW5rIHdpZGdldAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgzIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgdGV4dCA9ICJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxhPmVmZmljaWVudDwvYT4sIDxhPnBvcnRhYmxlPC9hPiA8YSBocmVmPVwibmF0aXZlXCI+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvYT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIjsKLQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlsaW5rLnNldFNpemUoNDAwLCA0MDApOwotCQlsaW5rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbjogIiArIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4OTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTcGlubmVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3Bpbm5lciB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlzcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDUwMCk7Ci0JCXNwaW5uZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQoMTAwKTsKLQkJc3Bpbm5lci5wYWNrKCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRkN2M3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIGRyb3BwZWQgZGF0YSB0eXBlIGRlcGVuZCBvbiBhIHRhcmdldCBpdGVtIGluIHRhYmxlCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0KCJEcmFnIFNvdXJjZSIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAyID09IDApIGl0ZW0uc2V0VGV4dCgiRHJvcCBhIGZpbGUiKTsKLQkJaWYgKGkgJSAyID09IDEpIGl0ZW0uc2V0VGV4dCgiRHJvcCB0ZXh0Iik7Ci0JfQotCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0JZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoInRlbXAiKTsKLQkJCQlldmVudC5kYXRhID0gbmV3IFN0cmluZ1tdIHtmaWxlLmdldEFic29sdXRlUGF0aCgpfTsKLQkJCX0KLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9ICJvbmNlIHVwb24gYSB0aW1lIjsKLQkJCX0KLQkJfSAKLQl9KTsKLQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0YWJsZSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJRmlsZVRyYW5zZmVyIGZpbGVUcmFuc2ZlciA9IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBpdGVtSW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaWYgKGl0ZW1JbmRleCAlIDIgPT0gMCkgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAoZmlsZVRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tpbmRleF0pKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaW5kZXhdOwotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCVN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlpdGVtLnNldFRleHQoZmlsZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDE1MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmODgwMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08SFRNTD4KLSAgPEhFQUQ+Ci0gICAgPFRJVExFPlBvc3Q8L1RJVExFPgotCTxwPlRlc3QgZm9yIFBvc3RpbmcgRGF0YSBpbiBJRTwvcD4KLQotICA8L0hFQUQ+Ci0KLSAgPEJPRFk+Ci0gICAgPEZPUk0gTUVUSE9EPSJwb3N0IgotICAgICAgIEFDVElPTj0iaHR0cDovL2hvc3QvY2dpLWJpbi9tYXNfZm9ybSI+Ci0gICAgPElOUFVUIFRZUEU9InRleHQiIE5BTUU9Im5hbWUiCi0gICAgICAgU0laRT0yMCBWQUxVRT0iVHJ5IGl0IChwb3N0KSI+Ci0gPC9GT1JNPgotIAotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDJjMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSZWFkaW5nIGFuZCB3cml0aW5nIHRvIGEgU0FGRUFSUkFZCi0gKiAKLSAqIFRoaXMgZXhhbXBsZSByZWFkcyBmcm9tIGEgUG9zdERhdGEgb2JqZWN0IGluIGEgQmVmb3JlTmF2aWdhdGUyIGV2ZW50IGFuZAotICogY3JlYXRlcyBhIFBvc3REYXRhIG9iamVjdCBpbiBhIGNhbGwgdG8gTmF2aWdhdGUgKDMyLWJpdCB3aW4zMiBvbmx5KS4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg2IHsKLQotc3RhdGljIGludCBDb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JQnV0dG9uIGdvID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWdvLnNldFRleHQoIkdvIik7Ci0JT2xlRnJhbWUgb2xlRnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQlvbGVGcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQlPbGVBdXRvbWF0aW9uIGF1dG9tYXRpb247Ci0JdHJ5IHsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJYXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm47Ci0JfQotCQotCWZpbmFsIE9sZUF1dG9tYXRpb24gYXV0byA9IGF1dG9tYXRpb247Ci0JZ28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgdXJsID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQlpbnRbXSByZ2Rpc3BpZCA9IGF1dG8uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMV07Ci0JCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQkJaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzFdOwotCQkJcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsKLQkJCWF1dG8uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCX0KLQl9KTsKLQkKLQkKLQkvLyBSZWFkIFBvc3REYXRhIHdoZW5ldmVyIHdlIG5hdmlnYXRlIHRvIGEgc2l0ZSB0aGF0IHVzZXMgaXQKLQlpbnQgQmVmb3JlTmF2aWdhdGUyID0gMHhmYTsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKEJlZm9yZU5hdmlnYXRlMiwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJVmFyaWFudCB1cmwgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQlWYXJpYW50IHBvc3REYXRhID0gZXZlbnQuYXJndW1lbnRzWzRdOwotCQkJaWYgKHBvc3REYXRhICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3REYXRhID0gIityZWFkU2FmZUFycmF5KHBvc3REYXRhKSsiLCBVUkwgPSAiK3VybC5nZXRTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byB0aGlzIHdlYiBzaXRlIHdoaWNoIHVzZXMgcG9zdCBkYXRhIHRvIGZpbGwgaW4gdGhlIHRleHQgZmllbGQKLQkvLyBhbmQgcHV0IHRoZSBzdHJpbmcgImhlbGxvIHdvcmxkIiBpbnRvIHRoZSB0ZXh0IGJveAotCXRleHQuc2V0VGV4dCgiZmlsZTovLyIrU25pcHBldDE4Ni5jbGFzcy5nZXRSZXNvdXJjZSgiU25pcHBldDE4Ni5odG1sIikuZ2V0RmlsZSgpKTsKLQlpbnRbXSByZ2Rpc3BpZCA9IGF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCIsICJQb3N0RGF0YSJ9KTsgCi0JaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwkKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMl07Ci0Jcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodGV4dC5nZXRUZXh0KCkpOwotCXJndmFyZ1sxXSA9IHdyaXRlU2FmZUFycmF5KCJoZWxsbyB3b3JsZCIpOwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsyXTsKLQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOwotCXJnZGlzcGlkTmFtZWRBcmdzWzFdID0gcmdkaXNwaWRbMl07Ci0JYXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIHN0cnVjdHMgYXJlIGFjY2Vzc2VkIGluIHRoZSByZWFkU2FmZUFycmF5IGFuZCB3cml0ZVNhZmVBcnJheQotLy8gZnVuY3Rpb25zOgotLy8KLS8vIFZBUklBTlQ6Ci0vLyAJCXNob3J0IHZ0Ci0vLyAJCXNob3J0IHdSZXNlcnZlZDEKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMgotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQzCi0vLyAJCWludCBwYXJyYXkKLS8vCi0vLyBTQUZFQVJSQVk6Ci0vLyAgICAgIHNob3J0IGNEaW1zICAgICAgLy8gQ291bnQgb2YgZGltZW5zaW9ucyBpbiB0aGlzIGFycmF5Ci0vLyAgICAgIHNob3J0IGZGZWF0dXJlcyAgLy8gRmxhZ3MgdXNlZCBieSB0aGUgU2FmZUFycmF5Ci0vLyAgICAgIGludCBjYkVsZW1lbnRzICAgLy8gU2l6ZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBhcnJheQotLy8gICAgICBpbnQgY0xvY2tzICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyB0aGUgYXJyYXkgaGFzIGJlZW4gbG9ja2VkIHdpdGhvdXQgY29ycmVzcG9uZGluZyB1bmxvY2sKLS8vICAgICAgaW50IHB2RGF0YSAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkYXRhCi0vLyAgICAgIFNBRkVBUlJBWUJPVU5EW10gcmdzYWJvdW5kIC8vIE9uZSBib3VuZCBmb3IgZWFjaCBkaW1lbnNpb24KLS8vCi0vLyBTQUZFQVJSQVlCT1VORDoKLS8vICAgICAgaW50IGNFbGVtZW50cyAgICAvLyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkaW1lbnNpb24KLS8vICAgICAgaW50IGxMYm91bmQgICAgICAvLyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGRpbWVuc2lvbiAKLQotc3RhdGljIFN0cmluZyByZWFkU2FmZUFycmF5KFZhcmlhbnQgdmFyaWFudEJ5UmVmKSB7Ci0JLy8gUmVhZCBhIHNhZmVhcnJheSB0aGF0IGNvbnRhaW5zIGRhdGEgb2YgCi0JLy8gdHlwZSBWVF9VSTEgKHVuc2lnbmVkIHNob3J0cykgd2hpY2ggY29udGFpbnMKLQkvLyBhIHRleHQgc3RyZWFtLgotICAgIGludCBwUG9zdERhdGEgPSB2YXJpYW50QnlSZWYuZ2V0QnlSZWYoKTsKLSAgICBzaG9ydFtdIHZ0X3R5cGUgPSBuZXcgc2hvcnRbMV07Ci0gICAgT1MuTW92ZU1lbW9yeSh2dF90eXBlLCBwUG9zdERhdGEsIDIpOwotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGlmICh2dF90eXBlWzBdID09IChzaG9ydCkoT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQpKSB7Ci0gICAgICAgIGludFtdIHBWYXJpYW50ID0gbmV3IGludFsxXTsKLSAgICAgICAgT1MuTW92ZU1lbW9yeShwVmFyaWFudCwgcFBvc3REYXRhICsgOCwgNCk7Ci0gICAgICAgIHZ0X3R5cGUgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkodnRfdHlwZSwgcFZhcmlhbnRbMF0sIDIpOwotICAgICAgICBpZiAodnRfdHlwZVswXSA9PSAoc2hvcnQpKE9MRS5WVF9BUlJBWSB8IE9MRS5WVF9VSTEpKSB7Ci0gICAgICAgICAgICBpbnRbXSBwU2FmZWFycmF5ID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocFNhZmVhcnJheSwgcFZhcmlhbnRbMF0gKyA4LCA0KTsKLSAgICAgICAgICAgIHNob3J0W10gY0RpbXMgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KGNEaW1zLCBwU2FmZWFycmF5WzBdLCAyKTsKLSAgICAgICAgICAgIGludFtdIHB2RGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHB2RGF0YSwgcFNhZmVhcnJheVswXSArIDEyLCA0KTsKLSAgICAgICAgICAgIGludCBzYWZlYXJyYXlib3VuZE9mZnNldCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNEaW1zWzBdOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBjRWxlbWVudHMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoY0VsZW1lbnRzLCBwU2FmZWFycmF5WzBdICsgMTYgKyBzYWZlYXJyYXlib3VuZE9mZnNldCwgNCk7Ci0gICAgICAgICAgICAgICAgc2FmZWFycmF5Ym91bmRPZmZzZXQgKz0gODsKLSAgICAgICAgICAgICAgICBpbnQgY2NoV2lkZUNoYXIgPSBPUy5NdWx0aUJ5dGVUb1dpZGVDaGFyIChDb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsICBwdkRhdGFbMF0sIC0xLCBudWxsLCAwKTsKLQkJCQlpZiAoY2NoV2lkZUNoYXIgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQkJY2hhcltdIGxwV2lkZUNoYXJTdHIgPSBuZXcgY2hhciBbY2NoV2lkZUNoYXIgLSAxXTsKLQkJCQlPUy5NdWx0aUJ5dGVUb1dpZGVDaGFyIChDb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsICBwdkRhdGFbMF0sIC0xLCBscFdpZGVDaGFyU3RyLCBscFdpZGVDaGFyU3RyLmxlbmd0aCk7Ci0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhscFdpZGVDaGFyU3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgVmFyaWFudCB3cml0ZVNhZmVBcnJheSAoU3RyaW5nIHN0cmluZykgewotCS8vIENyZWF0ZSBhIG9uZSBkaW1lbnNpb25hbCBzYWZlYXJyYXkgY29udGFpbmluZyB0d28gVlRfVUkxIHZhbHVlcwotCS8vIHdoZXJlIFZUX1VJMSBpcyBhbiB1bnNpZ25lZCBjaGFyCi0JCi0JLy8gRGVmaW5lIGNEaW1zLCBmRmVhdHVyZXMgYW5kIGNiRWxlbWVudHMKLQlzaG9ydCBjRGltcyA9IDE7Ci0Jc2hvcnQgRkFERl9GSVhFRFNJWkUgPSAweDEwOwotCXNob3J0IEZBREZfSEFWRVZBUlRZUEUgPSAweDgwOwotCXNob3J0IGZGZWF0dXJlcyA9IChzaG9ydCkoRkFERl9GSVhFRFNJWkUgfCBGQURGX0hBVkVWQVJUWVBFKTsKLQlpbnQgY2JFbGVtZW50cyA9IDE7Ci0JLy8gQ3JlYXRlIGEgcG9pbnRlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0Ci0JaW50IGNvdW50ID0gc3RyaW5nLmxlbmd0aCgpOwotCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0Jc3RyaW5nLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JaW50IGNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7Ci0JaWYgKGNjaE11bHRpQnl0ZSA9PSAwKSByZXR1cm4gbnVsbDsKLQlpbnQgcHZEYXRhID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIGNjaE11bHRpQnl0ZSk7Ci0JT1MuV2lkZUNoYXJUb011bHRpQnl0ZShDb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBwdkRhdGEsIGNjaE11bHRpQnl0ZSwgbnVsbCwgbnVsbCk7Ci0JaW50IGNFbGVtZW50czEgPSBjY2hNdWx0aUJ5dGU7Ci0JaW50IGxMYm91bmQxID0gMDsKLQkvLyBDcmVhdGUgYSBzYWZlYXJyYXkgaW4gbWVtb3J5Ci0JLy8gMTIgYnl0ZXMgZm9yIGNEaW1zLCBmRmVhdHVyZXMgYW5kIGNiRWxlbWVudHMgKyA0IGJ5dGVzIGZvciBwdkRhdGEgKyBudW1iZXIgb2YgZGltZW5zaW9ucyAqIChzaXplIG9mIHNhZmVhcnJheWJvdW5kKQotCWludCBzaXplb2ZTYWZlQXJyYXkgPSAxMiArIDQgKyAxKjg7Ci0JaW50IHBTYWZlQXJyYXkgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgc2l6ZW9mU2FmZUFycmF5KTsKLQkvLyBDb3B5IHRoZSBkYXRhIGludG8gdGhlIHNhZmUgYXJyYXkKLQlpbnQgb2Zmc2V0ID0gMDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBzaG9ydFtdIHtjRGltc30sIDIpOyBvZmZzZXQgKz0gMjsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBzaG9ydFtdIHtmRmVhdHVyZXN9LCAyKTsgb2Zmc2V0ICs9IDI7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2NiRWxlbWVudHN9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10gezB9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge3B2RGF0YX0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7Y0VsZW1lbnRzMX0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7bExib3VuZDF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JLy8gQ3JlYXRlIGEgdmFyaWFudCBpbiBtZW1vcnkgdG8gaG9sZCB0aGUgc2FmZWFycmF5Ci0JaW50IHBWYXJpYW50ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIFZhcmlhbnQuc2l6ZW9mKTsKLQlzaG9ydCB2dCA9IChzaG9ydCkoT0xFLlZUX0FSUkFZIHwgT0xFLlZUX1VJMSk7Ci0JT1MuTW92ZU1lbW9yeShwVmFyaWFudCwgbmV3IHNob3J0W10ge3Z0fSwgMik7Ci0JT1MuTW92ZU1lbW9yeShwVmFyaWFudCArIDgsIG5ldyBpbnRbXXtwU2FmZUFycmF5fSwgNCk7Ci0JLy8gQ3JlYXRlIGEgYnkgcmVmIHZhcmlhbnQKLQlWYXJpYW50IHZhcmlhbnRCeVJlZiA9IG5ldyBWYXJpYW50KHBWYXJpYW50LCAoc2hvcnQpKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSk7Ci0JcmV0dXJuIHZhcmlhbnRCeVJlZjsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMjc2Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08SFRNTD4KLSAgPEhFQUQ+Ci0gICAgPFRJVExFPkV2YWx1YXRlPC9USVRMRT4KLQk8cD5UZXN0IGZvciBJRSBTY3JpcHQ8L3A+Ci0gICAgPFNDUklQVD4KLSAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlKHgpCi0gICAgICB7Ci0gICAgICAgICBhbGVydCgiaGVsbG8iKQotICAgICAgICAgcmV0dXJuIGV2YWwoeCkKLSAgICAgIH0KLSAgIDwvU0NSSVBUPgotICA8L0hFQUQ+Ci0KLSAgPEJPRFk+Ci0gIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMDE2Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFJ1bm5pbmcgYSBzY3JpcHQgd2l0aGluIElFLiAod2luMzIgb25seSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBJV2ViQnJvd3NlcgotCWZpbmFsIE9sZUF1dG9tYXRpb24gd2ViQnJvd3NlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQotCS8vIFdoZW4gdGhlIGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZQotCS8vIGFuZCBldmFsdXRlIGV4cHJlc3Npb24gdXNpbmcgU2NyaXB0LgotCWludCBEb3dubG9hZENvbXBsZXRlID0gMTA0OwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJaW50W10gaHRtbERvY3VtZW50SUQgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJEb2N1bWVudCJ9KTsgCi0JCQlpZiAoaHRtbERvY3VtZW50SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gd2ViQnJvd3Nlci5nZXRQcm9wZXJ0eShodG1sRG9jdW1lbnRJRFswXSk7Ci0JCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCS8vSUhUTUxEb2N1bWVudDIKLQkJCU9sZUF1dG9tYXRpb24gaHRtbERvY3VtZW50ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaHRtbERvY3VtZW50ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCi0JCQkJaW50W10gc2NyaXB0SUQgPSBodG1sRG9jdW1lbnQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlNjcmlwdCJ9KTsgCi0JCQkJaWYgKHNjcmlwdElEID09IG51bGwpIHJldHVybjsKLQkJCQlwVmFyUmVzdWx0ID0gaHRtbERvY3VtZW50LmdldFByb3BlcnR5KHNjcmlwdElEWzBdKTsKLQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQlPbGVBdXRvbWF0aW9uIGh0bWxXaW5kb3cgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vSUhUTUxXaW5kb3cyCi0JCQkJCWh0bWxXaW5kb3cgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQkJCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJCWludFtdIGV2YWx1YXRlSUQgPSBodG1sV2luZG93LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsiZXZhbHVhdGUifSk7Ci0JCQkJCWlmIChldmFsdWF0ZUlEID09IG51bGwpIHJldHVybjsKLQkJCQkJU3RyaW5nIGV4cHJlc3Npb24gPSAiNStNYXRoLnNpbig5KSI7Ci0JCQkJCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudChleHByZXNzaW9uKX07Ci0JCQkJCXBWYXJSZXN1bHQgPSBodG1sV2luZG93Lmludm9rZShldmFsdWF0ZUlEWzBdLCByZ3ZhcmcsIG51bGwpOwotCQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4cHJlc3Npb24rIiA9IitwVmFyUmVzdWx0LmdldFN0cmluZygpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlodG1sV2luZG93LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWh0bWxEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byBhIHdlYiBzaXRlCi0JaW50W10gaWRzID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sIil9OwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFtde2lkc1sxXX07Ci0Jd2ViQnJvd3Nlci5pbnZva2UoaWRzWzBdLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwNDRjMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2Nyb2xsIGEgd2lkZ2V0IGludG8gdmlldyBvbiBmb2N1cyBpbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0Jc2Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0JYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMTAsIHRydWUpKTsKLQlmb3IgKGludCBpID0gMCA7IGkgPCAzMDA7IGkrKykgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCQliLnNldFRleHQoIkJ1dHRvbiAiK2kpOwotCX0KLQlzYy5zZXRDb250ZW50KGMpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Muc2V0TWluU2l6ZShjLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUNvbnRyb2wgY2hpbGQgPSAoQ29udHJvbCllLndpZGdldDsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjaGlsZC5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBhcmVhID0gc2MuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgb3JpZ2luID0gc2MuZ2V0T3JpZ2luKCk7Ci0JCQlpZiAob3JpZ2luLnggPiBib3VuZHMueCkgb3JpZ2luLnggPSBNYXRoLm1heCgwLCBib3VuZHMueCk7Ci0JCQlpZiAob3JpZ2luLnkgPiBib3VuZHMueSkgb3JpZ2luLnkgPSBNYXRoLm1heCgwLCBib3VuZHMueSk7Ci0JCQlpZiAob3JpZ2luLnggKyBhcmVhLndpZHRoIDwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpIG9yaWdpbi54ID0gTWF0aC5tYXgoMCwgYm91bmRzLnggKyBib3VuZHMud2lkdGggLSBhcmVhLndpZHRoKTsKLQkJCWlmIChvcmlnaW4ueSArIGFyZWEuaGVpZ2h0IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSBvcmlnaW4ueSA9IE1hdGgubWF4KDAsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIGFyZWEuaGVpZ2h0KTsKLQkJCXNjLnNldE9yaWdpbihvcmlnaW4pOwotCQl9Ci0JfTsKLQlDb250cm9sW10gY29udHJvbHMgPSBjLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQljb250cm9sc1tpXS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlzaGVsbC5zZXRTaXplKDMwMCwgNTAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYzMGIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODkgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlN0eWxlZFRleHQgd2l0aCB1bmRlcmxpbmUgYW5kIHN0cmlrZSB0aHJvdWdoIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5IEFCQ0RFRkdISUpLTE0gTk9QUVJTVFVWV1hZWiIpOwotCS8vIG1ha2UgMDEyMzQ1Njc4OSBhcHBlYXIgdW5kZXJsaW5lZAotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTEuc3RhcnQgPSAwOwotCXN0eWxlMS5sZW5ndGggPSAxMDsKLQlzdHlsZTEudW5kZXJsaW5lID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUxKTsKLQkvLyBtYWtlIEFCQ0RFRkdISUpLTE0gaGF2ZSBhIHN0cmlrZSB0aHJvdWdoCi0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5zdGFydCA9IDExOwotCXN0eWxlMi5sZW5ndGggPSAxMzsKLQlzdHlsZTIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogYXBwZWFyIHVuZGVybGluZWQgYW5kIGhhdmUgYSBzdHJpa2UgdGhyb3VnaAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLnVuZGVybGluZSA9IHRydWU7Ci0Jc3R5bGUzLnN0cmlrZW91dCA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMyk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjkxNjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHZlcmlmeSBpbnB1dCAob25seSBhbGxvdyBkaWdpdHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBlLnRleHQ7Ci0JCQljaGFyIFtdIGNoYXJzID0gbmV3IGNoYXIgW3N0cmluZy5sZW5ndGggKCldOwotCQkJc3RyaW5nLmdldENoYXJzICgwLCBjaGFycy5sZW5ndGgsIGNoYXJzLCAwKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghKCcwJyA8PSBjaGFycyBbaV0gJiYgY2hhcnMgW2ldIDw9ICc5JykpIHsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDcxYzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiBTcGlubmVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU3Bpbm5lciB3aXRoIGZsb2F0IHZhbHVlcyIpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5PTkUpOwotCS8vIGFsbG93IDMgZGVjaW1hbCBwbGFjZXMKLQlzcGlubmVyLnNldERpZ2l0cygzKTsKLQkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMC4wMDEKLQlzcGlubmVyLnNldE1pbmltdW0oMSk7Ci0JLy8gc2V0IHRoZSBtYXhpbXVtIHZhbHVlIHRvIDIwCi0Jc3Bpbm5lci5zZXRNYXhpbXVtKDIwMDAwKTsKLQkvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAxMAotCXNwaW5uZXIuc2V0SW5jcmVtZW50KDEwKTsKLQkvLyBzZXQgdGhlIHNlbGV0aW9uIHRvIDMuNDU2Ci0Jc3Bpbm5lci5zZXRTZWxlY3Rpb24oMzQ1Nik7Ci0Jc3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHNlbGVjdGlvbiA9IHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpbnQgZGlnaXRzID0gc3Bpbm5lci5nZXREaWdpdHMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VsZWN0aW9uIGlzICIrKHNlbGVjdGlvbiAvIE1hdGgucG93KDEwLCBkaWdpdHMpKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWMxYTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRGV0ZWN0IHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhIHRleHQgY29udHJvbAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkxIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MzI7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoaSArICItVGhpcyBpcyBhIGxpbmUgb2YgdGV4dCBpbiBhIHdpZGdldC0iICsgaSArICJcbiIpOwotCX0KLQl0ZXh0LnNldFNlbGVjdGlvbiAoMCk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlpbnQgbGFzdEluZGV4ID0gdGV4dC5nZXRUb3BJbmRleCAoKTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCBpbmRleCA9IHRleHQuZ2V0VG9wSW5kZXggKCk7Ci0JCQlpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7Ci0JCQkJbGFzdEluZGV4ID0gaW5kZXg7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2Nyb2xsZWQsIHRvcEluZGV4PSIgKyBpbmRleCk7Ci0JCQl9Ci0JCX0KLQl9OwotCS8qIE5PVEU6IE9ubHkgZGV0ZWN0cyBzY3JvbGxpbmcgYnkgdGhlIHVzZXIgKi8KLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuS2V5VXAsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0JU2Nyb2xsQmFyIGhCYXIgPSB0ZXh0LmdldEhvcml6b250YWxCYXIoKTsKLQlpZiAoaEJhciAhPSBudWxsKSB7Ci0JCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0JU2Nyb2xsQmFyIHZCYXIgPSB0ZXh0LmdldFZlcnRpY2FsQmFyKCk7Ci0JaWYgKHZCYXIgIT0gbnVsbCkgewotCQl2QmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCXNoZWxsLnNldFNpemUgKHNpemUuIHggLSAzMiwgc2l6ZS55IC8gMik7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4ZDZkMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBTaG93IGEgc29ydCBpbmRpY2F0b3IgaW4gdGhlIGNvbHVtbiBoZWFkZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkyIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkvLyBpbml0aWFsaXplIGRhdGEgd2l0aCBrZXlzIGFuZCByYW5kb20gdmFsdWVzCi0JaW50IHNpemUgPSAxMDA7Ci0JUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQlmaW5hbCBpbnRbXVtdIGRhdGEgPSBuZXcgaW50W3NpemVdW107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWRhdGFbaV0gPSBuZXcgaW50W10ge2ksIHJhbmRvbS5uZXh0SW50KCl9OwotCX0KLQkvLyBjcmVhdGUgYSB2aXJ0dWFsIHRhYmxlIHRvIGRpc3BsYXkgZGF0YQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVklSVFVBTCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0SXRlbUNvdW50KHNpemUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIktleSIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJWYWx1ZSIpOwotCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQlpbnRbXSBkYXR1bSA9IGRhdGFbaW5kZXhdOwotCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7SW50ZWdlci50b1N0cmluZyhkYXR1bVswXSksCi0JCQkJCUludGVnZXIudG9TdHJpbmcoZGF0dW1bMV0pIH0pOwotCQl9Ci0JfSk7Ci0JLy8gQWRkIHNvcnQgaW5kaWNhdG9yIGFuZCBzb3J0IGRhdGEgd2hlbiBjb2x1bW4gc2VsZWN0ZWQKLQlMaXN0ZW5lciBzb3J0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCS8vIGRldGVybWluZSBuZXcgc29ydCBjb2x1bW4gYW5kIGRpcmVjdGlvbgotCQkJVGFibGVDb2x1bW4gc29ydENvbHVtbiA9IHRhYmxlLmdldFNvcnRDb2x1bW4oKTsKLQkJCVRhYmxlQ29sdW1uIGN1cnJlbnRDb2x1bW4gPSAoVGFibGVDb2x1bW4pIGUud2lkZ2V0OwotCQkJaW50IGRpciA9IHRhYmxlLmdldFNvcnREaXJlY3Rpb24oKTsKLQkJCWlmIChzb3J0Q29sdW1uID09IGN1cnJlbnRDb2x1bW4pIHsKLQkJCQlkaXIgPSBkaXIgPT0gU1dULlVQID8gU1dULkRPV04gOiBTV1QuVVA7Ci0JCQl9IGVsc2UgewotCQkJCXRhYmxlLnNldFNvcnRDb2x1bW4oY3VycmVudENvbHVtbik7Ci0JCQkJZGlyID0gU1dULlVQOwotCQkJfQotCQkJLy8gc29ydCB0aGUgZGF0YSBiYXNlZCBvbiBjb2x1bW4gYW5kIGRpcmVjdGlvbgotCQkJZmluYWwgaW50IGluZGV4ID0gY3VycmVudENvbHVtbiA9PSBjb2x1bW4xID8gMCA6IDE7Ci0JCQlmaW5hbCBpbnQgZGlyZWN0aW9uID0gZGlyOwotCQkJQXJyYXlzLnNvcnQoZGF0YSwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQlpbnRbXSBhID0gKGludFtdKSBhcmcwOwotCQkJCQlpbnRbXSBiID0gKGludFtdKSBhcmcxOwotCQkJCQlpZiAoYVtpbmRleF0gPT0gYltpbmRleF0pIHJldHVybiAwOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IFNXVC5VUCkgewotCQkJCQkJcmV0dXJuIGFbaW5kZXhdIDwgYltpbmRleF0gPyAtMSA6IDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGFbaW5kZXhdIDwgYltpbmRleF0gPyAxIDogLTE7Ci0JCQkJfQotCQkJfSk7Ci0JCQkvLyB1cGRhdGUgZGF0YSBkaXNwbGF5ZWQgaW4gdGFibGUKLQkJCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oZGlyKTsKLQkJCXRhYmxlLmNsZWFyQWxsKCk7Ci0JCX0KLQl9OwotCWNvbHVtbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLQljb2x1bW4yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0JdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4xKTsKLQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLngsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBiNjVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogYWxsb3cgdXNlciB0byByZW9yZGVyIGNvbHVtbnMgYnkgZHJhZ2dpbmcgYW5kIHByb2dyYW1tYXRpY2FsbHkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSgtMSwgMzAwKSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMCIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMyIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiA0Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIHRleHQgPSBuZXcgU3RyaW5nW117aSsiOjAiLCBpKyI6MSIsIGkrIjoyIiwgaSsiOjMiLCBpKyI6NCJ9OwotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQl0ZXh0ID0gbmV3IFN0cmluZ1tde2krIiwiK2orIjowIiwgaSsiLCIraisiOjEiLCBpKyIsIitqKyI6MiIsIGkrIiwiK2orIjozIiwgaSsiLCIraisiOjQifTsKLQkJCQlzdWJJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCA1OyBrKyspIHsKLQkJCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCXRleHQgPSBuZXcgU3RyaW5nW117aSsiLCIraisiLCIraysiOjAiLCBpKyIsIitqKyIsIitrKyI6MSIsIGkrIiwiK2orIiwiK2srIjoyIiwgaSsiLCIraisiLCIraysiOjMiLCBpKyIsIitqKyIsIitrKyI6NCJ9OwotCQkJCQlzdWJzdWJJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW92ZSAiK2Uud2lkZ2V0KTsKLQkJCX0KLQkJfTsKLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zW2ldLnNldFdpZHRoKDEwMCk7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHRydWUpOwotCQkJY29sdW1uc1tpXS5hZGRMaXN0ZW5lcihTV1QuTW92ZSwgbGlzdGVuZXIpOwotCQl9Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludmVydCBjb2x1bW4gb3JkZXIiKTsKLQkJYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50W10gb3JkZXIgPSB0cmVlLmdldENvbHVtbk9yZGVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGggLyAyOyBpKyspIHsKLQkJCQkJaW50IHRlbXAgPSBvcmRlcltpXTsKLQkJCQkJb3JkZXJbaV0gPSBvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV07Ci0JCQkJCW9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXSA9IHRlbXA7Ci0JCQkJfQotCQkJCXRyZWUuc2V0Q29sdW1uT3JkZXIob3JkZXIpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2MjUzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogV3JpdGUgYW4gYW5pbWF0ZWQgR0lGIHRvIGEgZmlsZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk0IHsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JQ29sb3Igd2hpdGUsIHJlZCwgZ3JlZW4sIGJsdWU7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQlGb250IGZvbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTk0KCkucnVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVJHQiB3aGl0ZVJHQiA9IG5ldyBSR0IoMHhmZiwgMHhmZiwgMHhmZik7Ci0JCVJHQiByZWRSR0IgPSBuZXcgUkdCKDB4ZmYsIDAsIDApOwotCQlSR0IgZ3JlZW5SR0IgPSBuZXcgUkdCKDAsIDB4ZmYsIDApOwotCQlSR0IgYmx1ZVJHQiA9IG5ldyBSR0IoMCwgMCwgMHhmZik7Ci0JCXBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHsKLQkJCQl3aGl0ZVJHQiwJLy8gMAotCQkJCXJlZFJHQiwJCS8vIDEKLQkJCQlncmVlblJHQiwJLy8gMgotCQkJCWJsdWVSR0IgfSk7CS8vIDMKLQkJd2hpdGUgPSBuZXcgQ29sb3IoZGlzcGxheSwgd2hpdGVSR0IpOwotCQlyZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmVkUkdCKTsKLQkJZ3JlZW4gPSBuZXcgQ29sb3IoZGlzcGxheSwgZ3JlZW5SR0IpOwotCQlibHVlID0gbmV3IENvbG9yKGRpc3BsYXksIGJsdWVSR0IpOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvbWljIFNhbnMgTVMiLCAyNCwgU1dULkJPTEQpOwotCQkKLQkJSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZURhdGFbNF07Ci0JCWRhdGFbMF0gPSBuZXdGcmFtZSgiIiwgIHdoaXRlLCBmYWxzZSwgMCwgMCwgMTAxLCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzFdID0gbmV3RnJhbWUoIlMiLCByZWQsICAgdHJ1ZSwgIDAsIDAsICAzMCwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVsyXSA9IG5ld0ZyYW1lKCJXIiwgZ3JlZW4sIHRydWUsIDI4LCAwLCAgMzksIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbM10gPSBuZXdGcmFtZSgiVCIsIGJsdWUsICB0cnVlLCA2OSwgMCwgIDMyLCA1NSwgU1dULkRNX0ZJTExfQkFDS0dST1VORCwgMjAwKTsKLQkJCi0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQlsb2FkZXIuZGF0YSA9IGRhdGE7Ci0JCWxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwgPSAwOwotCQlsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA9IGRhdGFbMF0uaGVpZ2h0OwotCQlsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID0gZGF0YVswXS53aWR0aDsKLQkJbG9hZGVyLnJlcGVhdENvdW50ID0gMDsgLy8gcnVuIGZvcmV2ZXIKLQkJbG9hZGVyLnNhdmUoInN3dC5naWYiLCBTV1QuSU1BR0VfR0lGKTsKLQotCQl3aGl0ZS5kaXNwb3NlKCk7Ci0JCXJlZC5kaXNwb3NlKCk7Ci0JCWdyZWVuLmRpc3Bvc2UoKTsKLQkJYmx1ZS5kaXNwb3NlKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlJbWFnZURhdGEgbmV3RnJhbWUoU3RyaW5nIGxldHRlciwgQ29sb3IgY29sb3IsIGJvb2xlYW4gdHJhbnNwYXJlbnQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpIHsKLQkJSW1hZ2VEYXRhIHRlbXAgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDIsIHBhbGV0dGUpOyAvLyA0LWNvbG9yIHBhbGV0dGUgaGFzIGRlcHRoIDIKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgdGVtcCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5kcmF3U3RyaW5nKGxldHRlciwgNSwgNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJSW1hZ2VEYXRhIGZyYW1lID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmICh0cmFuc3BhcmVudCkgZnJhbWUudHJhbnNwYXJlbnRQaXhlbCA9IDA7IC8vIHdoaXRlCi0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZnJhbWUueCA9IHg7Ci0JCWZyYW1lLnkgPSB5OwotCQlmcmFtZS5kaXNwb3NhbE1ldGhvZCA9IGRpc3Bvc2FsTWV0aG9kOwotCQlmcmFtZS5kZWxheVRpbWUgPSBkZWxheVRpbWU7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZmNmYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBMV0pHTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTDExOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuZ2x1LkdMVTsKLWltcG9ydCBvcmcubHdqZ2wuTFdKR0xFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk1IHsKLQlzdGF0aWMgdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmLCBjb3NUaGV0YSA9IDEuMGYsIHNpblRoZXRhID0gMC4wZjsKLQkJZm9yIChpbnQgaSA9IHJpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWZsb2F0IHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOwotCQkJZmxvYXQgY29zVGhldGExID0gKGZsb2F0KSBNYXRoLmNvcyh0aGV0YTEpOwotCQkJZmxvYXQgc2luVGhldGExID0gKGZsb2F0KSBNYXRoLnNpbih0aGV0YTEpOwotCQkJR0wxMS5nbEJlZ2luKEdMMTEuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhMSAqIGRpc3QsIC1zaW5UaGV0YTEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCUdMMTEuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhICgpOwotCQlkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0JCWZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcyhjb21wLCBTV1QuTk9ORSwgZGF0YSk7Ci0KLQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJdHJ5IHsKLQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCX0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0KLQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQlmbG9hdCBmQXNwZWN0ID0gKGZsb2F0KSBib3VuZHMud2lkdGggLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQl0cnkgewotCQkJCQlHTENvbnRleHQudXNlQ29udGV4dChjYW52YXMpOwotCQkJCX0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJR0wxMS5nbFZpZXdwb3J0KDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9QUk9KRUNUSU9OKTsKLQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJR0xVLmdsdVBlcnNwZWN0aXZlKDQ1LjBmLCBmQXNwZWN0LCAwLjVmLCA0MDAuMGYpOwotCQkJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKLQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdMMTEuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTDExLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wxMS5nbEhpbnQoR0wxMS5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMMTEuR0xfTklDRVNUKTsKLQkJR0wxMS5nbENsZWFyRGVwdGgoMS4wKTsKLQkJR0wxMS5nbExpbmVXaWR0aCgyKTsKLQkJR0wxMS5nbEVuYWJsZShHTDExLkdMX0RFUFRIX1RFU1QpOwotCi0JCXNoZWxsLnNldFRleHQoIlNXVC9MV0pHTCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldFNpemUoNjQwLCA0ODApOwotCQlzaGVsbC5vcGVuKCk7Ci0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJaW50IHJvdCA9IDA7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlHTENvbnRleHQudXNlQ29udGV4dChjYW52YXMpOwotCQkJCQl9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCQkJCQlHTDExLmdsQ2xlYXIoR0wxMS5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wxMS5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJCQkJR0wxMS5nbENsZWFyQ29sb3IoLjNmLCAuNWYsIC44ZiwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQkJR0wxMS5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTEwLjBmKTsKLQkJCQkJZmxvYXQgZnJvdCA9IHJvdDsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4xNWYgKiByb3QsIDIuMGYgKiBmcm90LCAxMC4wZiAqIGZyb3QsIDEuMGYpOwotCQkJCQlHTDExLmdsUm90YXRlZigwLjNmICogcm90LCAzLjBmICogZnJvdCwgMS4wZiAqIGZyb3QsIDEuMGYpOwotCQkJCQlyb3QrKzsKLQkJCQkJR0wxMS5nbFBvbHlnb25Nb2RlKEdMMTEuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMMTEuR0xfTElORSk7Ci0JCQkJCUdMMTEuZ2xDb2xvcjNmKDAuOWYsIDAuOWYsIDAuOWYpOwotCQkJCQlkcmF3VG9ydXMoMSwgMS45ZiArICgoZmxvYXQpIE1hdGguc2luKCgwLjAwNGYgKiBmcm90KSkpLCAxNSwgMTUpOwotCQkJCQljYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWModGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDgxZDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogdXNlIGEgcmVndWxhciBleHByZXNzaW9uIHRvIHZlcmlmeSBpbnB1dAotICogSW4gdGhpcyBjYXNlIGEgcGhvbmUgbnVtYmVyIGlzIHVzZWQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NiB7Ci0JLyoKLQkgKiBQaG9uZSBudW1iZXJzIGZvbGxvdyB0aGUgcnVsZSBbKF1bMS05XVsxLTldWzEtOV1bKV1bMS05XVsxLTldWzEtOV1bLV1bMS05XVsxLTldWzEtOV1bMS05XQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWCA9ICJbKF1cXGR7M31bKV1cXGR7M31bLV1cXGR7NH0iOyAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSA9ICIoIyMjKSMjIy0jIyMjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0VGV4dCA9ICIoMDAwKTAwMC0wMDAwIjsgLy8kTk9OLU5MUy0xJAotCQotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ291cmllciBOZXciLCAxMCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JdGV4dC5zZXRGb250KGZvbnQpOwotCXRleHQuc2V0VGV4dCh0ZW1wbGF0ZSk7CQotCXRleHQuYWRkTGlzdGVuZXIoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyKCkgewotCQkvL2NyZWF0ZSB0aGUgcGF0dGVybiBmb3IgdmVyaWZpY2F0aW9uCi0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShSRUdFWCk7CQotCQkvL2lnbm9yZSBldmVudCB3aGVuIGNhdXNlZCBieSBpbnNlcnRpbmcgdGV4dCBpbnNpZGUgZXZlbnQgaGFuZGxlcgotCQlib29sZWFuIGlnbm9yZTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZSkgcmV0dXJuOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlpZiAoZS5zdGFydCA+IDEzIHx8IGUuZW5kID4gMTQpIHJldHVybjsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGUudGV4dCk7Ci0JCQkKLQkJCS8vaGFuZGxlIGJhY2tzcGFjZQotCQkJaWYgKGUuY2hhcmFjdGVyID09ICdcYicpIHsKLQkJCQlmb3IgKGludCBpID0gZS5zdGFydDsgaSA8IGUuZW5kOyBpKyspIHsKLQkJCQkJLy8gc2tpcCBvdmVyIHNlcGFyYXRvcnMKLQkJCQkJc3dpdGNoIChpKSB7Ci0JCQkJCQljYXNlIDA6IAotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlpZiAoZS5zdGFydCArIDEgPT0gZS5lbmQpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChuZXcgY2hhciBbXSB7JyMnLCcpJ30pOwotCQkJCQkJCQllLnN0YXJ0LS07Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgODoKLQkJCQkJCQlpZiAoZS5zdGFydCArIDEgPT0gZS5lbmQpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChuZXcgY2hhciBbXSB7JyMnLCctJ30pOwotCQkJCQkJCQllLnN0YXJ0LS07Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnLScpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6IGJ1ZmZlci5hcHBlbmQoJyMnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0LnNldFNlbGVjdGlvbihlLnN0YXJ0LCBlLnN0YXJ0ICsgYnVmZmVyLmxlbmd0aCgpKTsKLQkJCQlpZ25vcmUgPSB0cnVlOwotCQkJCXRleHQuaW5zZXJ0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCQkvLyBtb3ZlIGN1cnNvciBiYWNrd2FyZHMgb3ZlciBzZXBhcmF0b3JzCi0JCQkJaWYgKGUuc3RhcnQgPT0gNSB8fCBlLnN0YXJ0ID09IDkpIGUuc3RhcnQtLTsKLQkJCQl0ZXh0LnNldFNlbGVjdGlvbihlLnN0YXJ0LCBlLnN0YXJ0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihkZWZhdWx0VGV4dCk7Ci0JCQljaGFyW10gY2hhcnMgPSBlLnRleHQudG9DaGFyQXJyYXkoKTsKLQkJCWludCBpbmRleCA9IGUuc3RhcnQgLSAxOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlLnRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJCWluZGV4Kys7Ci0JCQkJc3dpdGNoIChpbmRleCkgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJygnKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICcpJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgODoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnLScpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoaW5kZXggPj0gbmV3VGV4dC5sZW5ndGgoKSkgcmV0dXJuOwotCQkJCW5ld1RleHQuc2V0Q2hhckF0KGluZGV4LCBjaGFyc1tpXSk7Ci0JCQl9Ci0JCQkvLyBpZiB0ZXh0IGlzIHNlbGVjdGVkLCBkbyBub3QgcGFzdGUgYmV5b25kIHJhbmdlIG9mIHNlbGVjdGlvbgotCQkJaWYgKGUuc3RhcnQgPCBlLmVuZCAmJiBpbmRleCArIDEgIT0gZS5lbmQpIHJldHVybjsKLQkJCU1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihuZXdUZXh0KTsKLQkJCWlmIChtYXRjaGVyLmxvb2tpbmdBdCgpKSB7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgaW5kZXggKyAxKTsKLQkJCQlpZ25vcmUgPSB0cnVlOwotCQkJCXRleHQuaW5zZXJ0KG5ld1RleHQuc3Vic3RyaW5nKGUuc3RhcnQsIGluZGV4ICsgMSkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JfSk7Ci0JCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MDliYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhdyB3cmFwcGVkIHRleHQgdXNpbmcgVGV4dExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NyB7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBsb25nU3RyaW5nID0gIlRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgbWluaW11bSBzaXplIG5lZWRlZCB0byBzaG93IGl0cyBjb250ZW50LiBJbiB0aGUgY2FzZSBvZiBhIENvbXBvc2l0ZSwgdGhlIHByZWZlcnJlZCBzaXplIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzIGNoaWxkcmVuLiBJZiBjaGlsZHJlbiBoYXZlIGJlZW4gcG9zaXRpb25lZCBieSB0aGUgYXBwbGljYXRpb24sIHRoZSBDb21wb3NpdGUgY29tcHV0ZXMgaXRzIG93biBwcmVmZXJyZWQgc2l6ZSBiYXNlZCBvbiB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIGNoaWxkcmVuLiBJZiBhIENvbXBvc2l0ZSBpcyB1c2luZyBhIGxheW91dCBjbGFzcyB0byBwb3NpdGlvbiBpdHMgY2hpbGRyZW4sIGl0IGFza3MgdGhlIExheW91dCB0byBjb21wdXRlIHRoZSBzaXplIG9mIGl0cyBjbGllbnRBcmVhLCBhbmQgdGhlbiBpdCBhZGRzIGluIHRoZSB0cmltIHRvIGRldGVybWluZSBpdHMgcHJlZmVycmVkIHNpemUuIjsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0LnNldFRleHQobG9uZ1N0cmluZyk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5QYWludDoKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgMTAsIDEwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCQlsYXlvdXQuc2V0V2lkdGgoc2hlbGwuZ2V0U2l6ZSgpLnggLSAyMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2MjFmZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgcGF0aCBmcm9tIHNvbWUgdGV4dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5OCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgOTYsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JZmluYWwgQ29sb3IgZ3JlZW4gPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCWZpbmFsIFBhdGggcGF0aDsKLQl0cnkgewotCQlwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCXBhdGguYWRkU3RyaW5nKCJTV1QiLCAwLCAwLCBmb250KTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkvL0FkdmFuY2VkIEdyYXBoaWNzIG5vdCBzdXBwb3J0ZWQuICAKLQkJLy9UaGlzIG5ldyBBUEkgcmVxdWlyZXMgdGhlIENhaXJvIFZlY3RvciBlbmdpbmUgb24gR1RLIGFuZCBNb3RpZiBhbmQgR0RJKyBvbiBXaW5kb3dzLgotCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CQkJCi0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdyZWVuKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNmY4MzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpc3RlbiBmb3IgZXZlbnRzIGluIEV4Y2VsICh3aW4zMiBvbmx5KQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5OSB7Ci0Jc3RhdGljIFN0cmluZyBJSURfQXBwRXZlbnRzID0gInswMDAyNDQxMy0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9IjsKLQkvLyBFdmVudCBJRAotCXN0YXRpYyBpbnQgTmV3V29ya2Jvb2sgICAgICAgICAgICA9IDB4MDAwMDA2MWQ7Ci0Jc3RhdGljIGludCBTaGVldFNlbGVjdGlvbkNoYW5nZSAgID0gMHgwMDAwMDYxNjsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlRG91YmxlQ2xpY2sgPSAweDAwMDAwNjE3OwotCXN0YXRpYyBpbnQgU2hlZXRCZWZvcmVSaWdodENsaWNrICA9IDB4MDAwMDA2MTg7Ci0Jc3RhdGljIGludCBTaGVldEFjdGl2YXRlICAgICAgICAgID0gMHgwMDAwMDYxOTsKLQlzdGF0aWMgaW50IFNoZWV0RGVhY3RpdmF0ZSAgICAgICAgPSAweDAwMDAwNjFhOwotCXN0YXRpYyBpbnQgU2hlZXRDYWxjdWxhdGUgICAgICAgICA9IDB4MDAwMDA2MWI7Ci0Jc3RhdGljIGludCBTaGVldENoYW5nZSAgICAgICAgICAgID0gMHgwMDAwMDYxYzsKLQlzdGF0aWMgaW50IFdvcmtib29rT3BlbiAgICAgICAgICAgPSAweDAwMDAwNjFmOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MjA7Ci0Jc3RhdGljIGludCBXb3JrYm9va0RlYWN0aXZhdGUgICAgID0gMHgwMDAwMDYyMTsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlQ2xvc2UgICAgPSAweDAwMDAwNjIyOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVTYXZlICAgICA9IDB4MDAwMDA2MjM7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZVByaW50ICAgID0gMHgwMDAwMDYyNDsKLQlzdGF0aWMgaW50IFdvcmtib29rTmV3U2hlZXQgICAgICAgPSAweDAwMDAwNjI1OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpbkluc3RhbGwgICA9IDB4MDAwMDA2MjY7Ci0Jc3RhdGljIGludCBXb3JrYm9va0FkZGluVW5pbnN0YWxsID0gMHgwMDAwMDYyNzsKLQlzdGF0aWMgaW50IFdpbmRvd1Jlc2l6ZSAgICAgICAgICAgPSAweDAwMDAwNjEyOwotCXN0YXRpYyBpbnQgV2luZG93QWN0aXZhdGUgICAgICAgICA9IDB4MDAwMDA2MTQ7Ci0Jc3RhdGljIGludCBXaW5kb3dEZWFjdGl2YXRlICAgICAgID0gMHgwMDAwMDYxNTsKLQlzdGF0aWMgaW50IFNoZWV0Rm9sbG93SHlwZXJsaW5rICAgPSAweDAwMDAwNzNlOwotCi0gcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQl0cnkgewotCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlyZXR1cm47Ci0JfQotCXNoZWxsLm9wZW4oKTsKLQotCU9sZUF1dG9tYXRpb24gZXhjZWxTaGVldCA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQlpbnRbXSBkaXNwSURzID0gZXhjZWxTaGVldC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7IkFwcGxpY2F0aW9uIn0pOwotCVZhcmlhbnQgcFZhclJlc3VsdCA9IGV4Y2VsU2hlZXQuZ2V0UHJvcGVydHkoZGlzcElEc1swXSk7Ci0JT2xlQXV0b21hdGlvbiBhcHBsaWNhdGlvbiA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCWV4Y2VsU2hlZXQuZGlzcG9zZSgpOwotCQotCWludCBldmVudElEID0gU2hlZXRTZWxlY3Rpb25DaGFuZ2U7Ci0JT2xlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChPbGVFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBoYXMgY2hhbmdlZCIpOwotCQkJLy8gdHdvIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHJlbGVhc2VkIChyb3cgYW5kIGNvbHVtbikKLQkJCVZhcmlhbnRbXSBhcmdzID0gZS5hcmd1bWVudHM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oYXJnc1tpXSk7Ci0JCQkJYXJncyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfTsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKGFwcGxpY2F0aW9uLCBJSURfQXBwRXZlbnRzLCBldmVudElELCBsaXN0ZW5lcik7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWFwcGxpY2F0aW9uLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTViZDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNvcnQgYSB0YWJsZSBieSBjb2x1bW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICBjb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0gICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImEiLCAiMyJ9KTsKLSAgICBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJiIiwgIjIifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYyIsICIxIn0pOwotICAgIGNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLSAgICBjb2x1bW4yLnNldFdpZHRoKDEwMCk7Ci0gICAgTGlzdGVuZXIgc29ydExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gKFRhYmxlQ29sdW1uKWUud2lkZ2V0OwotICAgICAgICAgICAgaW50IGluZGV4ID0gY29sdW1uID09IGNvbHVtbjEgPyAwIDogMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gaXRlbXNbaV0uZ2V0VGV4dChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUyID0gaXRlbXNbal0uZ2V0VGV4dChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsYXRvci5jb21wYXJlKHZhbHVlMSwgdmFsdWUyKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHtpdGVtc1tpXS5nZXRUZXh0KDApLCBpdGVtc1tpXS5nZXRUZXh0KDEpfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUsIGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotICAgIGNvbHVtbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbjEpOwotICAgIHRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLSAgICBzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmMGJkOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb29sQmFyIGJhciA9IG5ldyBDb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQlDb29sSXRlbSBpdGVtID0gbmV3IENvb2xJdGVtIChiYXIsIFNXVC5OT05FKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGJhciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCVBvaW50IHNpemUgPSBidXR0b24uY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWl0ZW0uc2V0UHJlZmVycmVkU2l6ZSAoaXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTsKLQkJaXRlbS5zZXRDb250cm9sIChidXR0b24pOwotCX0KLQliYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Q0M2RhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGaWxsIGEgc2hhcGUgd2l0aCBhIHByZWRlZmluZWQgcGF0dGVybgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JLy9kZWZpbmUgYSBwYXR0ZXJuIG9uIGFuIGltYWdlCi0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAwMCwgMTAwMCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCWdjLnNldEZvcmVncm91bmQoeWVsbG93KTsKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgMTAwMCwgMTAwMCwgdHJ1ZSk7Ci0JZm9yIChpbnQgaT0tNTAwOyBpPDEwMDA7IGkrPTEwKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCWdjLmRyYXdMaW5lKGksIDAsIDUwMCArIGksIDEwMDApOwotCQlnYy5kcmF3TGluZSg1MDAgKyBpLCAwLCBpLCAxMDAwKTsKLQl9CQotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBQYXR0ZXJuIHBhdHRlcm47Ci0JdHJ5IHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRpc3BsYXksIGltYWdlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkvL0FkdmFuY2VkIEdyYXBoaWNzIG5vdCBzdXBwb3J0ZWQuICAKLQkJLy9UaGlzIG5ldyBBUEkgcmVxdWlyZXMgdGhlIENhaXJvIFZlY3RvciBlbmdpbmUgb24gR1RLIGFuZCBNb3RpZiBhbmQgR0RJKyBvbiBXaW5kb3dzLgotCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCWMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgciA9ICgoQ29tcG9zaXRlKWV2ZW50LndpZGdldCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJZ2MuZmlsbE92YWwoNSwgNSwgci53aWR0aCAtIDEwLCByLmhlaWdodCAtIDEwKTsJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTFjYjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFZpcnR1YWwgVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSB3aXRoIDEsMDAwLDAwMCBpdGVtcyAobGF6eSwgcGFnZSBzaXplIDY0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDEgewotCi1zdGF0aWMgZmluYWwgaW50IFBBR0VfU0laRSA9IDY0Owotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULlZJUlRVQUwgfCBTV1QuQk9SREVSKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZiAoaXRlbSk7Ci0JCQlpbnQgc3RhcnQgPSBpbmRleCAvIFBBR0VfU0laRSAqIFBBR0VfU0laRTsKLQkJCWludCBlbmQgPSBNYXRoLm1pbiAoc3RhcnQgKyBQQUdFX1NJWkUsIHRhYmxlLmdldEl0ZW1Db3VudCAoKSk7Ci0JCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotCQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJCX0KLQkJfQotCX0pOwotCXRhYmxlLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhICgyMDAsIDIwMCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQWRkIEl0ZW1zIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCXRhYmxlLnNldEl0ZW1Db3VudCAoQ09VTlQpOwotCQkJbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCWxhYmVsLnNldFRleHQgKCJJdGVtczogIiArIENPVU5UICsgIiwgVGltZTogIiArICh0MiAtIHQxKSArICIgKG1zKSBbcGFnZT0iICsgUEFHRV9TSVpFICsgIl0iKTsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViOTA0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUcmVlIGV4YW1wbGUgc25pcHBldDogcG9wdWxhdGUgdHJlZSBsYXppbHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULlZJUlRVQUwgfCBTV1QuQk9SREVSKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQlpZiAocGFyZW50SXRlbSA9PSBudWxsKSB7Ci0JCQkJdGV4dCA9ICJub2RlICIrdHJlZS5pbmRleE9mKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gcGFyZW50SXRlbS5nZXRUZXh0KCkrIiAtICIrcGFyZW50SXRlbS5pbmRleE9mKGl0ZW0pOwotCQkJfQotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJaXRlbS5zZXRJdGVtQ291bnQoMTApOwotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoMjApOwotCXNoZWxsLnNldFNpemUoNDAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiNmRlOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IHVzaW5nIFRleHRMYXlvdXQganVzdGlmeSwgYWxpZ25tZW50IGFuZCBpbmRlbnQgCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAzIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7CQotCXNoZWxsLnNldFRleHQoIkluZGVudCwgSnVzdGlmeSwgQWxpZ24iKTsKLQlTdHJpbmdbXSB0ZXh0cyA9IHsKLQkJIlBsYW5zIGRvIG5vdCBtYXRlcmlhbGl6ZSBvdXQgb2Ygbm93aGVyZSwgbm9yIGFyZSB0aGV5IGVudGlyZWx5IHN0YXRpYy4gVG8gZW5zdXJlIHRoZSBwbGFubmluZyBwcm9jZXNzIGlzIHRyYW5zcGFyZW50IGFuZCBvcGVuIHRvIHRoZSBlbnRpcmUgRWNsaXBzZSBjb21tdW5pdHksIHdlICh0aGUgRWNsaXBzZSBQTUMpIHBvc3QgcGxhbnMgaW4gYW4gZW1icnlvbmljIGZvcm0gYW5kIHJldmlzZSB0aGVtIHRocm91Z2hvdXQgdGhlIHJlbGVhc2UgY3ljbGUuIiwKLQkJIlRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwbGFuIGRlYWxzIHdpdGggdGhlIGltcG9ydGFudCBtYXR0ZXJzIG9mIHJlbGVhc2UgZGVsaXZlcmFibGVzLCByZWxlYXNlIG1pbGVzdG9uZXMsIHRhcmdldCBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLCBhbmQgcmVsZWFzZS10by1yZWxlYXNlIGNvbXBhdGliaWxpdHkuIFRoZXNlIGFyZSBhbGwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjbGVhciBmb3IgYW55IHJlbGVhc2UsIGV2ZW4gaWYgbm8gZmVhdHVyZXMgd2VyZSB0byBjaGFuZ2UuIiwKLQkJIlRoZSByZW1haW5kZXIgb2YgdGhlIHBsYW4gY29uc2lzdHMgb2YgcGxhbiBpdGVtcyBmb3IgdGhlIHZhcmlvdXMgRWNsaXBzZSBzdWJwcm9qZWN0cy4gRWFjaCBwbGFuIGl0ZW0gY292ZXJzIGEgZmVhdHVyZSBvciBBUEkgdGhhdCBpcyB0byBiZSBhZGRlZCB0byBFY2xpcHNlLCBvciBzb21lIGFzcGVjdCBvZiBFY2xpcHNlIHRoYXQgaXMgdG8gYmUgaW1wcm92ZWQuIEVhY2ggcGxhbiBpdGVtIGhhcyBpdHMgb3duIGVudHJ5IGluIHRoZSBFY2xpcHNlIGJ1Z3ppbGxhIGRhdGFiYXNlLCB3aXRoIGEgdGl0bGUgYW5kIGEgY29uY2lzZSBzdW1tYXJ5ICh1c3VhbGx5IGEgc2luZ2xlIHBhcmFncmFwaCkgdGhhdCBleHBsYWlucyB0aGUgd29yayBpdGVtIGF0IGEgc3VpdGFibHkgaGlnaCBlbm91Z2ggbGV2ZWwgc28gdGhhdCBldmVyeW9uZSBjYW4gcmVhZGlseSB1bmRlcnN0YW5kIHdoYXQgdGhlIHdvcmsgaXRlbSBpcyB3aXRob3V0IGhhdmluZyB0byB1bmRlcnN0YW5kIHRoZSBuaXR0eS1ncml0dHkgZGV0YWlsLiIsCi0JfTsKLQlpbnRbXSBhbGlnbm1lbnRzID0ge1NXVC5MRUZULCBTV1QuQ0VOVEVSLCBTV1QuUklHSFR9OwotCWZpbmFsIFRleHRMYXlvdXRbXSBsYXlvdXRzID0gbmV3IFRleHRMYXlvdXRbdGV4dHMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKyspIHsKLQkJVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQkJbGF5b3V0LnNldFRleHQodGV4dHNbaV0pOwotCQlsYXlvdXQuc2V0SW5kZW50KDMwKTsKLQkJbGF5b3V0LnNldEp1c3RpZnkodHJ1ZSk7Ci0JCWxheW91dC5zZXRBbGlnbm1lbnQoYWxpZ25tZW50c1tpXSk7CQkKLQkJbGF5b3V0c1tpXSA9IGxheW91dDsKLQl9Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgxMCwgMTApOwotCQkJaW50IHdpZHRoID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIHBvaW50Lng7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0TGF5b3V0IGxheW91dCA9IGxheW91dHNbaV07Ci0JCQkJbGF5b3V0LnNldFdpZHRoKHdpZHRoKTsKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgcG9pbnQueCwgcG9pbnQueSk7Ci0JCQkJcG9pbnQueSArPSBsYXlvdXQuZ2V0Qm91bmRzKCkuaGVpZ2h0ICsgMTA7Ci0JCQl9CQkJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0cy5sZW5ndGg7IGkrKykgewotCQlsYXlvdXRzW2ldLmRpc3Bvc2UoKTsJCQotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiNjA4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyB0aGUgcmlzZSBmaWVsZCBvZiBhIFRleHRTdHlsZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDQgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQlzaGVsbC5zZXRUZXh0KCJNb2RpZnkgUmlzZSIpOwotCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCAyNCwgU1dULk5PUk1BTCk7Ci0JRm9udCBzbWFsbEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgOCwgU1dULk5PUk1BTCk7Ci0JR0MgZ2MgPSBuZXcgR0Moc2hlbGwpOwotCWdjLnNldEZvbnQoc21hbGxGb250KTsKLQlGb250TWV0cmljcyBzbWFsbE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZpbmFsIGludCBzbWFsbEJhc2VsaW5lID0gc21hbGxNZXRyaWNzLmdldEFzY2VudCgpICsgc21hbGxNZXRyaWNzLmdldExlYWRpbmcoKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZpbmFsIGludCBiYXNlbGluZSA9IG1ldHJpY3MuZ2V0QXNjZW50KCkgKyBtZXRyaWNzLmdldExlYWRpbmcoKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JZmluYWwgVGV4dExheW91dCBsYXlvdXQwID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0MC5zZXRUZXh0KCJTdWJzY3JpcHRTY3JpcHRTdXBlcnNjcmlwdCIpOwotCWxheW91dDAuc2V0Rm9udChmb250KTsKLQlUZXh0U3R5bGUgc3Vic2NyaXB0MCA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlUZXh0U3R5bGUgc3VwZXJzY3JpcHQwID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1cGVyc2NyaXB0MC5yaXNlID0gYmFzZWxpbmUgLSBzbWFsbEJhc2VsaW5lOwotCWxheW91dDAuc2V0U3R5bGUoc3Vic2NyaXB0MCwgMCwgOCk7Ci0JbGF5b3V0MC5zZXRTdHlsZShzdXBlcnNjcmlwdDAsIDE1LCAyNSk7Ci0JCQotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0MSA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dDEuc2V0VGV4dCgiU3Vic2NyaXB0U2NyaXB0U3VwZXJzY3JpcHQiKTsKLQlsYXlvdXQxLnNldEZvbnQoZm9udCk7Ci0JVGV4dFN0eWxlIHN1YnNjcmlwdDEgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3Vic2NyaXB0MS5yaXNlID0gLXNtYWxsQmFzZWxpbmU7Ci0JVGV4dFN0eWxlIHN1cGVyc2NyaXB0MSA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdXBlcnNjcmlwdDEucmlzZSA9IGJhc2VsaW5lOwotCWxheW91dDEuc2V0U3R5bGUoc3Vic2NyaXB0MSwgMCwgOCk7Ci0JbGF5b3V0MS5zZXRTdHlsZShzdXBlcnNjcmlwdDEsIDE1LCAyNSk7Ci0JCi0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBldmVudC5kaXNwbGF5OwotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQotCQkJUmVjdGFuZ2xlIHJlY3QwID0gbGF5b3V0MC5nZXRCb3VuZHMoKTsKLQkJCXJlY3QwLnggKz0gMTA7Ci0JCQlyZWN0MC55ICs9IDEwOwotCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0MCk7Ci0JCQlsYXlvdXQwLmRyYXcoZ2MsIHJlY3QwLngsIHJlY3QwLnkpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MC54LCByZWN0MC55LCByZWN0MC54ICsgcmVjdDAud2lkdGgsIHJlY3QwLnkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCwgcmVjdDAueSArIGJhc2VsaW5lLCByZWN0MC54ICsgcmVjdDAud2lkdGgsIHJlY3QwLnkgKyBiYXNlbGluZSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MC54ICsgcmVjdDAud2lkdGggLyAyLCByZWN0MC55LCByZWN0MC54ICsgcmVjdDAud2lkdGggLyAyLCByZWN0MC55ICsgcmVjdDAuaGVpZ2h0KTsKLQkJCQotCQkJUmVjdGFuZ2xlIHJlY3QxID0gbGF5b3V0MS5nZXRCb3VuZHMoKTsKLQkJCXJlY3QxLnggKz0gMTA7Ci0JCQlyZWN0MS55ICs9IDIwICsgcmVjdDAuaGVpZ2h0OwotCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0MSk7CQkJCi0JCQlsYXlvdXQxLmRyYXcoZ2MsIHJlY3QxLngsIHJlY3QxLnkpOwotCQkJCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QxLngsIHJlY3QxLnkgKyBzbWFsbEJhc2VsaW5lLCByZWN0MS54ICsgcmVjdDEud2lkdGgsIHJlY3QxLnkgKyBzbWFsbEJhc2VsaW5lKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QxLngsIHJlY3QxLnkgKyBiYXNlbGluZSArIHNtYWxsQmFzZWxpbmUsIHJlY3QxLnggKyByZWN0MS53aWR0aCwgcmVjdDEueSArIGJhc2VsaW5lICsgc21hbGxCYXNlbGluZSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54ICsgcmVjdDEud2lkdGggLyAyLCByZWN0MS55LCByZWN0MS54ICsgcmVjdDEud2lkdGggLyAyLCByZWN0MS55ICsgcmVjdDEuaGVpZ2h0KTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbGF5b3V0MC5kaXNwb3NlKCk7Ci0JbGF5b3V0MS5kaXNwb3NlKCk7Ci0Jc21hbGxGb250LmRpc3Bvc2UoKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ZjEzNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IHVzaW5nIHRoZSBHbHlwaE1ldHJpY3MgdG8gZW1iZWRkZWQgaW1hZ2VzIGluIAotICogYSBUZXh0TGF5b3V0LiAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCXNoZWxsLnNldFRleHQoIkVtYmVkZGluZyBvYmplY3RzIGluIHRleHQiKTsKLQlmaW5hbCBJbWFnZVtdIGltYWdlcyA9IHtuZXcgSW1hZ2UoZGlzcGxheSwgMzIsIDMyKSwgbmV3IEltYWdlKGRpc3BsYXksIDIwLCA0MCksIG5ldyBJbWFnZShkaXNwbGF5LCA0MCwgMjApfTsKLQlpbnRbXSBjb2xvcnMgID0ge1NXVC5DT0xPUl9CTFVFLCBTV1QuQ09MT1JfTUFHRU5UQSwgU1dULkNPTE9SX0dSRUVOfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZXNbaV0pOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JzW2ldKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2VzW2ldLmdldEJvdW5kcygpKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQkKLQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQlidXR0b24ucGFjaygpOwotCVN0cmluZyB0ZXh0ID0gIkhlcmUgaXMgc29tZSB0ZXh0IHdpdGggYSBibHVlIGltYWdlIFx1RkZGQywgYSBtYWdlbnRhIGltYWdlIFx1RkZGQywgYSBncmVlbiBpbWFnZSBcdUZGRkMsIGFuZCBhIGJ1dHRvbjogXHVGRkZDLiI7Ci0JZmluYWwgaW50W10gaW1hZ2VPZmZzZXRzID0gezM2LCA1NSwgNzJ9OwotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0LnNldFRleHQodGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlc1tpXS5nZXRCb3VuZHMoKTsKLQkJVGV4dFN0eWxlIGltYWdlU3R5bGUgPSBuZXcgVGV4dFN0eWxlKG51bGwsIG51bGwsIG51bGwpOwotCQlpbWFnZVN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGJvdW5kcy5oZWlnaHQsIDAsIGJvdW5kcy53aWR0aCk7IAotCQlsYXlvdXQuc2V0U3R5bGUoaW1hZ2VTdHlsZSwgaW1hZ2VPZmZzZXRzW2ldLCBpbWFnZU9mZnNldHNbaV0pOwotCX0KLQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCVRleHRTdHlsZSBidXR0b25TdHlsZSA9IG5ldyBUZXh0U3R5bGUobnVsbCwgbnVsbCwgbnVsbCk7Ci0JYnV0dG9uU3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoYm91bmRzLmhlaWdodCwgMCwgYm91bmRzLndpZHRoKTsgCi0JZmluYWwgaW50IGJ1dHRvbk9mZnNldCA9IHRleHQubGVuZ3RoKCkgLSAyOwotCWxheW91dC5zZXRTdHlsZShidXR0b25TdHlsZSwgYnV0dG9uT2Zmc2V0LCBidXR0b25PZmZzZXQpOwotCQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCVBvaW50IG1hcmdpbiA9IG5ldyBQb2ludCgxMCwgMTApOwotCQkJbGF5b3V0LnNldFdpZHRoKHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBtYXJnaW4ueCk7Ci0JCQlsYXlvdXQuZHJhdyhldmVudC5nYywgbWFyZ2luLngsIG1hcmdpbi55KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW50IG9mZnNldCA9IGltYWdlT2Zmc2V0c1tpXTsKLQkJCQlpbnQgbGluZUluZGV4ID0gbGF5b3V0LmdldExpbmVJbmRleChvZmZzZXQpOwotCQkJCUZvbnRNZXRyaWNzIGxpbmVNZXRyaWNzID0gbGF5b3V0LmdldExpbmVNZXRyaWNzKGxpbmVJbmRleCk7Ci0JCQkJUG9pbnQgcG9pbnQgPSBsYXlvdXQuZ2V0TG9jYXRpb24ob2Zmc2V0LCBmYWxzZSk7Ci0JCQkJR2x5cGhNZXRyaWNzIGdseXBoTWV0cmljcyA9IGxheW91dC5nZXRTdHlsZShvZmZzZXQpLm1ldHJpY3M7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlc1tpXSwgcG9pbnQueCArIG1hcmdpbi54LCBwb2ludC55ICsgbWFyZ2luLnkgKyBsaW5lTWV0cmljcy5nZXRBc2NlbnQoKSAtIGdseXBoTWV0cmljcy5hc2NlbnQpOwotCQkJfQotCQkJaW50IGxpbmVJbmRleCA9IGxheW91dC5nZXRMaW5lSW5kZXgoYnV0dG9uT2Zmc2V0KTsKLQkJCUZvbnRNZXRyaWNzIGxpbmVNZXRyaWNzID0gbGF5b3V0LmdldExpbmVNZXRyaWNzKGxpbmVJbmRleCk7Ci0JCQlQb2ludCBwb2ludCA9IGxheW91dC5nZXRMb2NhdGlvbihidXR0b25PZmZzZXQsIGZhbHNlKTsKLQkJCUdseXBoTWV0cmljcyBnbHlwaE1ldHJpY3MgPSBsYXlvdXQuZ2V0U3R5bGUoYnV0dG9uT2Zmc2V0KS5tZXRyaWNzOwotCQkJYnV0dG9uLnNldExvY2F0aW9uKHBvaW50LnggKyBtYXJnaW4ueCwgcG9pbnQueSArIG1hcmdpbi55ICsgbGluZU1ldHJpY3MuZ2V0QXNjZW50KCkgLSBnbHlwaE1ldHJpY3MuYXNjZW50KTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlsYXlvdXQuZGlzcG9zZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFiNTAxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBhIEJ1dHRvbiB3aXRoIHRleHQgYW5kIGltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JYnV0dG9uLnNldFRleHQoIkJ1dHRvbiIpOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlMDkwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFVzZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcyB0byByZWZsZWN0LCByb3RhdGUgYW5kIHNoZWFyIGltYWdlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA3IHsJCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQkKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTEwLCA2MCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIlRpbWVzIiwgMzAsIFNXVC5CT0xEKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMTAsIDYwKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlnYy5kcmF3VGV4dCgiU1dUIiwgMTAsIDEwLCB0cnVlKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCWZpbmFsIFJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJNYXRyaXggVHJhbmZvcm1hdGlvbnMiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0JCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsJCi0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmICghZ2MuZ2V0QWR2YW5jZWQoKSl7Ci0JCQkJCWdjLmRyYXdUZXh0KCJBZHZhbmNlZCBncmFwaGljcyBub3Qgc3VwcG9ydGVkIiwgMzAsIDMwLCB0cnVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBPcmlnaW5hbCBpbWFnZQotCQkJCWludCB4ID0gMzAsIHkgPSAzMDsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOyAKLQkJCQl4ICs9IHJlY3Qud2lkdGggKyAzMDsKLQkJCQkKLQkJCQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQkKLQkJCQkvLyBOb3RlIHRoYXQgdGhlIHRyYW5mb3JtIGlzIGFwcGxpZWQgdG8gdGhlIHdob2xlIEdDIHRoZXJlZm9yZQotCQkJCS8vIHRoZSBjb29yZGluYXRlcyBuZWVkIHRvIGJlIGFkanVzdGVkIHRvby4KLQkJCQkKLQkJCQkvLyBSZWZsZWN0IGFyb3VuZCB0aGUgeSBheGlzLgotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygtMSwgMCwgMCwgMSwgMCAsMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAtMSp4LXJlY3Qud2lkdGgsIHkpOwotCQkJCQotCQkJCXggPSAzMDsgeSArPSByZWN0LmhlaWdodCArIDMwOwotCQkJCQotCQkJCS8vIFJlZmxlY3QgYXJvdW5kIHRoZSB4IGF4aXMuIAotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygxLCAwLCAwLCAtMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCAtMSp5LXJlY3QuaGVpZ2h0KTsKLQkJCQkKLQkJCQl4ICs9IHJlY3Qud2lkdGggKyAzMDsKLQkJCQkKLQkJCQkvLyBSZWZsZWN0IGFyb3VuZCB0aGUgeCBhbmQgeSBheGVzCQotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygtMSwgMCwgMCwgLTEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgLTEqeC1yZWN0LndpZHRoLCAtMSp5LXJlY3QuaGVpZ2h0KTsKLQkJCQkKLQkJCQl4ID0gMzA7IHkgKz0gcmVjdC5oZWlnaHQgKyAzMDsKLQkJCQkKLQkJCQkvLyBTaGVhciBpbiB0aGUgeC1kaXJlY3Rpb24KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgMCwgLTEsIDEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMzAwLCB5KTsKLQkJCQkKLQkJCQkvLyBTaGVhciBpbiB5LWRpcmVjdGlvbgotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygxLCAtMSwgMCwgMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAxNTAsIDQ3NSk7Ci0JCQkJCi0JCQkJLy8gUm90YXRlIGJ5IDQ1IGRlZ3JlZXMJCi0JCQkJZmxvYXQgY29zNDUgPSAoZmxvYXQpTWF0aC5jb3MoNDUpOwotCQkJCWZsb2F0IHNpbjQ1ID0gKGZsb2F0KU1hdGguc2luKDQ1KTsKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoY29zNDUsIHNpbjQ1LCAtc2luNDUsIGNvczQ1LCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDM1MCwgMTAwKTsKLQkJCQkKLQkJCQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMzUwLCA1NTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCQotCi0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg4NjVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2hhbmdlIGh1ZSwgc2F0dXJhdGlvbiBhbmQgYnJpZ2h0bmVzcyBvZiBhIGNvbG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA4IHsJIAotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYsIDB4ZmYwMCwgMHhmZjAwMDApOwkKLQkKLQkvLyBJbWFnZURhdGEgc2hvd2luZyB2YXJpYXRpb25zIG9mIGh1ZQkKLQlJbWFnZURhdGEgaHVlRGF0YSA9IG5ldyBJbWFnZURhdGEoMzYwLCAxMDAsIDI0LCBwYWxldHRlKTsJCi0JZmxvYXQgaHVlID0gMDsKLQlmb3IgKGludCB4ID0gMDsgeCA8IGh1ZURhdGEud2lkdGg7IHgrKykgewotCQlmb3IgKGludCB5ID0gMDsgeSA8IGh1ZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWludCBwaXhlbCA9IHBhbGV0dGUuZ2V0UGl4ZWwobmV3IFJHQihodWUsIDFmLCAxZikpOwotCQkJaHVlRGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCX0KLQkJaHVlICs9IDM2MGYgLyBodWVEYXRhLndpZHRoOwotCX0KLQotCS8vIEltYWdlRGF0YSBzaG93aW5nIHNhdHVyYXRpb24gb24geCBheGlzIGFuZCBicmlnaHRuZXNzIG9uIHkgYXhpcwotCUltYWdlRGF0YSBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEgPSBuZXcgSW1hZ2VEYXRhKDM2MCwgMzYwLCAyNCwgcGFsZXR0ZSk7Ci0JZmxvYXQgc2F0dXJhdGlvbiA9IDBmOwotCWZsb2F0IGJyaWdodG5lc3MgPSAxZjsKLQlmb3IgKGludCB4ID0gMDsgeCA8IHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS53aWR0aDsgeCsrKSB7Ci0JCWJyaWdodG5lc3MgPSAxZjsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWludCBwaXhlbCA9IHBhbGV0dGUuZ2V0UGl4ZWwobmV3IFJHQigzNjBmLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKSk7CQotCQkJc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJCWJyaWdodG5lc3MgLT0gMWYgLyBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEuaGVpZ2h0OwotCQl9Ci0JCXNhdHVyYXRpb24gKz0gMWYgLyBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEud2lkdGg7Ci0JfQotCQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGh1ZUltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGh1ZURhdGEpOwotCUltYWdlIHNhdHVyYXRpb25JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkh1ZSwgU2F0dXJhdGlvbiwgQnJpZ2h0bmVzcyIpOwotCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDE2OwotCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsJCQotCQotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRJbWFnZShodWVJbWFnZSk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsJCi0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0KCJIdWUiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7IC8vc3BhY2VyCi0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlsYWJlbC5zZXRUZXh0KCJCcmlnaHRuZXNzIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRJbWFnZShzYXR1cmF0aW9uSW1hZ2UpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7IC8vc3BhY2VyCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQoIlNhdHVyYXRpb24iKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCWh1ZUltYWdlLmRpc3Bvc2UoKTsKLQlzYXR1cmF0aW9uSW1hZ2UuZGlzcG9zZSgpOwkKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5MjUwMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIEpPR0wgdG8gZHJhdyB0byBhbiBTV1QgR0xDYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xEYXRhOwotCi1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMOwotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRHJhd2FibGVGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5nbHUuR0xVOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwOSB7Ci0Jc3RhdGljIHZvaWQgZHJhd1RvcnVzKEdMIGdsLCBmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlnbC5nbEJlZ2luKEdMLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCWZvciAoaW50IGogPSBuc2lkZXM7IGogPj0gMDsgai0tKSB7Ci0JCQkJcGhpICs9IHNpZGVEZWx0YTsKLQkJCQlmbG9hdCBjb3NQaGkgPSAoZmxvYXQpIE1hdGguY29zKHBoaSk7Ci0JCQkJZmxvYXQgc2luUGhpID0gKGZsb2F0KSBNYXRoLnNpbihwaGkpOwotCQkJCWZsb2F0IGRpc3QgPSBSICsgciAqIGNvc1BoaTsKLQkJCQlnbC5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlnbC5nbFZlcnRleDNmKGNvc1RoZXRhMSAqIGRpc3QsIC1zaW5UaGV0YTEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCQlnbC5nbE5vcm1hbDNmKGNvc1RoZXRhICogY29zUGhpLCAtc2luVGhldGEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJZ2wuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJZ2wuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhICgpOwotCQlkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0JCWZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcyhjb21wLCBTV1QuTk9ORSwgZGF0YSk7Ci0KLQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJZmluYWwgR0xDb250ZXh0IGNvbnRleHQgPSBHTERyYXdhYmxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuY3JlYXRlRXh0ZXJuYWxHTENvbnRleHQoKTsKLQotCQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotCQkJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCWNvbnRleHQubWFrZUN1cnJlbnQoKTsKLQkJCQlHTCBnbCA9IGNvbnRleHQuZ2V0R0wgKCk7Ci0JCQkJZ2wuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCWdsLmdsTWF0cml4TW9kZShHTC5HTF9QUk9KRUNUSU9OKTsKLQkJCQlnbC5nbExvYWRJZGVudGl0eSgpOwotCQkJCUdMVSBnbHUgPSBuZXcgR0xVKCk7Ci0JCQkJZ2x1LmdsdVBlcnNwZWN0aXZlKDQ1LjBmLCBmQXNwZWN0LCAwLjVmLCA0MDAuMGYpOwotCQkJCWdsLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwotCQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJY29udGV4dC5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHQubWFrZUN1cnJlbnQoKTsKLQkJR0wgZ2wgPSBjb250ZXh0LmdldEdMICgpOwotCQlnbC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCWdsLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJZ2wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJZ2wuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCWdsLmdsTGluZVdpZHRoKDIpOwotCQlnbC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJY29udGV4dC5yZWxlYXNlKCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0pPR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQljb250ZXh0Lm1ha2VDdXJyZW50KCk7Ci0JCQkJCUdMIGdsID0gY29udGV4dC5nZXRHTCAoKTsKLQkJCQkJZ2wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCWdsLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQkJZ2wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCWdsLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCWdsLmdsUm90YXRlZigwLjNmICogcm90LCAzLjBmICogZnJvdCwgMS4wZiAqIGZyb3QsIDEuMGYpOwotCQkJCQlyb3QrKzsKLQkJCQkJZ2wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfTElORSk7Ci0JCQkJCWdsLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKGdsLCAxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQljb250ZXh0LnJlbGVhc2UoKTsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWModGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJhMDA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhbnZhcyBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCB0YWIgdHJhdmVyc2FsIChiZWhhdmUgbGlrZSBhIHRhYiBncm91cCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDMyKTsKLQliLnNldFRleHQgKCJCdXR0b24iKTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChiKTsKLQlmaW5hbCBDYW52YXMgYyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljLnNldEJvdW5kcyAoMTAsIDUwLCAxMDAsIDMyKTsKLQljLmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJLyogRG8gdGFiIGdyb3VwIHRyYXZlcnNhbCAqLwotCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX05FWFQ6CQotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6CQotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULkZvY3VzSW4sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQljLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQljLnNldEJhY2tncm91bmQgKGJsdWUpOwotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJLRVkiKTsKLQkJCWZvciAoaW50IGk9MDsgaTw2NDsgaSsrKSB7Ci0JCQkJQ29sb3IgYzEgPSByZWQsIGMyID0gYmx1ZTsKLQkJCQlpZiAoYy5pc0ZvY3VzQ29udHJvbCAoKSkgewotCQkJCQljMSA9IGJsdWU7ICBjMiA9IHJlZDsKLQkJCQl9Ci0JCQkJYy5zZXRCYWNrZ3JvdW5kIChjMSk7Ci0JCQkJYy51cGRhdGUgKCk7Ci0JCQkJYy5zZXRCYWNrZ3JvdW5kIChjMik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlUZXh0IHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0LnNldEJvdW5kcyAoMTAsIDg1LCAxMDAsIDMyKTsKLQotCVRleHQgciA9IG5ldyBUZXh0IChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0Jci5zZXRCb3VuZHMgKDEwLCAxMjAsIDEwMCwgMzIpOwotCQotCWMuc2V0Rm9jdXMgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNmE2MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyB0ZXh0IGJldHdlZW4gdHdvIFN0eWxlZFRleHQgd2lkZ2V0cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxMCB7Ci0Jc3RhdGljIFN0cmluZyBzdHJpbmcxID0gIkEgZHJhZyBzb3VyY2UgaXMgdGhlIHByb3ZpZGVyIG9mIGRhdGEgaW4gYSBEcmFnIGFuZCBEcm9wIGRhdGEgdHJhbnNmZXIgYXMgd2VsbCBhcyAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcmlnaW5hdG9yIG9mIHRoZSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbi4gVGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRyYWcgc291cmNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5IGJlIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgbG9jYXRpb24gaW4gdGhlIHNhbWUgd2lkZ2V0LCB0byBhIGRpZmZlcmVudCB3aWRnZXQgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoaW4gdGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIHRvIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gZHJhZyB0ZXh0IGZyb20geW91ciBhcHBsaWNhdGlvbiBhbmQgZHJvcCBpdCBvbiBhbiBlbWFpbCBhcHBsaWNhdGlvbiwgb3IgeW91ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgZHJhZyBhbiBpdGVtIGluIGEgdHJlZSBhbmQgZHJvcCBpdCBiZWxvdyBhIGRpZmZlcmVudCBub2RlIGluIHRoZSBzYW1lIHRyZWUuIjsKLQotCXN0YXRpYyBTdHJpbmcgc3RyaW5nMiA9ICJBIGRyb3AgdGFyZ2V0IHJlY2VpdmVzIGRhdGEgaW4gYSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbi4gVGhlIGRhdGEgcmVjZWl2ZWQgYnkgIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGRyb3AgdGFyZ2V0IG1heSBoYXZlIGNvbWUgZnJvbSB0aGUgc2FtZSB3aWRnZXQsIGZyb20gYSBkaWZmZXJlbnQgd2lkZ2V0IHdpdGhpbiAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc2FtZSBhcHBsaWNhdGlvbiwgb3IgZnJvbSBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhbHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgeW91ICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBkcmFnIHRleHQgZnJvbSBhbiBlbWFpbCBhcHBsaWNhdGlvbiBhbmQgZHJvcCBpdCBvbiB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgY291bGQgIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAiZHJhZyBhbiBpdGVtIGluIGEgdHJlZSBhbmQgZHJvcCBpdCBiZWxvdyBhIGRpZmZlcmVudCBub2RlIGluIHRoZSBzYW1lIHRyZWUuIjsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JaW50IHN0eWxlID0gU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSOwotCWZpbmFsIFN0eWxlZFRleHQgdGV4dDEgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQxLnNldFRleHQoc3RyaW5nMSk7Ci0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSh0ZXh0MSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUpOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJUG9pbnQgc2VsZWN0aW9uOwotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCXNlbGVjdGlvbiA9IHRleHQxLmdldFNlbGVjdGlvbigpOwotCQkJZS5kb2l0ID0gc2VsZWN0aW9uLnggIT0gc2VsZWN0aW9uLnk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWUuZGF0YSA9IHRleHQxLmdldFRleHQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55LTEpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQl0ZXh0MS5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54LCAiIik7Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBudWxsOwotCQl9Ci0JfSk7Ci0JCi0JZmluYWwgU3R5bGVkVGV4dCB0ZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBzdHlsZSk7Ci0JdGV4dDIuc2V0VGV4dChzdHJpbmcyKTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHQyLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZS5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQllLmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJdGV4dDIuaW5zZXJ0KChTdHJpbmcpZS5kYXRhKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODU5OGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBTdHlsZWRUZXh0IHNuaXBwZXQ6IHVzZSByaXNlIGFuZCBmb250IHdpdGggU3R5bGVSYW5nZS4gCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxMSB7Ci0KLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIllvdSBjYW4gc2V0IGFueSBmb250IHlvdSB3YW50IGluIGEgcmFuZ2UuIFlvdSBjYW4gYWxzbyBzZXQgYSBiYXNlbGluZSByaXNlIGFuZCBhbGwgb3RoZXIgb2xkIGZlYXR1cmVzIiArIAotCQkiIGxpa2UgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCwgYW5kIG1peCB0aGVtIGFueSB3YXkgeW91IHdhbnQuIFRvdGFsbHkgYXdlc29tZS4iOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzdHlsZWRUZXh0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlGb250IGZvbnQxID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIGRhdGEuZ2V0SGVpZ2h0KCkgKiAyLCBkYXRhLmdldFN0eWxlKCkpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIGRhdGEuZ2V0SGVpZ2h0KCkgKiA0IC8gNSwgZGF0YS5nZXRTdHlsZSgpKTsKLQkJU3R5bGVSYW5nZVtdIHN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlWzhdOwotCQlzdHlsZXNbMF0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbMF0uZm9udCA9IGZvbnQxOyAKLQkJc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzFdLnJpc2UgPSBkYXRhLmdldEhlaWdodCgpIC8gMzsgCi0JCXN0eWxlc1syXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1syXS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOyAKLQkJc3R5bGVzWzNdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzNdLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKTsgCi0JCXN0eWxlc1s0XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s0XS5mb250ID0gZm9udDI7IAotCQlzdHlsZXNbNF0uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOzsKLQkJc3R5bGVzWzRdLnVuZGVybGluZSA9IHRydWU7Ci0JCXN0eWxlc1s1XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s1XS5yaXNlID0gLWRhdGEuZ2V0SGVpZ2h0KCkgLyAzOyAKLQkJc3R5bGVzWzVdLnN0cmlrZW91dCA9IHRydWU7Ci0JCXN0eWxlc1s1XS51bmRlcmxpbmUgPSB0cnVlOwotCQlzdHlsZXNbNl0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbNl0uZm9udCA9IGZvbnQxOyAKLQkJc3R5bGVzWzZdLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlzdHlsZXNbNl0uYmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQlzdHlsZXNbN10gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbN10ucmlzZSA9ICBkYXRhLmdldEhlaWdodCgpIC8gMzsKLQkJc3R5bGVzWzddLnVuZGVybGluZSA9IHRydWU7Ci0JCXN0eWxlc1s3XS5mb250U3R5bGUgPSBTV1QuQk9MRDsKLQkJc3R5bGVzWzddLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCQlzdHlsZXNbN10uYmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJCi0JCWludFtdIHJhbmdlcyA9IG5ldyBpbnRbXSB7MTYsIDQsIDYxLCAxMywgMTA3LCAxMCwgMTIyLCAxMCwgMTM0LCAzLCAxNDMsIDYsIDE2MCwgNywgMTY4LCA3fTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlcyhyYW5nZXMsIHN0eWxlcyk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsJCQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZWYzYjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi0vKioKLSAqIFN0eWxlZFRleHQgc25pcHBldDogZW1iZWQgaW1hZ2VzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxMiB7Ci0JCi0Jc3RhdGljIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIlRoaXMgc25pcHBldCBzaG93cyBob3cgdG8gZW1iZWQgaW1hZ2VzIGluIGEgU3R5bGVkVGV4dC5cbiIrCi0JCSJIZXJlIGlzIG9uZTogXHVGRkZDLCBhbmQgaGVyZSBpcyBhbm90aGVyOiBcdUZGRkMuIisKLQkJIlVzZSB0aGUgYWRkIGJ1dHRvbiB0byBhZGQgYW4gaW1hZ2UgZnJvbSB5b3VyIGZpbGVzeXN0ZW0gdG8gdGhlIFN0eWxlZFRleHQgYXQgdGhlIGN1cnJlbnQgY2FyZXQgb2Zmc2V0LiI7Ci0Jc3RhdGljIEltYWdlW10gaW1hZ2VzOwotCXN0YXRpYyBpbnRbXSBvZmZzZXRzOwotCi0Jc3RhdGljIHZvaWQgYWRkSW1hZ2UoSW1hZ2UgaW1hZ2UsIGludCBvZmZzZXQpIHsKLQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlICgpOwotCQlzdHlsZS5zdGFydCA9IG9mZnNldDsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJc3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MocmVjdC5oZWlnaHQsIDAsIHJlY3Qud2lkdGgpOwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlpbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCQlkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pLAotCQl9OwotCQlvZmZzZXRzID0gbmV3IGludFtpbWFnZXMubGVuZ3RoXTsKLQkJaW50IGxhc3RPZmZzZXQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaW50IG9mZnNldCA9IHRleHQuaW5kZXhPZigiXHVGRkZDIiwgbGFzdE9mZnNldCk7Ci0JCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJYWRkSW1hZ2UoaW1hZ2VzW2ldLCBvZmZzZXQpOwotCQkJbGFzdE9mZnNldCA9IG9mZnNldCArIDE7Ci0JCX0KLQkJCi0JCS8vIHVzZSBhIHZlcmlmeSBsaXN0ZW5lciB0byBrZWVwIHRoZSBvZmZzZXRzIHVwIHRvIGRhdGUKLQkJc3R5bGVkVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgVmVyaWZ5TGlzdGVuZXIoKSAgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0JCQkJaW50IHN0YXJ0ID0gZS5zdGFydDsKLQkJCQlpbnQgcmVwbGFjZUNoYXJDb3VudCA9IGUuZW5kIC0gZS5zdGFydDsKLQkJCQlpbnQgbmV3Q2hhckNvdW50ID0gZS50ZXh0Lmxlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0IDw9IG9mZnNldCAmJiBvZmZzZXQgPCBzdGFydCArIHJlcGxhY2VDaGFyQ291bnQpIHsKLQkJCQkJCS8vIHRoaXMgaW1hZ2UgaXMgYmVpbmcgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0Ci0JCQkJCQlpZiAoaW1hZ2VzW2ldICE9IG51bGwgJiYgIWltYWdlc1tpXS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCQkJCQkJCWltYWdlc1tpXSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlvZmZzZXQgPSAtMTsKLQkJCQkJfQotCQkJCQlpZiAob2Zmc2V0ICE9IC0xICYmIG9mZnNldCA+PSBzdGFydCkgb2Zmc2V0ICs9IG5ld0NoYXJDb3VudCAtIHJlcGxhY2VDaGFyQ291bnQ7Ci0JCQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc3R5bGVkVGV4dC5hZGRQYWludE9iamVjdExpc3RlbmVyKG5ldyBQYWludE9iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IGV2ZW50LnN0eWxlOwotCQkJCWludCBzdGFydCA9IHN0eWxlLnN0YXJ0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0ID09IG9mZnNldCkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJCQlpbnQgeCA9IGV2ZW50Lng7Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyBldmVudC5hc2NlbnQgLSBzdHlsZS5tZXRyaWNzLmFzY2VudDsJCQkJCQkKLQkJCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJBZGQgSW1hZ2UiKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKLQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmaWxlbmFtZSk7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQkJCQkJc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKG9mZnNldCwgMCwgIlx1RkZGQyIpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCXdoaWxlIChpbmRleCA8IG9mZnNldHMubGVuZ3RoKSB7Ci0JCQkJCQkJaWYgKG9mZnNldHNbaW5kZXhdID09IC0xICYmIGltYWdlc1tpbmRleF0gPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCQkJaW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWlmIChpbmRleCA9PSBvZmZzZXRzLmxlbmd0aCkgewotCQkJCQkJCWludFtdIHRtcE9mZnNldHMgPSBuZXcgaW50W2luZGV4ICsgMV07Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShvZmZzZXRzLCAwLCB0bXBPZmZzZXRzLCAwLCBvZmZzZXRzLmxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0cyA9IHRtcE9mZnNldHM7Ci0JCQkJCQkJSW1hZ2VbXSB0bXBJbWFnZXMgPSBuZXcgSW1hZ2VbaW5kZXggKyAxXTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGltYWdlcywgMCwgdG1wSW1hZ2VzLCAwLCBpbWFnZXMubGVuZ3RoKTsKLQkJCQkJCQlpbWFnZXMgPSB0bXBJbWFnZXM7Ci0JCQkJCQl9Ci0JCQkJCQlvZmZzZXRzW2luZGV4XSA9IG9mZnNldDsKLQkJCQkJCWltYWdlc1tpbmRleF0gPSBpbWFnZTsKLQkJCQkJCWFkZEltYWdlKGltYWdlLCBvZmZzZXQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5YjQzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIFN0eWxlZFRleHQgc25pcHBldDogdXNlIGluZGVudCwgYWxpZ25tZW50IGFuZCBqdXN0aWZ5LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEzIHsKLQotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiVGhlIGZpcnN0IHBhcmFncmFwaCBoYXMgYW4gaW5kZW50YXRpb24gb2YgZmlmdHkgcGl4ZWxzLiBJbmRlbnRhdGlvbiBpcyB0aGUgYW1vdW50IG9mIHdoaXRlIHNwYWNlIGluIGZyb250IG9mIHRoZSBmaXJzdCBsaW5lIG9mIGEgcGFyYWdyYXBoLiBJZiB0aGlzIHBhcmFncmFwaCB3cmFwcyB0byBzZXZlcmFsIGxpbmVzIHlvdSBzaG91bGQgc2VlIHRoZSBpbmRlbnRhdGlvbiBvbmx5IG9uIHRoZSBmaXJzdCBsaW5lLlxuXG4iICsKLQkJIlRoZSBzZWNvbmQgcGFyYWdyYXBoIGlzIGNlbnRlciBhbGlnbmVkLiBBbGlnbm1lbnQgb25seSB3b3JrcyB3aGVuIHRoZSBTdHlsZWRUZXh0IGlzIHVzaW5nIHdvcmQgd3JhcC4gQWxpZ25tZW50LCBhcyB3aXRoIGFsbCBvdGhlciBsaW5lIGF0dHJpYnV0ZXMsIGNhbiBiZSBzZXQgZm9yIHRoZSB3aG9sZSB3aWRnZXQgb3IganVzdCBmb3IgYSBzZXQgb2YgbGluZXMuXG5cbiIgKwotCQkiVGhlIHRoaXJkIHBhcmFncmFwaCBpcyBqdXN0aWZpZWQuIExpa2UgYWxpZ25tZW50LCBqdXN0aWZ5IG9ubHkgd29ya3Mgd2hlbiB0aGUgU3R5bGVkVGV4dCBpcyB1c2luZyB3b3JkIHdyYXAuIElmIHRoZSBwYXJhZ3JhcGggd3JhcHMgdG8gc2V2ZXJhbCBsaW5lcywgdGhlIGp1c3RpZmljYXRpb24gaXMgcGVyZm9ybWVkIG9uIGFsbCBsaW5lcyBidXQgdGhlIGxhc3Qgb25lLlxuXG4iICsJCQotCQkiVGhlIGxhc3QgcGFyYWdyYXBoIGlzIGp1c3RpZmllZCBhbmQgcmlnaHQgYWxpZ25lZC4gSW4gdGhpcyBjYXNlLCB0aGUgYWxpZ25tZW50IGlzIG9ubHkgbm90aWNlYWJsZSBpbiB0aGUgZmluYWwgbGluZS4iOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUluZGVudCgwLCAxLCA1MCk7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUFsaWdubWVudCgyLCAxLCBTV1QuQ0VOVEVSKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lSnVzdGlmeSg0LCAxLCB0cnVlKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lQWxpZ25tZW50KDYsIDEsIFNXVC5SSUdIVCk7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUp1c3RpZnkoNiwgMSwgdHJ1ZSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDMwMCwgNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDA0NjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBzZXQgYSBiYWNrZ3JvdW5kIGltYWdlIChhIGR5bmFtaWMgZ3JhZGllbnQpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNCB7Ci0Jc3RhdGljIEltYWdlIG9sZEltYWdlOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldEJhY2tncm91bmRNb2RlIChTV1QuSU5IRVJJVF9ERUZBVUxUKTsKLQkJRmlsbExheW91dCBsYXlvdXQxID0gbmV3IEZpbGxMYXlvdXQgKFNXVC5WRVJUSUNBTCk7Ci0JCWxheW91dDEubWFyZ2luV2lkdGggPSBsYXlvdXQxLm1hcmdpbkhlaWdodCA9IDEwOwotCQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dDEpOwotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dCAoIkdyb3VwICIpOwotCQlSb3dMYXlvdXQgbGF5b3V0MiA9IG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCk7Ci0JCWxheW91dDIubWFyZ2luV2lkdGggPSBsYXlvdXQyLm1hcmdpbkhlaWdodCA9IGxheW91dDIuc3BhY2luZyA9IDEwOwotCQlncm91cC5zZXRMYXlvdXQgKGxheW91dDIpOwotCQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCX0KLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJSW1hZ2UgbmV3SW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIE1hdGgubWF4ICgxLCByZWN0LndpZHRoKSwgMSk7CQotCQkJCUdDIGdjID0gbmV3IEdDIChuZXdJbWFnZSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUgKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCAxLCBmYWxzZSk7Ci0JCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQlzaGVsbC5zZXRCYWNrZ3JvdW5kSW1hZ2UgKG5ld0ltYWdlKTsKLQkJCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJCQlvbGRJbWFnZSA9IG5ld0ltYWdlOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDczMzFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiB0YWtlIGEgc2NyZWVuIHNob3Qgd2l0aCBhIEdDCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNhcHR1cmUiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCi0JCQkvKiBUYWtlIHRoZSBzY3JlZW4gc2hvdCAqLwotCQkJR0MgZ2MgPSBuZXcgR0MoZGlzcGxheSk7Ci0JCQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkaXNwbGF5LmdldEJvdW5kcygpKTsKLQkJCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJU2hlbGwgcG9wdXAgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5TSEVMTF9UUklNKTsKLQkJCXBvcHVwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCXBvcHVwLnNldFRleHQoIkltYWdlIik7Ci0JCQlwb3B1cC5zZXRCb3VuZHMoNTAsIDUwLCAyMDAsIDIwMCk7Ci0JCQlwb3B1cC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHBvcHVwLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2MsIFNXVC5OT05FKTsKLQkJCXNjLnNldENvbnRlbnQoY2FudmFzKTsKLQkJCWNhbnZhcy5zZXRCb3VuZHMoZGlzcGxheS5nZXRCb3VuZHMgKCkpOwotCQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlwb3B1cC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4ZjdjNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbCBUaXBzIGV4YW1wbGUgc25pcHBldDogc2hvdyBhIHRvb2wgdGlwIGluc2lkZSBhIHJlY3RhbmdsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlmaW5hbCBDb2xvciBbXSBjb2xvcnMgPSB7Ci0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9HUkVFTiksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSksCi0JCX07Ci0JCWZpbmFsIFJlY3RhbmdsZSBbXSByZWN0cyA9IHsKLQkJCW5ldyBSZWN0YW5nbGUgKDEwLCAxMCwgMzAsIDMwKSwKLQkJCW5ldyBSZWN0YW5nbGUgKDIwLCA0NSwgMjUsIDM1KSwKLQkJCW5ldyBSZWN0YW5nbGUgKDgwLCA4MCwgMTAsIDEwKSwKLQkJfTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlMaXN0ZW5lciBtb3VzZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8cmVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAocmVjdHMgW2ldLmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgewotCQkJCQkJCQlTdHJpbmcgdGV4dCA9ICJUb29sVGlwICIgKyBpOwotCQkJCQkJCQlpZiAoISh0ZXh0LmVxdWFscyAoc2hlbGwuZ2V0VG9vbFRpcFRleHQgKCkpKSkgewotCQkJCQkJCQkJc2hlbGwuc2V0VG9vbFRpcFRleHQgKCJUb29sVGlwICIgKyBpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2hlbGwuc2V0VG9vbFRpcFRleHQgKG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIG1vdXNlTGlzdGVuZXIpOwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRW50ZXIsIG1vdXNlTGlzdGVuZXIpOwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlmb3IgKGludCBpPTA7IGk8cmVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZCAoY29sb3JzIFtpXSk7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUgKHJlY3RzIFtpXSk7Ci0JCQkJCWdjLmRyYXdSZWN0YW5nbGUgKHJlY3RzIFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1MTFlNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBlbWJlZCBjb250cm9scwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyMTcgewotCQotCXN0YXRpYyBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJUaGlzIHNuaXBwZXQgc2hvd3MgaG93IHRvIGVtYmVkIHdpZGdldHMgaW4gYSBTdHlsZWRUZXh0LlxuIisKLQkJIkhlcmUgaXMgb25lOiBcdUZGRkMsIGFuZCBoZXJlIGlzIGFub3RoZXI6IFx1RkZGQy4iOwotCXN0YXRpYyBpbnRbXSBvZmZzZXRzOwotCXN0YXRpYyBDb250cm9sW10gY29udHJvbHM7Ci0Jc3RhdGljIGludCBNQVJHSU4gPSA1OwotCQotCXN0YXRpYyB2b2lkIGFkZENvbnRyb2woQ29udHJvbCBjb250cm9sLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSAoKTsKLQkJc3R5bGUuc3RhcnQgPSBvZmZzZXQ7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCWNvbnRyb2wucGFjaygpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbnRyb2wuZ2V0Qm91bmRzKCk7Ci0JCWludCBhc2NlbnQgPSAyKnJlY3QuaGVpZ2h0LzM7Ci0JCWludCBkZXNjZW50ID0gcmVjdC5oZWlnaHQgLSBhc2NlbnQ7Ci0JCXN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGFzY2VudCArIE1BUkdJTiwgZGVzY2VudCArIE1BUkdJTiwgcmVjdC53aWR0aCArIDIqTUFSR0lOKTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAzMiwgU1dULk5PUk1BTCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRGb250KGZvbnQpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCWNvbnRyb2xzID0gbmV3IENvbnRyb2xbMl07Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlZFRleHQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JCWNvbnRyb2xzWzBdID0gYnV0dG9uOwotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzdHlsZWRUZXh0LCBTV1QuTk9ORSk7Ci0JCWNvbWJvLmFkZCgiaXRlbSAxIik7Ci0JCWNvbWJvLmFkZCgiYW5vdGhlciBpdGVtIik7Ci0JCWNvbnRyb2xzWzFdID0gY29tYm87Ci0JCW9mZnNldHMgPSBuZXcgaW50W2NvbnRyb2xzLmxlbmd0aF07Ci0JCWludCBsYXN0T2Zmc2V0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaW50IG9mZnNldCA9IHRleHQuaW5kZXhPZigiXHVGRkZDIiwgbGFzdE9mZnNldCk7Ci0JCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJYWRkQ29udHJvbChjb250cm9sc1tpXSwgb2Zmc2V0c1tpXSk7Ci0JCQlsYXN0T2Zmc2V0ID0gb2Zmc2V0ICsgMTsKLQkJfQotCQkKLQkJLy8gdXNlIGEgdmVyaWZ5IGxpc3RlbmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgdXAgdG8gZGF0ZQotCQlzdHlsZWRUZXh0LmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBWZXJpZnlMaXN0ZW5lcigpICB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJCWludCByZXBsYWNlQ2hhckNvdW50ID0gZS5lbmQgLSBlLnN0YXJ0OwotCQkJCWludCBuZXdDaGFyQ291bnQgPSBlLnRleHQubGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IHN0YXJ0ICsgcmVwbGFjZUNoYXJDb3VudCkgewotCQkJCQkJLy8gdGhpcyB3aWRnZXQgaXMgYmVpbmcgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0Ci0JCQkJCQlpZiAoY29udHJvbHNbaV0gIT0gbnVsbCAmJiAhY29udHJvbHNbaV0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJY29udHJvbHNbaV0uZGlzcG9zZSgpOwotCQkJCQkJCWNvbnRyb2xzW2ldID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCW9mZnNldCA9IC0xOwotCQkJCQl9Ci0JCQkJCWlmIChvZmZzZXQgIT0gLTEgJiYgb2Zmc2V0ID49IHN0YXJ0KSBvZmZzZXQgKz0gbmV3Q2hhckNvdW50IC0gcmVwbGFjZUNoYXJDb3VudDsKLQkJCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gcmVwb3NpdGlvbiB3aWRnZXRzIG9uIHBhaW50IGV2ZW50Ci0JCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lcihuZXcgUGFpbnRPYmplY3RMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gZXZlbnQuc3R5bGU7Ci0JCQkJaW50IHN0YXJ0ID0gc3R5bGUuc3RhcnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPT0gb2Zmc2V0KSB7Ci0JCQkJCQlQb2ludCBwdCA9IGNvbnRyb2xzW2ldLmdldFNpemUoKTsKLQkJCQkJCWludCB4ID0gZXZlbnQueCArIE1BUkdJTjsKLQkJCQkJCWludCB5ID0gZXZlbnQueSArIGV2ZW50LmFzY2VudCAtIDIqcHQueS8zOwotCQkJCQkJY29udHJvbHNbaV0uc2V0TG9jYXRpb24oeCwgeSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQkKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyNGE0MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIFN0eWxlZFRleHQgc25pcHBldDogdXNlIGdyYWRpZW50IGJhY2tncm91bmQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTggewotCi0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gIlBsYW5zIGRvIG5vdCBtYXRlcmlhbGl6ZSBvdXQgb2Ygbm93aGVyZSwgbm9yIGFyZSB0aGV5IGVudGlyZWx5IHN0YXRpYy4gVG8gZW5zdXJlIHRoZSBwbGFubmluZyBwcm9jZXNzIGlzICIgKwotCQkidHJhbnNwYXJlbnQgYW5kIG9wZW4gdG8gdGhlIGVudGlyZSBFY2xpcHNlIGNvbW11bml0eSwgd2UgKHRoZSBFY2xpcHNlIFBNQykgcG9zdCBwbGFucyBpbiBhbiBlbWJyeW9uaWMgIisKLQkJImZvcm0gYW5kIHJldmlzZSB0aGVtIHRocm91Z2hvdXQgdGhlIHJlbGVhc2UgY3ljbGUuIFxuIisKLQkJIlRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwbGFuIGRlYWxzIHdpdGggdGhlIGltcG9ydGFudCBtYXR0ZXJzIG9mIHJlbGVhc2UgZGVsaXZlcmFibGVzLCByZWxlYXNlIG1pbGVzdG9uZXMsIHRhcmdldCAiKwotCQkib3BlcmF0aW5nIGVudmlyb25tZW50cywgYW5kIHJlbGVhc2UtdG8tcmVsZWFzZSBjb21wYXRpYmlsaXR5LiBUaGVzZSBhcmUgYWxsIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgY2xlYXIgZm9yICIrCi0JCSJhbnkgcmVsZWFzZSwgZXZlbiBpZiBubyBmZWF0dXJlcyB3ZXJlIHRvIGNoYW5nZS4gIFxuIjsKLQlzdGF0aWMgSW1hZ2Ugb2xkSW1hZ2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCAxNiwgU1dULkJPTEQpOwotCQlzdHlsZWRUZXh0LnNldEZvbnQoZm9udCk7Ci0JCXN0eWxlZFRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSkpOwotCQlzdHlsZWRUZXh0LmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBzdHlsZWRUZXh0LmdldENsaWVudEFyZWEgKCk7Ci0JCQkJSW1hZ2UgbmV3SW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDEsIE1hdGgubWF4ICgxLCByZWN0LmhlaWdodCkpOwotCQkJCUdDIGdjID0gbmV3IEdDIChuZXdJbWFnZSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnksIDEsIHJlY3QuaGVpZ2h0LCB0cnVlKTsKLQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCXN0eWxlZFRleHQuc2V0QmFja2dyb3VuZEltYWdlIChuZXdJbWFnZSk7Ci0JCQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCQkJb2xkSW1hZ2UgPSBuZXdJbWFnZTsKLQkJCX0KLQkJfSk7CQotCQlzaGVsbC5zZXRTaXplKDcwMCwgNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNzYwOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBSZWdpb24gc25pcHBldDogQ3JlYXRlIG5vbi1yZWN0YW5ndWxhciBzaGVsbCBmcm9tIGFuIGltYWdlIHdpdGggdHJhbnNwYXJlbmN5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxOSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICAgICAgZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgICAgICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLSAgICAgICAgUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLSAgICAgICAgZmluYWwgSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotICAgICAgICBpZiAoaW1hZ2VEYXRhLmFscGhhRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgIAlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotICAgICAgICAJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGltYWdlRGF0YS53aWR0aDsgeCsrKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGEuZ2V0QWxwaGEoeCwgeSkgPT0gMjU1KSB7Ci0JICAgICAgICAgICAgICAgIAlwaXhlbC54ID0gaW1hZ2VEYXRhLnggKyB4OwotICAgIAkJCQkJcGl4ZWwueSA9IGltYWdlRGF0YS55ICsgeTsKLQkgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi5hZGQocGl4ZWwpOwotCSAgICAgICAgICAgICAgICB9IAotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCUltYWdlRGF0YSBtYXNrID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLSAgICAgICAgCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0gICAgCQlmb3IgKGludCB5ID0gMDsgeSA8IG1hc2suaGVpZ2h0OyB5KyspIHsKLSAgICAJCQlmb3IgKGludCB4ID0gMDsgeCA8IG1hc2sud2lkdGg7IHgrKykgewotICAgIAkJCQlpZiAobWFzay5nZXRQaXhlbCh4LCB5KSAhPSAwKSB7Ci0gICAgCQkJCQlwaXhlbC54ID0gaW1hZ2VEYXRhLnggKyB4OwotICAgIAkJCQkJcGl4ZWwueSA9IGltYWdlRGF0YS55ICsgeTsKLSAgICAJCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0gICAgICAgIHNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCi0gICAgICAgIExpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlpbnQgc3RhcnRYLCBzdGFydFk7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAgewotICAgICAgICAgICAgCWlmIChlLnR5cGUgPT0gU1dULktleURvd24gJiYgZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotICAgICAgICAgICAgCQlzaGVsbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULk1vdXNlRG93biAmJiBlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCXN0YXJ0WCA9IGUueDsKLQkJCQkJc3RhcnRZID0gZS55OyAKLQkJCQl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuTW91c2VNb3ZlICYmIChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSAhPSAwKSB7Ci0JCQkJCVBvaW50IHAgPSBzaGVsbC50b0Rpc3BsYXkoZS54LCBlLnkpOwotCQkJCQlwLnggLT0gc3RhcnRYOwotCQkJCQlwLnkgLT0gc3RhcnRZOwotCQkJCQlzaGVsbC5zZXRMb2NhdGlvbihwKTsKLQkJCQl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuUGFpbnQpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIGltYWdlRGF0YS54LCBpbWFnZURhdGEueSk7Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbCk7Ci0gICAgICAgIHNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsKTsKLQotICAgICAgICBzaGVsbC5zZXRTaXplKGltYWdlRGF0YS54ICsgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEueSArIGltYWdlRGF0YS5oZWlnaHQpOwotICAgICAgICBzaGVsbC5vcGVuICgpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0gICAgICAgICAgICAgICAgZGlzcGxheS5zbGVlcCAoKTsKLSAgICAgICAgfQotICAgICAgICByZWdpb24uZGlzcG9zZSgpOwotICAgICAgICBpbWFnZS5kaXNwb3NlICgpOwotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YjViYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc2VsZWN0IGFsbCB0aGUgdGV4dCBpbiB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgMCk7Ci0JdGV4dC5zZXRUZXh0ICgiQVNERiIpOwotCXRleHQuc2V0U2l6ZSAoNjQsIDMyKTsKLQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MjUxNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogSW1hZ2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBUcmVlSXRlbQotICoKLSAqIEZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgc25pcHBldCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1DdXN0b21EcmF3aW5nVGFibGVBbmRUcmVlSXRlbXMvY3VzdG9tRHJhdy5odG0jX2V4YW1wbGU1Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMCB7CQotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDM1MCwgMjAwKTsKLQlJbWFnZSB4SW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoeEltYWdlKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdMaW5lKDEsIDEsIDE0LCAxNCk7Ci0JZ2MuZHJhd0xpbmUoMSwgMTQsIDE0LCAxKTsKLQlnYy5kcmF3T3ZhbCgyLCAyLCAxMSwgMTEpOwotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBpbnQgSU1BR0VfTUFSR0lOID0gMjsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlLnNldEJvdW5kcygxMCwgMTAsIDMwMCwgMTUwKTsKLQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoInJvb3QgaXRlbSIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQluZXdJdGVtLnNldFRleHQoImRlc2NlbmRlbnQgIiArIGkpOwotCQlpZiAoaSAlIDIgPT0gMCkgbmV3SXRlbS5zZXREYXRhKHhJbWFnZSk7Ci0JCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCWl0ZW0gPSBuZXdJdGVtOwotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0gYW5kIFBhaW50SXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuICBUaGVyZWZvcmUgaXQgaXMKLQkgKiBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJSW1hZ2UgdHJhaWxpbmdJbWFnZSA9IChJbWFnZSlpdGVtLmdldERhdGEoKTsKLQkJCWlmICh0cmFpbGluZ0ltYWdlICE9IG51bGwpIHsKLQkJCQlldmVudC53aWR0aCArPSB0cmFpbGluZ0ltYWdlLmdldEJvdW5kcygpLndpZHRoICsgSU1BR0VfTUFSR0lOOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlJbWFnZSB0cmFpbGluZ0ltYWdlID0gKEltYWdlKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKHRyYWlsaW5nSW1hZ2UgIT0gbnVsbCkgewotCQkJCWludCB4ID0gZXZlbnQueCArIGV2ZW50LndpZHRoICsgSU1BR0VfTUFSR0lOOwotCQkJCWludCBpdGVtSGVpZ2h0ID0gdHJlZS5nZXRJdGVtSGVpZ2h0KCk7Ci0JCQkJaW50IGltYWdlSGVpZ2h0ID0gdHJhaWxpbmdJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQkJaW50IHkgPSBldmVudC55ICsgKGl0ZW1IZWlnaHQgLSBpbWFnZUhlaWdodCkgLyAyOwotCQkJCWV2ZW50LmdjLmRyYXdJbWFnZSh0cmFpbGluZ0ltYWdlLCB4LCB5KTsKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQl4SW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYwNjkyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IFNjcm9sbCB0cmVlIHdoZW4gbW91c2UgYXQgdG9wIG9yIGJvdHRvbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMSB7Ci0Jc3RhdGljIFJ1bm5hYmxlIEhlYXJ0YmVhdDsKLQlzdGF0aWMgYm9vbGVhbiBUcmFja2luZzsKLQlzdGF0aWMgaW50IFNjcm9sbFNwZWVkID0gNDA7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMC5zZXRUZXh0KCJDb2x1bW4gMCIpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWl0ZW0uc2V0VGV4dCgxLCAiY29sdW1uIDEgLSAiK2kpOwotCQlpdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCA5OyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraik7Ci0JCQlzdWJJdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKyIgIitqKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgyLCAiY29sdW1uIDIgLSAiK2krIiAiK2opOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA5OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKyIgIitrKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKyIgIitqKyIgIitrKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKyIgIitqKyIgIitrKTsKLQkJCX0KLQkJfQotCX0KLQljb2x1bW4wLnBhY2soKTsKLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlIZWFydGJlYXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghVHJhY2tpbmcgfHwgdHJlZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCVBvaW50IGN1cnNvciA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQkJCWN1cnNvciA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGN1cnNvcik7Ci0JCQlTY3JvbGwodHJlZSwgY3Vyc29yLngsIGN1cnNvci55KTsKLQkJCWRpc3BsYXkudGltZXJFeGVjKFNjcm9sbFNwZWVkLCBIZWFydGJlYXQpOwotCQl9Ci0JfTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuTW91c2VFbnRlcjoKLQkJCQlUcmFja2luZyA9IHRydWU7Ci0JCQkJZGlzcGxheS50aW1lckV4ZWMoMCwgSGVhcnRiZWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQlUcmFja2luZyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUVudGVyLCBsaXN0ZW5lcik7IAotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRXhpdCwgbGlzdGVuZXIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotc3RhdGljIHZvaWQgU2Nyb2xsKFRyZWUgdHJlZSwgaW50IHgsIGludCB5KSB7Ci0JVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoeCwgeSkpOwotCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQlSZWN0YW5nbGUgYXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotCWludCBoZWFkZXJIZWlnaHQgPSB0cmVlLmdldEhlYWRlckhlaWdodCgpOwotCWludCBpdGVtSGVpZ2h0PSB0cmVlLmdldEl0ZW1IZWlnaHQoKTsKLQlUcmVlSXRlbSBuZXh0SXRlbSA9IG51bGw7Ci0JaWYgKHkgPCBhcmVhLnkgKyBoZWFkZXJIZWlnaHQgKyAyICogaXRlbUhlaWdodCkgewotCQluZXh0SXRlbSA9IFByZXZpb3VzSXRlbSh0cmVlLCBpdGVtKTsKLQl9Ci0JaWYgKHkgPiBhcmVhLnkgKyBhcmVhLmhlaWdodCAtIDIgKiBpdGVtSGVpZ2h0KSB7Ci0JCW5leHRJdGVtID0gTmV4dEl0ZW0odHJlZSwgaXRlbSk7Ci0JfQotCWlmIChuZXh0SXRlbSAhPSBudWxsKSB0cmVlLnNob3dJdGVtKG5leHRJdGVtKTsKLX0KLQotc3RhdGljIFRyZWVJdGVtIFByZXZpb3VzSXRlbShUcmVlIHRyZWUsIFRyZWVJdGVtIGl0ZW0pIHsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlUcmVlSXRlbSBjaGlsZEl0ZW0gPSBpdGVtOwotCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBjaGlsZEl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCWludCBpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JaWYgKGluZGV4ID09IDApIHsKLQkJcmV0dXJuIHBhcmVudEl0ZW07Ci0JfSBlbHNlIHsKLQkJVHJlZUl0ZW0gbmV4dEl0ZW0gPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW0oaW5kZXgtMSkgOiBwYXJlbnRJdGVtLmdldEl0ZW0oaW5kZXgtMSk7Ci0JCWludCBjb3VudCA9IG5leHRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl3aGlsZSAoY291bnQgPiAwICYmIG5leHRJdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJCW5leHRJdGVtID0gbmV4dEl0ZW0uZ2V0SXRlbShjb3VudCAtIDEpOwotCQkJY291bnQgPSBuZXh0SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJfQotCQlyZXR1cm4gbmV4dEl0ZW07Ci0JfQotfQotc3RhdGljIFRyZWVJdGVtIE5leHRJdGVtKFRyZWUgdHJlZSwgVHJlZUl0ZW0gaXRlbSkgewotCWlmIChpdGVtID09IG51bGwpIHJldHVybiBudWxsOwotCWlmIChpdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJcmV0dXJuIGl0ZW0uZ2V0SXRlbSgwKTsKLQl9IGVsc2UgewotCQlUcmVlSXRlbSBjaGlsZEl0ZW0gPSBpdGVtOwotCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJaW50IGluZGV4ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5pbmRleE9mKGNoaWxkSXRlbSkgOiBwYXJlbnRJdGVtLmluZGV4T2YoY2hpbGRJdGVtKTsKLQkJaW50IGNvdW50ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtQ291bnQoKSA6IHBhcmVudEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoaW5kZXggKyAxIDwgY291bnQpIHsKLQkJCQlyZXR1cm4gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtKGluZGV4ICsgMSkgOiBwYXJlbnRJdGVtLmdldEl0ZW0oaW5kZXggKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBhcmVudEl0ZW0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQljaGlsZEl0ZW0gPSBwYXJlbnRJdGVtOwotCQkJCQlwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQkJaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCQkJCQljb3VudCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbUNvdW50KCkgOiBwYXJlbnRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5OTM4NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IFN0eWxlZFRleHQgYnVsbGV0ZWQgbGlzdCBleGFtcGxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIyIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTdHlsZWRUZXh0IEJ1bGxldCBFeGFtcGxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl0ZXh0LmFwcGVuZCgiSGVyZSBpcyBTdHlsZWRUZXh0IHdpdGggc29tZSBidWxsZXRlZCBsaXN0czpcblxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJSZWQgQnVsbGV0IExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCXRleHQuYXBwZW5kKCJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB0ZXh0LmFwcGVuZCgiTnVtYmVyZWQgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJTdWIgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHRleHQuYXBwZW5kKCJOdW1iZXJlZCBMaXN0IEl0ZW0gIiArICgyICsgaSkgKyAiXG4iKTsKLQl0ZXh0LmFwcGVuZCgiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgdGV4dC5hcHBlbmQoIkN1c3RvbSBEcmF3IExpc3QgSXRlbSAiICsgaSArICJcbiIpOwkKLQlzdHlsZWRUZXh0LnNldFRleHQodGV4dC50b1N0cmluZygpKTsKLQkJCi0JU3R5bGVSYW5nZSBzdHlsZTAgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMC5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA0MCk7Ci0Jc3R5bGUwLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUJ1bGxldCBidWxsZXQwID0gbmV3IEJ1bGxldCAoc3R5bGUwKTsKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDUwKTsKLQlzdHlsZTEuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUJ1bGxldCBidWxsZXQxID0gbmV3IEJ1bGxldCAoU1QuQlVMTEVUX05VTUJFUiB8IFNULkJVTExFVF9URVhULCBzdHlsZTEpOwotCWJ1bGxldDEudGV4dCA9ICIuIjsKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDgwKTsKLQlzdHlsZTIuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQlCdWxsZXQgYnVsbGV0MiA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9URVhULCBzdHlsZTIpOwotCWJ1bGxldDIudGV4dCA9ICJcdTI3MTMiOwotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgNTApOwotCUJ1bGxldCBidWxsZXQzID0gbmV3IEJ1bGxldCAoU1QuQlVMTEVUX0NVU1RPTSwgc3R5bGUyKTsKLQotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgyLCA0LCBidWxsZXQwKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoNywgMiwgYnVsbGV0MSk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDksIDQsIGJ1bGxldDIpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgxMywgMiwgYnVsbGV0MSk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDE2LCA0LCBidWxsZXQzKTsKLQotCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lcihuZXcgUGFpbnRPYmplY3RMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCUZvbnQgZm9udCA9IHN0eWxlLmZvbnQ7Ci0JCQlpZiAoZm9udCA9PSBudWxsKSBmb250ID0gc3R5bGVkVGV4dC5nZXRGb250KCk7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQkJbGF5b3V0LnNldEFzY2VudChldmVudC5hc2NlbnQpOwotCQkJbGF5b3V0LnNldERlc2NlbnQoZXZlbnQuZGVzY2VudCk7Ci0JCQlsYXlvdXQuc2V0Rm9udChmb250KTsKLQkJCWxheW91dC5zZXRUZXh0KCJcdTIwMjMgMS4iICsgZXZlbnQuYnVsbGV0SW5kZXggKyAiKSIpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIGV2ZW50LnggKyAxMCwgZXZlbnQueSk7Ci0JCQlsYXlvdXQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODQ0ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogRXhwYW5kQmFyIGV4YW1wbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiRXhwYW5kQmFyIEV4YW1wbGUiKTsKLQlFeHBhbmRCYXIgYmFyID0gbmV3IEV4cGFuZEJhciAoc2hlbGwsIFNXVC5WX1NDUk9MTCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgU25pcHBldDIyMy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlY2xpcHNlLnBuZyIpKTsgCi0JCi0JLy8gRmlyc3QgaXRlbQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5MZWZ0ID0gbGF5b3V0Lm1hcmdpblRvcCA9IGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlBVU0giKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5SQURJTyIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULkNIRUNLIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuVE9HR0xFKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlRPR0dMRSIpOwotCUV4cGFuZEl0ZW0gaXRlbTAgPSBuZXcgRXhwYW5kSXRlbSAoYmFyLCBTV1QuTk9ORSwgMCk7Ci0JaXRlbTAuc2V0VGV4dCgiV2hhdCBpcyB5b3VyIGZhdm9yaXRlIGJ1dHRvbiIpOwotCWl0ZW0wLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMC5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTAuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFNlY29uZCBpdGVtCi0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoYmFyLCBTV1QuTk9ORSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luTGVmdCA9IGxheW91dC5tYXJnaW5Ub3AgPSBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fRVJST1IiKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTikpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fV0FSTklORyIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX1FVRVNUSU9OIik7Ci0JRXhwYW5kSXRlbSBpdGVtMSA9IG5ldyBFeHBhbmRJdGVtIChiYXIsIFNXVC5OT05FLCAxKTsKLQlpdGVtMS5zZXRUZXh0KCJXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbiIpOwotCWl0ZW0xLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTEuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFRoaXJkIGl0ZW0KLQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSk7Ci0JbGF5b3V0Lm1hcmdpbkxlZnQgPSBsYXlvdXQubWFyZ2luVG9wID0gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNjYWxlIik7CQotCW5ldyBTY2FsZSAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNwaW5uZXIiKTsJCi0JbmV3IFNwaW5uZXIgKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNsaWRlciIpOwkKLQluZXcgU2xpZGVyIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlFeHBhbmRJdGVtIGl0ZW0yID0gbmV3IEV4cGFuZEl0ZW0gKGJhciwgU1dULk5PTkUsIDIpOwotCWl0ZW0yLnNldFRleHQoIldoYXQgaXMgeW91ciBmYXZvcml0ZSByYW5nZSB3aWRnZXQiKTsKLQlpdGVtMi5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JaXRlbTIuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCWl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQkKLQlpdGVtMS5zZXRFeHBhbmRlZCh0cnVlKTsKLQliYXIuc2V0U3BhY2luZyg4KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTA4N2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGltcGxlbWVudCByYWRpbyBiZWhhdmlvciBmb3Igc2V0U2VsZWN0aW9uKCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlpZiAoaSA9PSAwKSBidXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTZXQgU2VsZWN0aW9uIHRvIEI0Iik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbiAoKTsKLQkJCUJ1dHRvbiBuZXdCdXR0b24gPSAoQnV0dG9uKSBjaGlsZHJlbiBbNF07Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbiAmJiAoY2hpbGQuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJKChCdXR0b24pIGNoaWxkKS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMzcwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBUb29sdGlwIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgYmFsbG9vbiB0b29sdGlwIGZvciBhIHRyYXkgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCWZpbmFsIFRvb2xUaXAgdGlwID0gbmV3IFRvb2xUaXAoc2hlbGwsIFNXVC5CQUxMT09OIHwgU1dULklDT05fSU5GT1JNQVRJT04pOwotCXRpcC5zZXRNZXNzYWdlKCJIZXJlIGlzIGEgbWVzc2FnZSBmb3IgdGhlIHVzZXIuIFdoZW4gdGhlIG1lc3NhZ2UgaXMgdG9vIGxvbmcgaXQgd3JhcHMuIEkgc2hvdWxkIHNheSBzb21ldGhpbmcgY29vbCBidXQgbm90aGluZyBjb21lcyB0byBteSBtaW5kLiIpOwotCVRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSgpOwotCWlmICh0cmF5ICE9IG51bGwpIHsKLQkJVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSh0cmF5LCBTV1QuTk9ORSk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIFNuaXBwZXQyMjUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZWNsaXBzZS5wbmciKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl0aXAuc2V0VGV4dCgiTm90aWZpY2F0aW9uIGZyb20gYSB0cmF5IGl0ZW0iKTsKLQkJaXRlbS5zZXRUb29sVGlwKHRpcCk7Ci0JfSBlbHNlIHsKLQkJdGlwLnNldFRleHQoIk5vdGlmaWNhdGlvbiBmcm9tIGFueXdoZXJlIik7Ci0JCXRpcC5zZXRMb2NhdGlvbig0MDAsIDQwMCk7Ci0JfQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQcmVzcyBmb3IgYmFsbG9vbiB0aXAiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjaygpOwotCXNoZWxsLnNldEJvdW5kcyg1MCwgNTAsIDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OGRiZmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBjdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjYgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24gZm9yIFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbTEuc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBjPTE7IGMgPCBjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQlpdGVtMS5zZXRUZXh0KGMsICJpdGVtIFsiK2krIi0iK2MrIl0iKTsKLQkJfQotCQlmb3IgKGludCBqPTA7IGo8aXRlbUNvdW50OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtKGl0ZW0xLCBTV1QuTk9ORSk7Ci0JCQlpdGVtMi5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIl0iKTsKLQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJaXRlbTIuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyItIitjKyJdIik7Ci0JCQl9Ci0JCQlmb3IgKGludCBrPTA7IGs8aXRlbUNvdW50OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtMyA9IG5ldyBUcmVlSXRlbShpdGVtMiwgU1dULk5PTkUpOwotCQkJCWl0ZW0zLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiICIraysiXSIpOwotCQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJCWl0ZW0zLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiICIraysiLSIrYysiXSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgJj0gflNXVC5IT1Q7Ci0JCQlpZiAoKGV2ZW50LmRldGFpbCAmIFNXVC5TRUxFQ1RFRCkgIT0gMCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvKgotCQkJCSAqIElmIHlvdSB3aXNoIHRvIHBhaW50IHRoZSBzZWxlY3Rpb24gYmV5b25kIHRoZSBlbmQgb2YKLQkJCQkgKiBsYXN0IGNvbHVtbiwgeW91IG11c3QgY2hhbmdlIHRoZSBjbGlwcGluZyByZWdpb24uCi0JCQkJICovCi0JCQkJaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChldmVudC5pbmRleCA9PSBjb2x1bW5Db3VudCAtIDEgfHwgY29sdW1uQ291bnQgPT0gMCkgewotCQkJCQlpbnQgd2lkdGggPSBhcmVhLnggKyBhcmVhLndpZHRoIC0gZXZlbnQueDsKLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJCWdjLmdldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uYWRkKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOyAKLQkJCQkJCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmIChnYy5nZXRBZHZhbmNlZCgpKSBnYy5zZXRBbHBoYSgxMjcpOwkJCQkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBldmVudC5nZXRCb3VuZHMoKTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCByZWN0LnksIDUwMCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCQkvLyByZXN0b3JlIGNvbG9ycyBmb3Igc3Vic2VxdWVudCBkcmF3aW5nCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9CQkJCQkJCi0JCX0KLQl9KTsJCQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbSgwKSk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsJCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFiNThmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogTXVsdGlwbGUgbGluZXMgaW4gYSBUcmVlSXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI3IHsJCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk11bHRpcGxlIGxpbmVzIGluIGEgVHJlZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsKLQkJY29sdW1uLnNldFdpZHRoKDEwMCk7Ci0JfQotCWludCBpdGVtQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0xLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgYz0xOyBjIDwgY29sdW1uQ291bnQ7IGMrKykgewotCQkJaXRlbTEuc2V0VGV4dChjLCAiaXRlbSBbIitpKyItIitjKyJdIik7Ci0JCX0KLQkJZm9yIChpbnQgaj0wOyBqPGl0ZW1Db3VudDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbShpdGVtMSwgU1dULk5PTkUpOwotCQkJaXRlbTIuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyJdIik7Ci0JCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCWl0ZW0yLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiLSIrYysiXSIpOwotCQkJfQotCQkJZm9yIChpbnQgaz0wOyBrPGl0ZW1Db3VudDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0oaXRlbTIsIFNXVC5OT05FKTsKLQkJCQlpdGVtMy5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIiAiK2srIl0iKTsKLQkJCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCQlpdGVtMy5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIiAiK2srIi0iK2MrIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoaXRlbSwgZXZlbnQuaW5kZXgpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCQkJZXZlbnQud2lkdGggPSBzaXplLng7Ci0JCQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgc2l6ZS55KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQyID0gZXZlbnQuaW5kZXggPT0gMCA/IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMikgOiAwOwotCQkJCQlldmVudC5nYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54LCBldmVudC55ICsgb2Zmc2V0MiwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5FcmFzZUl0ZW06IHsJCi0JCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0VGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotCQkJaWYgKGNvbHVtbiAhPSAwKSB7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaW50IGluZGV4ID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmluZGV4T2YoaXRlbSkgOiBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDEpewotCQkJCQl0ZXh0ICs9IlxubmV3IGxpbmUiOwotCQkJCX0KLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDIpIHsKLQkJCQkJdGV4dCArPSJcbm5ldyBsaW5lXG5uZXcgbGluZSI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0KLQlzaGVsbC5zZXRTaXplKDYwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyODcxMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRHJhdyBhIGJhciBncmFwaAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsJCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5zZXRUZXh0KCJTaG93IHJlc3VsdHMgYXMgYSBiYXIgY2hhcnQgaW4gVGFibGUiKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiQnVnIFN0YXR1cyIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJQZXJjZW50Iik7Ci0JY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCVN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbXXsiUmVzb2x2ZWQiLCAiTmV3IiwgIldvbid0IEZpeCIsICJJbnZhbGlkIn07Ci0JZm9yIChpbnQgaT0wOyBpPGxhYmVscy5sZW5ndGg7IGkrKykgewotCQkgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCSBpdGVtLnNldFRleHQobGFiZWxzW2ldKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJaW50W10gcGVyY2VudHMgPSBuZXcgaW50W10gezUwLCAzMCwgNSwgMTV9OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmluZGV4ID09IDEpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQkJaW50IHBlcmNlbnQgPSBwZXJjZW50c1tpbmRleF07Ci0JCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQkJCQlpbnQgd2lkdGggPSAoY29sdW1uMi5nZXRXaWR0aCgpIC0gMSkgKiBwZXJjZW50IC8gMTAwOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0LCB0cnVlKTsJCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgtMSwgZXZlbnQuaGVpZ2h0LTEpOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUocmVjdDIpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBwZXJjZW50KyIlIjsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJCWdjLmRyYXdUZXh0KHRleHQsIGV2ZW50LngrMiwgZXZlbnQueStvZmZzZXQsIHRydWUpOwotCQkJCWdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCX0KLQkJfQotCX0pOwkJCi0JCQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM1MTNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgY3VzdG9tIGdyYWRpZW50IHNlbGVjdGlvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIitpKyIgYSIsICJpdGVtICIraSsiIGIiLCAiaXRlbSAiK2krIiBjIn0pOwotCX0JCQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuSE9UOwkKLQkJCWlmKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSBhcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCS8qCi0JCQkJICogSWYgeW91IHdpc2ggdG8gcGFpbnQgdGhlIHNlbGVjdGlvbiBiZXlvbmQgdGhlIGVuZCBvZgotCQkJCSAqIGxhc3QgY29sdW1uLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGNsaXBwaW5nIHJlZ2lvbi4KLQkJCQkgKi8KLQkJCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChldmVudC5pbmRleCA9PSBjb2x1bW5Db3VudCAtIDEgfHwgY29sdW1uQ291bnQgPT0gMCkgewotCQkJCQlpbnQgd2lkdGggPSBhcmVhLnggKyBhcmVhLndpZHRoIC0gZXZlbnQueDsKLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJCWdjLmdldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uYWRkKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOyAKLQkJCQkJCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmIChnYy5nZXRBZHZhbmNlZCgpKSBnYy5zZXRBbHBoYSgxMjcpOwkJCQkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBldmVudC5nZXRCb3VuZHMoKTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCByZWN0LnksIDUwMCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCQkvLyByZXN0b3JlIGNvbG9ycyBmb3Igc3Vic2VxdWVudCBkcmF3aW5nCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9CQkJCQkJCi0JCX0KLQl9KTsJCQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24odGFibGUuZ2V0SXRlbSgwKSk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsJCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMzY5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmFja2VyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJhY2tlciAoZHJhZyBvbiBtb3VzZSBkb3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlUcmFja2VyIHRyYWNrZXIgPSBuZXcgVHJhY2tlciAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXRyYWNrZXIuc2V0UmVjdGFuZ2xlcyAobmV3IFJlY3RhbmdsZSBbXSB7Ci0JCQkJbmV3IFJlY3RhbmdsZSAoZS54LCBlLnksIDEwMCwgMTAwKSwKLQkJCX0pOwotCQkJdHJhY2tlci5vcGVuICgpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwNjJkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogSW1hZ2VzIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYSBUYWJsZUl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJJbWFnZXMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIFRhYmxlSXRlbSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CQkJCi0JaW50IGNvbHVtbkNvdW50ID0gMzsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIraSsiIGEiLCAiaXRlbSAiK2krIiBiIiwgIml0ZW0gIitpKyIgYyJ9KTsKLQl9Ci0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlMaXN0ZW5lciBwYWludExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewkJCi0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1lYXN1cmVJdGVtOiB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWV2ZW50LndpZHRoICs9IHJlY3Qud2lkdGg7Ci0JCQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgcmVjdC5oZWlnaHQgKyAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpbnQgeCA9IGV2ZW50LnggKyBldmVudC53aWR0aDsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG9mZnNldCA9IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSByZWN0LmhlaWdodCkgLyAyKTsKLQkJCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCBldmVudC55ICsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsJCQotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7CQkKLQotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQkKLQlzaGVsbC5zZXRTaXplKDUwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY3OGUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogTXVsdGlwbGUgbGluZXMgcGVyIFRhYmxlSXRlbQotICoKLSAqIEZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgc25pcHBldCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1DdXN0b21EcmF3aW5nVGFibGVBbmRUcmVlSXRlbXMvY3VzdG9tRHJhdy5odG0jX2V4YW1wbGU2Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSA0OwotCWZpbmFsIGludCBJVEVNX0NPVU5UID0gODsKLQlmaW5hbCBpbnQgVEVYVF9NQVJHSU4gPSAzOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBDT0xVTU5fQ09VTlQ7IGkrKykgewotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVNX0NPVU5UOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgQ09MVU1OX0NPVU5UOyBqKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiaXRlbSAiICsgaSArICIgY29sICIgKyBqOwotCQkJaWYgKChpICsgaikgJSAzID09IDEpIHsKLQkJCQlzdHJpbmcgKz0iXG5uZXcgbGluZTEiOwotCQkJfQotCQkJaWYgKChpICsgaikgJSAzID09IDIpIHsKLQkJCQlzdHJpbmcgKz0iXG5uZXcgbGluZTFcbm5ldyBsaW5lMiI7Ci0JCQl9Ci0JCQlpdGVtLnNldFRleHQoaiwgc3RyaW5nKTsKLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KGV2ZW50LmluZGV4KTsKLQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQkJZXZlbnQud2lkdGggPSBzaXplLnggKyAyICogVEVYVF9NQVJHSU47Ci0JCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHNpemUueSArIFRFWFRfTUFSR0lOKTsKLQkJfQotCX0pOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KGV2ZW50LmluZGV4KTsKLQkJCS8qIGNlbnRlciBjb2x1bW4gMSB2ZXJ0aWNhbGx5ICovCi0JCQlpbnQgeU9mZnNldCA9IDA7Ci0JCQlpZiAoZXZlbnQuaW5kZXggPT0gMSkgewotCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQkJCXlPZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJfQotCQkJZXZlbnQuZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCArIFRFWFRfTUFSR0lOLCBldmVudC55ICsgeU9mZnNldCwgdHJ1ZSk7Ci0JCX0KLQl9KTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgQ09MVU1OX0NPVU5UOyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0JdGFibGUucGFjaygpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEyY2ZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBiYXIgZ3JhcGgKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7CQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIFRyZWUiKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkJ1ZyBTdGF0dXMiKTsKLQljb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiUGVyY2VudCIpOwotCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQlTdHJpbmdbXSBzdGF0ZXMgPSBuZXcgU3RyaW5nW117IlJlc29sdmVkIiwgIk5ldyIsICJXb24ndCBGaXgiLCAiSW52YWxpZCJ9OwotCVN0cmluZ1tdIHRlYW1zID0gbmV3IFN0cmluZ1tdIHsiVUkiLCAiU1dUIiwgIk9TR0kifTsKLQlmb3IgKGludCBpPTA7IGk8dGVhbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0ZWFtc1tpXSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc3RhdGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dChzdGF0ZXNbal0pOwkKLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCWludFtdIHBlcmNlbnRzID0gbmV3IGludFtdIHs1MCwgMzAsIDUsIDE1fTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pbmRleCA9PSAxKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQlpbnQgaW5kZXggPSBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQkJaW50IHBlcmNlbnQgPSBwZXJjZW50c1tpbmRleF07Ci0JCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJCWludCB3aWR0aCA9IChjb2x1bW4yLmdldFdpZHRoKCkgLSAxKSAqIHBlcmNlbnQgLyAxMDA7Ci0JCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0LCB0cnVlKTsJCQkJCQotCQkJCQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLTEsIGV2ZW50LmhlaWdodC0xKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0Mik7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gcGVyY2VudCsiJSI7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJCQlnYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54KzIsIGV2ZW50Lnkrb2Zmc2V0LCB0cnVlKTsKLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsJCQotCQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNDEyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsIGFuZCBwb3NpdGlvbiBpdAotICogd2l0aCB1cHBlciBsZWZ0IGNvcm5lciBhdCBjdXJzb3IgcG9zaXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMzIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCAoIlBhcmVudCBTaGVsbCIpOwotCQlzaGVsbC5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGUpIHsKLQkJCQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQlkaWFsb2cuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCWRpYWxvZy5zZXRUZXh0ICgiRGlhbG9nIFNoZWxsIik7Ci0JCQkJZGlhbG9nLnNldFNpemUgKDEwMCwgMTAwKTsKLQkJCQlkaWFsb2cub3BlbiAoKTsgCi0JCQl9fSk7Ci0JCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTM5YWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRml4ZWQgZmlyc3QgY29sdW1uIGFuZCBob3Jpem9udGFsIHNjcm9sbCByZW1haW5pbmcgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWludCByb3dDb3VudCA9IDQwOwotCWludCBjb2x1bW5Db3VudCA9IDE1OwotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQlmaW5hbCBUYWJsZSBsZWZ0VGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWxlZnRUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JbGVmdFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGUgcmlnaHRUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JcmlnaHRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCUdyaWREYXRhIHRhYmxlMkRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAyKTsKLQlyaWdodFRhYmxlLnNldExheW91dERhdGEodGFibGUyRGF0YSk7Ci0JLy8gQ3JlYXRlIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKGxlZnRUYWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiTmFtZSIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTUwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHJpZ2h0VGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIlZhbHVlICIraSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCX0KLQkvLyBDcmVhdGUgcm93cwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obGVmdFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShyaWdodFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0KGosICJJdGVtICIraSsiIHZhbHVlIEAgIitqKTsKLQkJfQotCX0KLQkvLyBNYWtlIHNlbGVjdGlvbiB0aGUgc2FtZSBpbiBib3RoIHRhYmxlcwotCWxlZnRUYWJsZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlyaWdodFRhYmxlLnNldFNlbGVjdGlvbihsZWZ0VGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkJfQotCX0pOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFNlbGVjdGlvbihyaWdodFRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCX0KLQl9KTsKLQkvLyBPbiBXaW5kb3dzLCB0aGUgc2VsZWN0aW9uIGlzIGdyYXkgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JLy8gVG8gbWFrZSBib3RoIHRhYmxlcyBhcHBlYXIgaW4gZm9jdXMsIGRyYXcgdGhlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGhlcmUuCi0JLy8gVGhpcyBwYXJ0IG9ubHkgd29ya3Mgb24gdmVyc2lvbiAzLjIgb3IgbGF0ZXIuCi0JTGlzdGVuZXIgZXJhc2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkhPVDsKLQkJCWlmKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpOwotCQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7CQkJCQkKLQkJCX0KLQkJfQotCX07Ci0JCi0JbGVmdFRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIGVyYXNlTGlzdGVuZXIpOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgZXJhc2VMaXN0ZW5lcik7Ci0JLy8gTWFrZSB2ZXJ0aWNhbCBzY3JvbGxiYXJzIHNjcm9sbCB0b2dldGhlcgotCVNjcm9sbEJhciB2QmFyTGVmdCA9IGxlZnRUYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotCXZCYXJMZWZ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXJpZ2h0VGFibGUuc2V0VG9wSW5kZXgobGVmdFRhYmxlLmdldFRvcEluZGV4KCkpOwotCQl9Ci0JfSk7Ci0JU2Nyb2xsQmFyIHZCYXJSaWdodCA9IHJpZ2h0VGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQl2QmFyUmlnaHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFRvcEluZGV4KHJpZ2h0VGFibGUuZ2V0VG9wSW5kZXgoKSk7Ci0JCX0KLQl9KTsKLQkvLyBIb3Jpem9udGFsIGJhciBvbiBzZWNvbmQgdGFibGUgdGFrZXMgdXAgYSBsaXR0bGUgZXh0cmEgc3BhY2UuCi0JLy8gVG8ga2VlcCB2ZXJ0aWNhbCBzY3JvbGwgYmFycyBpbiBzaW5rLCBmb3JjZSB0YWJsZTEgdG8gZW5kIGFib3ZlCi0JLy8gaG9yaXpvbnRhbCBzY3JvbGxiYXIKLQlTY3JvbGxCYXIgaEJhclJpZ2h0ID0gcmlnaHRUYWJsZS5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWREYXRhIHNwYWNlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGFjZXJEYXRhLmhlaWdodEhpbnQgPSBoQmFyUmlnaHQuZ2V0U2l6ZSgpLnk7Ci0Jc3BhY2VyLnNldFZpc2libGUoZmFsc2UpOwotCXBhcmVudC5zZXRCYWNrZ3JvdW5kKGxlZnRUYWJsZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQotCXNoZWxsLnNldFNpemUoNjAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3YTU5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgYSBzeXN0ZW0gc2V0dGluZ3MgY2hhbmdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzUgewotCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUaGUgU1dULlNldHRpbmdzIEV2ZW50Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuV1JBUCk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JbGFiZWwuc2V0VGV4dCgiQ2hhbmdlIGEgc3lzdGVtIHNldHRpbmcgYW5kIHRoZSB0YWJsZSBiZWxvdyB3aWxsIGJlIHVwZGF0ZWQuIik7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCBjb2xvck5hbWVzW2ldKTsKLQkJaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGNvbG9yKTsKLQkJaXRlbS5zZXRUZXh0KDIsIGNvbG9yLnRvU3RyaW5nKCkpOwotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JY29sdW1uc1swXS5wYWNrKCk7Ci0JY29sdW1uc1syXS5wYWNrKCk7Ci0JZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuU2V0dGluZ3MsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShpKTsKLQkJCQlpdGVtLnNldEJhY2tncm91bmQoMSwgY29sb3IpOwotCQkJfQotCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJY29sdW1uc1swXS5wYWNrKCk7Ci0JCQljb2x1bW5zWzJdLnBhY2soKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotc3RhdGljIGludFtdIGNvbG9ySWRzID0gbmV3IGludFtdIHtTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5ELCAKLQkJU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCwgCi0JCVNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTiwKLQkJU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQsCi0JCVNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCVNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1csCi0JCVNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XLAotCQlTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVywKLQkJU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLH07Ci1zdGF0aWMgU3RyaW5nIFtdIGNvbG9yTmFtZXMgPSBuZXcgU3RyaW5nW10geyJTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQiLCAKLQkJIlNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCIsCi0JCSJTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04iLAotCQkiU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfQk9SREVSIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciLH07Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjU3ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGRpZmZlcmVudCBmb3JlZ3JvdW5kIGNvbG9ycyBmb3IgdGV4dCBpbiBhIFRhYmxlSXRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUYWJsZTogQ2hhbmdlIHN0eWxlIG11bHRpcGxlIHRpbWVzIGluIGNlbGwiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCQkKLQl9Ci0JZmluYWwgVGV4dExheW91dCB0ZXh0TGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JdGV4dExheW91dC5zZXRUZXh0KCJTV1Q6IFN0YW5kYXJkIFdpZGdldCBUb29sa2l0Iik7Ci0JRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnQgZm9udDMgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5JVEFMSUMpOwotCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQxLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpLCBudWxsKTsKLQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250MywgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwgbnVsbCk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTEsIDAsIDApOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgNSwgMTIpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCAxLCAxKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTIsIDE0LCAxOSk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTMsIDIsIDIpOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMjEsIDI3KTsKLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGV4dExheW91dC5kcmF3KGV2ZW50LmdjLCBldmVudC54LCBldmVudC55KTsKLQkJfQotCX0pOwotCWZpbmFsIFJlY3RhbmdsZSB0ZXh0TGF5b3V0Qm91bmRzID0gdGV4dExheW91dC5nZXRCb3VuZHMoKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZS53aWR0aCA9IHRleHRMYXlvdXRCb3VuZHMud2lkdGggKyAyOwotCQkJZS5oZWlnaHQgPSB0ZXh0TGF5b3V0Qm91bmRzLmhlaWdodCArIDI7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb250MS5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCWZvbnQzLmRpc3Bvc2UoKTsKLQl0ZXh0TGF5b3V0LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MjNmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBDb21wb3NpdGUgU25pcHBldDogaW5oZXJpdCBhIGJhY2tncm91bmQgY29sb3Igb3IgaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kTW9kZSgpIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCi0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKTsKLQkKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldFRleHQoIlNXVC5JTkhFUklUX05PTkUiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9OT05FKTsKLQljcmVhdGVDaGlsZHJlbihncm91cCk7Ci0JCi0JZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRUZXh0KCJTV1QuSU5IRVJJVF9ERUZBVUxUIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0VGV4dCgiU1dULklOSEVSSVRfRk9SQ0UiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9GT1JDRSk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDEiKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDIiKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJMYWJlbCIpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQlidXR0b24uc2V0VGV4dCgiUmFkaW8gQnV0dG9uIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYnV0dG9uLnNldFRleHQoIkNoZWNrIGJveCBCdXR0b24iKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQdXNoIEJ1dHRvbiIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0KCJUZXh0Iik7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNmNlMDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgcG9wdXAgbWVudSB3aXRoIGEgc3VibWVudQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb21wb3NpdGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbTEgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtMS5zZXRUZXh0ICgiUHVzaCBJdGVtIik7Ci0JTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlpdGVtMi5zZXRUZXh0ICgiQ2FzY2FkZSBJdGVtIik7Ci0JTWVudSBzdWJNZW51ID0gbmV3IE1lbnUgKG1lbnUpOwotCWl0ZW0yLnNldE1lbnUgKHN1Yk1lbnUpOwotCU1lbnVJdGVtIHN1Ykl0ZW0xID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTEuc2V0VGV4dCAoIlN1Yml0ZW0gMSIpOwotCU1lbnVJdGVtIHN1Ykl0ZW0yID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTIuc2V0VGV4dCAoIlN1Yml0ZW0gMiIpOwotCWNvbXBvc2l0ZS5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDczMmUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgc25pcHBldDogbWFrZSB0ZXh0IHNwYW4gbXVsdGlwbGUgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRhYmxlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCAiaXRlbSAiK2krIiBhIik7Ci0JCWl0ZW0uc2V0VGV4dCgzLCAiaXRlbSAiK2krIiBkIik7Ci0JfQkKLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCWZpbmFsIFN0cmluZyBzdHJpbmcgPSAidGV4dCB0aGF0IHNwYW5zIHR3byBjb2x1bW5zIjsKLQlHQyBnYyA9IG5ldyBHQyh0YWJsZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IHRhYmxlLmdldENvbHVtbigxKTsKLQkJCQkJCQlvZmZzZXQgPSBjb2x1bW4xLmdldFdpZHRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQlldmVudC5nYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyAoZXZlbnQuaGVpZ2h0IC0gZXh0ZW50LnkpLzI7Ci0JCQkJCQlldmVudC5nYy5kcmF3U3RyaW5nKHN0cmluZywgZXZlbnQueCAtIG9mZnNldCwgeSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNDRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBDUiBpbiBhIHRleHQgb3IgY29tYm8gY29udHJvbCAoZGVmYXVsdCBzZWxlY3Rpb24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJBLTEiLCAiQi0xIiwgIkMtMSJ9KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQgKCJzb21lIHRleHQiKTsKLQljb21iby5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZS53aWRnZXQgKyAiIC0gRGVmYXVsdCBTZWxlY3Rpb24iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThhMWI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgc25pcHBldDogVGV4dCB0aGF0IHNwYW5zIG11bHRpcGxlIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRyZWVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIitpKyIgYSIpOwotCQlpdGVtLnNldFRleHQoMywgIml0ZW0gIitpKyIgZCIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoMCwgInN1Ykl0ZW0gIitpKyItIitqKyIgYSIpOwotCQkJc3ViSXRlbS5zZXRUZXh0KDMsICJzdWJJdGVtICIraSsiLSIraisiIGQiKTsKLQkJfQotCX0JCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgc3RyaW5nID0gInRleHQgdGhhdCBzcGFucyB0d28gY29sdW1ucyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCQkJb2Zmc2V0ID0gY29sdW1uMS5nZXRXaWR0aCgpOwotCQkJCQkJfQotCQkJCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgKGV2ZW50LmhlaWdodCAtIGV4dGVudC55KS8yOwotCQkJCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyhzdHJpbmcsIGV2ZW50LnggLSBvZmZzZXQsIHksIHRydWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmMWU4My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRleHQgc25pcHBldDogT3ZlcnJpZGUgVGFiIGJlaGF2aW9yIHRvIHRyYXZlcnNlIG91dCBvZiBhIFRleHQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwxMCwyMDAsMjAwKTsKLQlUZXh0IHRleHQxID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQl0ZXh0MS5zZXRCb3VuZHMoMTAsMTAsMTUwLDUwKTsKLQl0ZXh0MS5zZXRUZXh0KCJUYWIgd2lsbCB0cmF2ZXJzZSBvdXQgZnJvbSBoZXJlLiIpOwotCXRleHQxLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQl0ZXh0Mi5zZXRCb3VuZHMoMTAsMTAwLDE1MCw1MCk7Ci0JdGV4dDIuc2V0VGV4dCgiQnV0IFRhYiB3aWxsIE5PVCB0cmF2ZXJzZSBvdXQgZnJvbSBoZXJlIChDdHJsK1RhYiB3aWxsKS4iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQyNzNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogQ3Vyc29yIHNuaXBwZXQ6IEhpZGUgdGhlIEN1cnNvciBvdmVyIGEgY29udHJvbC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotCWNhbnZhcy5zZXRCb3VuZHMoMTAsNTAsMTUwLDEwMCk7Ci0JY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2MuZHJhd1N0cmluZygiaGlkZSBDdXJzb3IgaGVyZSIsIDEwLCAxMCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNyZWF0ZSBhIGN1cnNvciB3aXRoIGEgdHJhbnNwYXJlbnQgaW1hZ2UKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlKTsKLQlzb3VyY2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAwOwotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDAsIDApOwotCi0Jc2hlbGwub3BlbigpOwotCWNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyNDJmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRleHQgc25pcHBldDogdHlwZSBpbiBvbmUgdGV4dCwgb3V0cHV0IHRvIGFub3RoZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0MCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZmluYWwgVGV4dCB0ZXh0MSA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dDAuYWRkVmVyaWZ5TGlzdGVuZXIgKG5ldyBWZXJpZnlMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQgKFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQl0ZXh0MS5zZXRUb3BJbmRleCAodGV4dDAuZ2V0VG9wSW5kZXggKCkpOwotCQkJdGV4dDEuc2V0U2VsZWN0aW9uIChldmVudC5zdGFydCwgZXZlbnQuZW5kKTsKLQkJCXRleHQxLmluc2VydCAoZXZlbnQudGV4dCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxN2RmZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IERyYXcgYSBib3ggYXJvdW5kIHRleHQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDQgewotCXN0YXRpYyBTdHJpbmcgU0VBUkNIX1NUUklORyA9ICJib3giOwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICAgICAgZmluYWwgQ29sb3IgUkVEID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgICAgIHNoZWxsLnNldEJvdW5kcygxMCwxMCwyNTAsMjUwKTsKLSAgICAgICAgZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgdGV4dC5zZXRCb3VuZHMoMTAsMTAsMjAwLDIwMCk7Ci0gICAgICAgIHRleHQuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBjb250ZW50cyA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCWludCBzdHJpbmdXaWR0aCA9IGV2ZW50LmdjLnN0cmluZ0V4dGVudChTRUFSQ0hfU1RSSU5HKS54OwotCQkJCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChSRUQpOwotCQkJCWludCBpbmRleCA9IGNvbnRlbnRzLmluZGV4T2YoU0VBUkNIX1NUUklORyk7Ci0JCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCVBvaW50IHRvcExlZnQgPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoaW5kZXgpOwotCQkJCQlldmVudC5nYy5kcmF3UmVjdGFuZ2xlKHRvcExlZnQueCAtIDEsIHRvcExlZnQueSwgc3RyaW5nV2lkdGggKyAxLCBsaW5lSGVpZ2h0IC0gMSk7Ci0JCQkJCWluZGV4ID0gY29udGVudHMuaW5kZXhPZihTRUFSQ0hfU1RSSU5HLCBpbmRleCArIDEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBkZW1vbnN0cmF0ZXMgZHJhd2luZyBhIGJveFxuYXJvdW5kIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgdGhlIHdvcmRcbmJveCBpbiB0aGUgU3R5bGVkVGV4dCIpOwotICAgICAgICBzaGVsbC5vcGVuKCk7Ci0gICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjg0MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBDYW52YXMgc25pcHBldDogcGFpbnQgYSBjaXJjbGUgaW4gYSBjYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpOwotCQkJZXZlbnQuZ2MuZHJhd092YWwoMCwgMCwgcmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTg2YjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFdyaXRlIGFuIEltYWdlIHRvIGEgUE5HIGZpbGUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb21pYyBTYW5zIE1TIiwgMjQsIFNXVC5CT0xEKTsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgODcsIDQ4KTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5kcmF3U3RyaW5nKCJTIiwgMywgMCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJZ2MuZHJhd1N0cmluZygiVyIsIDI1LCAwKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCWdjLmRyYXdTdHJpbmcoIlQiLCA2MiwgMCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlLmdldEltYWdlRGF0YSgpfTsKLQkJbG9hZGVyLnNhdmUoInN3dC5wbmciLCBTV1QuSU1BR0VfUE5HKTsKLQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDUwMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyBhIG11bHRpLWxpbmUgdGV4dCB0byBwcm9jZXNzIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ3IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JU3RyaW5nIG1vZGlmaWVyID0gU1dULk1PRDEgPT0gU1dULkNUUkwgPyAiQ3RybCIgOiAiQ29tbWFuZCI7Ci0JdGV4dC5zZXRUZXh0KCJIaXQgIiArIG1vZGlmaWVyICsgIitSZXR1cm5cbnRvIHNlZVxudGhlIGRlZmF1bHQgYnV0dG9uXG5ydW4iKTsKLQl0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULk1PRDEpICE9IDApIGUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRUZXh0KCJPSyIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT0sgc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkwYWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGFsbG93IGVzY2FwZSB0byBjbG9zZSBhIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0OCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBIEJ1dHRvbiAodGhhdCBkb2Vzbid0IHByb2Nlc3MgRXNjYXBlKSIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNGFiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU3RhY2tMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSBTdGFja0xheW91dCB0byBzd2l0Y2ggYmV0d2VlbiBDb21wb3NpdGVzLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ5IHsKLQotCXN0YXRpYyBpbnQgcGFnZU51bSA9IC0xOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzICgxMCwgMTAsIDMwMCwgMjAwKTsKLQkvLyBjcmVhdGUgdGhlIGNvbXBvc2l0ZSB0aGF0IHRoZSBwYWdlcyB3aWxsIHNoYXJlCi0JZmluYWwgQ29tcG9zaXRlIGNvbnRlbnRQYW5lbCA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb250ZW50UGFuZWwuc2V0Qm91bmRzICgxMDAsIDEwLCAxOTAsIDkwKTsKLQlmaW5hbCBTdGFja0xheW91dCBsYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQgKCk7Ci0JY29udGVudFBhbmVsLnNldExheW91dCAobGF5b3V0KTsKLQotCS8vIGNyZWF0ZSB0aGUgZmlyc3QgcGFnZSdzIGNvbnRlbnQKLQlmaW5hbCBDb21wb3NpdGUgcGFnZTAgPSBuZXcgQ29tcG9zaXRlIChjb250ZW50UGFuZWwsIFNXVC5OT05FKTsKLQlwYWdlMC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChwYWdlMCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJMYWJlbCBvbiBwYWdlIDEiKTsKLQlsYWJlbC5wYWNrICgpOwotCi0JLy8gY3JlYXRlIHRoZSBzZWNvbmQgcGFnZSdzIGNvbnRlbnQJCi0JZmluYWwgQ29tcG9zaXRlIHBhZ2UxID0gbmV3IENvbXBvc2l0ZSAoY29udGVudFBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFnZTEuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAocGFnZTEsIFNXVC5OT05FKTsKLQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiBvbiBwYWdlIDIiKTsKLQlidXR0b24ucGFjayAoKTsKLQotCS8vIGNyZWF0ZSB0aGUgYnV0dG9uIHRoYXQgd2lsbCBzd2l0Y2ggYmV0d2VlbiB0aGUgcGFnZXMKLQlCdXR0b24gcGFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JcGFnZUJ1dHRvbi5zZXRUZXh0ICgiUHVzaCIpOwotCXBhZ2VCdXR0b24uc2V0Qm91bmRzICgxMCwgMTAsIDgwLCAyNSk7Ci0JcGFnZUJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlwYWdlTnVtID0gKytwYWdlTnVtICUgMjsKLQkJCWxheW91dC50b3BDb250cm9sID0gcGFnZU51bSA9PSAwID8gcGFnZTAgOiBwYWdlMTsKLQkJCWNvbnRlbnRQYW5lbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JjN2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IGtleSBzdGF0ZSwgY29kZSBhbmQgY2hhcmFjdGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNSB7Ci0KLXN0YXRpYyBTdHJpbmcgc3RhdGVNYXNrIChpbnQgc3RhdGVNYXNrKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHN0cmluZyArPSAiIENUUkwiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgc3RyaW5nICs9ICIgQUxUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgc3RyaW5nICs9ICIgU0hJRlQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpICE9IDApIHN0cmluZyArPSAiIENPTU1BTkQiOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgY2hhcmFjdGVyIChjaGFyIGNoYXJhY3RlcikgewotCXN3aXRjaCAoY2hhcmFjdGVyKSB7Ci0JCWNhc2UgMDogCQlyZXR1cm4gIidcXDAnIjsKLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiJ1xcYiciOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICInXFxyJyI7Ci0JCWNhc2UgU1dULkRFTDoJcmV0dXJuICJERUwiOwotCQljYXNlIFNXVC5FU0M6CXJldHVybiAiRVNDIjsKLQkJY2FzZSBTV1QuTEY6CXJldHVybiAiJ1xcbiciOwotCQljYXNlIFNXVC5UQUI6CXJldHVybiAiJ1xcdCciOwotCX0KLQlyZXR1cm4gIiciICsgY2hhcmFjdGVyICsiJyI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcga2V5Q29kZSAoaW50IGtleUNvZGUpIHsKLQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCi0JCS8qIEtleWJvYXJkIGFuZCBNb3VzZSBNYXNrcyAqLwotCQljYXNlIFNXVC5BTFQ6IAkJcmV0dXJuICJBTFQiOwotCQljYXNlIFNXVC5TSElGVDogCXJldHVybiAiU0hJRlQiOwotCQljYXNlIFNXVC5DT05UUk9MOglyZXR1cm4gIkNPTlRST0wiOwotCQljYXNlIFNXVC5DT01NQU5EOglyZXR1cm4gIkNPTU1BTkQiOwotCQkJCi0JCS8qIE5vbi1OdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULkFSUk9XX1VQOgkJcmV0dXJuICJBUlJPV19VUCI7Ci0JCWNhc2UgU1dULkFSUk9XX0RPV046CXJldHVybiAiQVJST1dfRE9XTiI7Ci0JCWNhc2UgU1dULkFSUk9XX0xFRlQ6CXJldHVybiAiQVJST1dfTEVGVCI7Ci0JCWNhc2UgU1dULkFSUk9XX1JJR0hUOglyZXR1cm4gIkFSUk9XX1JJR0hUIjsKLQkJY2FzZSBTV1QuUEFHRV9VUDoJCXJldHVybiAiUEFHRV9VUCI7Ci0JCWNhc2UgU1dULlBBR0VfRE9XTjoJCXJldHVybiAiUEFHRV9ET1dOIjsKLQkJY2FzZSBTV1QuSE9NRToJCQlyZXR1cm4gIkhPTUUiOwotCQljYXNlIFNXVC5FTkQ6CQkJcmV0dXJuICJFTkQiOwotCQljYXNlIFNXVC5JTlNFUlQ6CQlyZXR1cm4gIklOU0VSVCI7Ci0KLQkJLyogVmlydHVhbCBhbmQgQXNjaWkgS2V5cyAqLwotCQljYXNlIFNXVC5CUzoJcmV0dXJuICJCUyI7Ci0JCWNhc2UgU1dULkNSOglyZXR1cm4gIkNSIjsJCQotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIkxGIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIlRBQiI7Ci0JCi0JCS8qIEZ1bmN0aW9ucyBLZXlzICovCi0JCWNhc2UgU1dULkYxOglyZXR1cm4gIkYxIjsKLQkJY2FzZSBTV1QuRjI6CXJldHVybiAiRjIiOwotCQljYXNlIFNXVC5GMzoJcmV0dXJuICJGMyI7Ci0JCWNhc2UgU1dULkY0OglyZXR1cm4gIkY0IjsKLQkJY2FzZSBTV1QuRjU6CXJldHVybiAiRjUiOwotCQljYXNlIFNXVC5GNjoJcmV0dXJuICJGNiI7Ci0JCWNhc2UgU1dULkY3OglyZXR1cm4gIkY3IjsKLQkJY2FzZSBTV1QuRjg6CXJldHVybiAiRjgiOwotCQljYXNlIFNXVC5GOToJcmV0dXJuICJGOSI7Ci0JCWNhc2UgU1dULkYxMDoJcmV0dXJuICJGMTAiOwotCQljYXNlIFNXVC5GMTE6CXJldHVybiAiRjExIjsKLQkJY2FzZSBTV1QuRjEyOglyZXR1cm4gIkYxMiI7Ci0JCWNhc2UgU1dULkYxMzoJcmV0dXJuICJGMTMiOwotCQljYXNlIFNXVC5GMTQ6CXJldHVybiAiRjE0IjsKLQkJY2FzZSBTV1QuRjE1OglyZXR1cm4gIkYxNSI7Ci0JCQotCQkvKiBOdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULktFWVBBRF9BREQ6CQlyZXR1cm4gIktFWVBBRF9BREQiOwotCQljYXNlIFNXVC5LRVlQQURfU1VCVFJBQ1Q6CXJldHVybiAiS0VZUEFEX1NVQlRSQUNUIjsKLQkJY2FzZSBTV1QuS0VZUEFEX01VTFRJUExZOglyZXR1cm4gIktFWVBBRF9NVUxUSVBMWSI7Ci0JCWNhc2UgU1dULktFWVBBRF9ESVZJREU6CQlyZXR1cm4gIktFWVBBRF9ESVZJREUiOwotCQljYXNlIFNXVC5LRVlQQURfREVDSU1BTDoJcmV0dXJuICJLRVlQQURfREVDSU1BTCI7Ci0JCWNhc2UgU1dULktFWVBBRF9DUjoJCQlyZXR1cm4gIktFWVBBRF9DUiI7Ci0JCWNhc2UgU1dULktFWVBBRF8wOgkJCXJldHVybiAiS0VZUEFEXzAiOwotCQljYXNlIFNXVC5LRVlQQURfMToJCQlyZXR1cm4gIktFWVBBRF8xIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzI6CQkJcmV0dXJuICJLRVlQQURfMiI7Ci0JCWNhc2UgU1dULktFWVBBRF8zOgkJCXJldHVybiAiS0VZUEFEXzMiOwotCQljYXNlIFNXVC5LRVlQQURfNDoJCQlyZXR1cm4gIktFWVBBRF80IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzU6CQkJcmV0dXJuICJLRVlQQURfNSI7Ci0JCWNhc2UgU1dULktFWVBBRF82OgkJCXJldHVybiAiS0VZUEFEXzYiOwotCQljYXNlIFNXVC5LRVlQQURfNzoJCQlyZXR1cm4gIktFWVBBRF83IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzg6CQkJcmV0dXJuICJLRVlQQURfOCI7Ci0JCWNhc2UgU1dULktFWVBBRF85OgkJCXJldHVybiAiS0VZUEFEXzkiOwotCQljYXNlIFNXVC5LRVlQQURfRVFVQUw6CQlyZXR1cm4gIktFWVBBRF9FUVVBTCI7Ci0KLQkJLyogT3RoZXIga2V5cyAqLwotCQljYXNlIFNXVC5DQVBTX0xPQ0s6CQlyZXR1cm4gIkNBUFNfTE9DSyI7Ci0JCWNhc2UgU1dULk5VTV9MT0NLOgkJcmV0dXJuICJOVU1fTE9DSyI7Ci0JCWNhc2UgU1dULlNDUk9MTF9MT0NLOglyZXR1cm4gIlNDUk9MTF9MT0NLIjsKLQkJY2FzZSBTV1QuUEFVU0U6CQkJcmV0dXJuICJQQVVTRSI7Ci0JCWNhc2UgU1dULkJSRUFLOgkJCXJldHVybiAiQlJFQUsiOwotCQljYXNlIFNXVC5QUklOVF9TQ1JFRU46CXJldHVybiAiUFJJTlRfU0NSRUVOIjsKLQkJY2FzZSBTV1QuSEVMUDoJCQlyZXR1cm4gIkhFTFAiOwotCX0KLQlyZXR1cm4gY2hhcmFjdGVyICgoY2hhcikga2V5Q29kZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50eXBlID09IFNXVC5LZXlEb3duID8gIkRPV046IiA6ICJVUCAgOiI7Ci0JCQlzdHJpbmcgKz0gIiBzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spICsgc3RhdGVNYXNrIChlLnN0YXRlTWFzaykgKyAiLCI7Ci0JCQlzdHJpbmcgKz0gIiBrZXlDb2RlPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUua2V5Q29kZSkgKyAiICIgKyBrZXlDb2RlIChlLmtleUNvZGUpICsgIiwiOwotCQkJc3RyaW5nICs9ICIgY2hhcmFjdGVyPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuY2hhcmFjdGVyKSArICIgIiArIGNoYXJhY3RlciAoZS5jaGFyYWN0ZXIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHJpbmcpOwotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OTNiZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGF0ZVRpbWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBEYXRlVGltZSBjYWxlbmRhciBhbmQgYSBEYXRlVGltZSB0aW1lLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0KLQlEYXRlVGltZSBjYWxlbmRhciA9IG5ldyBEYXRlVGltZSAoc2hlbGwsIFNXVC5DQUxFTkRBUik7Ci0JY2FsZW5kYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhbGVuZGFyIGRhdGUgY2hhbmdlZCIpOwotCQl9Ci0JfSk7Ci0KLQlEYXRlVGltZSB0aW1lID0gbmV3IERhdGVUaW1lIChzaGVsbCwgU1dULlRJTUUpOwotCXRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInRpbWUgY2hhbmdlZCIpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2NhMGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERhdGVUaW1lIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgRGF0ZVRpbWUgY2FsZW5kYXIsIGRhdGUsIGFuZCB0aW1lIGluIGEgZGlhbG9nLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCUJ1dHRvbiBvcGVuID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlvcGVuLnNldFRleHQgKCJPcGVuIERpYWxvZyIpOwotCW9wZW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgZmFsc2UpKTsKLQotCQkJZmluYWwgRGF0ZVRpbWUgY2FsZW5kYXIgPSBuZXcgRGF0ZVRpbWUgKGRpYWxvZywgU1dULkNBTEVOREFSIHwgU1dULkJPUkRFUik7Ci0JCQlmaW5hbCBEYXRlVGltZSBkYXRlID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5EQVRFIHwgU1dULlNIT1JUKTsKLQkJCWZpbmFsIERhdGVUaW1lIHRpbWUgPSBuZXcgRGF0ZVRpbWUgKGRpYWxvZywgU1dULlRJTUUgfCBTV1QuU0hPUlQpOwotCi0JCQluZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQkJCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dCAoIk9LIik7Ci0JCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJDYWxlbmRhciBkYXRlIHNlbGVjdGVkIChNTS9ERC9ZWVlZKSA9ICIgKyAoY2FsZW5kYXIuZ2V0TW9udGggKCkgKyAxKSArICIvIiArIGNhbGVuZGFyLmdldERheSAoKSArICIvIiArIGNhbGVuZGFyLmdldFllYXIgKCkpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEYXRlIHNlbGVjdGVkIChNTS9ZWVlZKSA9ICIgKyAoZGF0ZS5nZXRNb250aCAoKSArIDEpICsgIi8iICsgZGF0ZS5nZXRZZWFyICgpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiVGltZSBzZWxlY3RlZCAoSEg6TU0pID0gIiArIHRpbWUuZ2V0SG91cnMgKCkgKyAiOiIgKyB0aW1lLmdldE1pbnV0ZXMgKCkpOwotCQkJCQlkaWFsb2cuY2xvc2UgKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbiAob2spOwotCQkJZGlhbG9nLnBhY2sgKCk7Ci0JCQlkaWFsb2cub3BlbiAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmNjc1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluZUF0dHJpYnV0ZXMgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IDIgcG9seWxpbmVzIHdpdGggZGlmZmVyZW50IGxpbmUgYXR0cmlidXRlcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTIgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQkKLQkJCQlnYy5zZXRMaW5lQXR0cmlidXRlcyhuZXcgTGluZUF0dHJpYnV0ZXMoMTAsIFNXVC5DQVBfRkxBVCwgU1dULkpPSU5fTUlURVIsIFNXVC5MSU5FX1NPTElELCBudWxsLCAwLCAxMCkpOwotCQkJCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W117NTAsIDEwMCwgNTAsIDIwLCA2MCwgMzAsIDUwLCA0NX0pOwotCQkJCQotCQkJCWdjLnNldExpbmVBdHRyaWJ1dGVzKG5ldyBMaW5lQXR0cmlidXRlcygxLzJmLCBTV1QuQ0FQX0ZMQVQsIFNXVC5KT0lOX01JVEVSLCBTV1QuTElORV9ET1QsIG51bGwsIDAsIDEwKSk7Ci0JCQkJZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXXsxMDAsIDEwMCwgMTAwLCAyMCwgMTEwLCAzMCwgMTAwLCA0NX0pOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxZWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNvbXB1dGUgdGhlIHZpc2libGUgcm93cyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MyB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJc2hlbGwuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaT0wOyBpPDMyOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIChpKzEpICsgIiBpcyBxdWl0ZSBsb25nIik7Ci0JCX0KLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiVmlzaWJsZSBJdGVtcyBbXSIpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlpbnQgaXRlbUhlaWdodCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQgKCk7Ci0JCQkJaW50IGhlYWRlckhlaWdodCA9IHRhYmxlLmdldEhlYWRlckhlaWdodCAoKTsKLQkJCQlpbnQgdmlzaWJsZUNvdW50ID0gKHJlY3QuaGVpZ2h0IC0gaGVhZGVySGVpZ2h0ICsgaXRlbUhlaWdodCAtIDEpIC8gaXRlbUhlaWdodDsKLQkJCQlidXR0b24uc2V0VGV4dCAoIlZpc2libGUgSXRlbXMgWyIgKyB2aXNpYmxlQ291bnQgKyAiXSIpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgyMDAsIDI1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODIwYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB0ZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1NiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJVbmRlcmxpbmUsIFN0cmlrZSBPdXQiKTsKLQlGb250IGZvbnQgPSBzaGVsbC5nZXRGb250KCk7Ci0JU3RyaW5nIHRleHQgPSAiSGVyZSBpcyBzb21lIHRleHQgdGhhdCBpcyB1bmRlcmxpbmVkIG9yIHN0cnVjayBvdXQgb3IgYm90aC4iOwotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0LnNldFRleHQodGV4dCk7Ci0JVGV4dFN0eWxlIHN0eWxlMSA9IG5ldyBUZXh0U3R5bGUoZm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMjYsIDM1KTsKLQlUZXh0U3R5bGUgc3R5bGUyID0gbmV3IFRleHRTdHlsZShmb250LCBudWxsLCBudWxsKTsKLQlzdHlsZTIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCA0MCwgNDkpOwotCVRleHRTdHlsZSBzdHlsZTMgPSBuZXcgVGV4dFN0eWxlKGZvbnQsIG51bGwsIG51bGwpOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCWxheW91dC5zZXRTdHlsZShzdHlsZTMsIDU0LCA1Nyk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgxMCwgMTApOwotCQkJaW50IHdpZHRoID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIHBvaW50Lng7Ci0JCQlsYXlvdXQuc2V0V2lkdGgod2lkdGgpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwkJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dC5kaXNwb3NlKCk7CQkKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjcxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgdGV4dCBzZWxlY3Rpb24gd2l0aGluIGEgU3R5bGVkVGV4dCB3aWRnZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTcgewotCi0Jc3RhdGljIFN0cmluZyBzdHJpbmcxID0gIkEgZHJhZyBzb3VyY2UgaXMgdGhlIHByb3ZpZGVyIG9mIGRhdGEgaW4gYSBEcmFnIGFuZCBEcm9wIGRhdGEgdHJhbnNmZXIgYXMgd2VsbCBhcyAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcmlnaW5hdG9yIG9mIHRoZSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbi4gVGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRyYWcgc291cmNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5IGJlIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgbG9jYXRpb24gaW4gdGhlIHNhbWUgd2lkZ2V0LCB0byBhIGRpZmZlcmVudCB3aWRnZXQgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoaW4gdGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIHRvIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gZHJhZyB0ZXh0IGZyb20geW91ciBhcHBsaWNhdGlvbiBhbmQgZHJvcCBpdCBvbiBhbiBlbWFpbCBhcHBsaWNhdGlvbiwgb3IgeW91ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgZHJhZyBhbiBpdGVtIGluIGEgdHJlZSBhbmQgZHJvcCBpdCBiZWxvdyBhIGRpZmZlcmVudCBub2RlIGluIHRoZSBzYW1lIHRyZWUuIjsKLQotCXN0YXRpYyBTdHJpbmcgRFJBR19TVEFSVF9EQVRBID0gIkRSQUdfU1RBUlRfREFUQSI7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFNpemUoMTAwLCAzMDApOwotCWludCBzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQuc2V0VGV4dChzdHJpbmcxKTsKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRleHQsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQlzb3VyY2Uuc2V0RHJhZ1NvdXJjZUVmZmVjdChuZXcgRHJhZ1NvdXJjZUVmZmVjdCh0ZXh0KSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkJfQotCX0pOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJUG9pbnQgc2VsZWN0aW9uOwotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJZXZlbnQuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQkJdGV4dC5zZXREYXRhKERSQUdfU1RBUlRfREFUQSwgc2VsZWN0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gdGV4dC5nZXRUZXh0KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueS0xKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQlQb2ludCBuZXdTZWxlY3Rpb249IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJaW50IGRlbHRhID0gMDsKLQkJCQlpZiAobmV3U2VsZWN0aW9uLnggPCBzZWxlY3Rpb24ueCkKLQkJCQkJZGVsdGEgPSBsZW5ndGg7IAotCQkJCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCArIGRlbHRhLCBsZW5ndGgsICIiKTsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQl0ZXh0LnNldERhdGEoRFJBR19TVEFSVF9EQVRBLCBudWxsKTsKLQkJfQotCX0pOwotCQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAodGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSkgPT0gbnVsbCkKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQllbHNlIAotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpID09IG51bGwpCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZWxzZSAKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NDUk9MTCB8IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkgewotCQkJCVBvaW50IHNlbGVjdGlvbiA9IChQb2ludCkgdGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSk7Ci0JCQkJaW50IGluc2VydFBvcyA9IHRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPD0gaW5zZXJ0UG9zICAmJiBpbnNlcnRQb3MgPD0gc2VsZWN0aW9uLnkgCi0JCQkJCQl8fCBldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfQ09QWSAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ueCA8IGluc2VydFBvcyAgJiYgaW5zZXJ0UG9zIDwgc2VsZWN0aW9uLnkpIHsKLQkJCQkJdGV4dC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsgIC8vIHByZXZlbnQgc291cmNlIGZyb20gZGVsZXRpbmcgc2VsZWN0aW9uCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQkJdGV4dC5pbnNlcnQoc3RyaW5nKTsKLQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotCQkJCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIHN0cmluZy5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjM3ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHNlYXJjaCB0ZXh0IGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1OCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNFQVJDSCB8IFNXVC5DQU5DRUwpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmICgodGV4dC5nZXRTdHlsZSgpICYgU1dULkNBTkNFTCkgPT0gMCkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIFNuaXBwZXQyNTguY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiY2FuY2VsLmdpZiIpKTsKLQkJCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQpOwotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXRleHQuc2V0VGV4dCgiIik7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoIGNhbmNlbGxlZCIpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0VGV4dCgiU2VhcmNoIHRleHQiKTsKLQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUuZGV0YWlsID09IFNXVC5DQU5DRUwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2ggY2FuY2VsbGVkIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2hpbmcgZm9yOiAiICsgdGV4dC5nZXRUZXh0KCkgKyAiLi4uIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTM1NGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEZXRlY3QgZHJhZyBpbiBhIGN1c3RvbSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTkgewotCi1zdGF0aWMgY2xhc3MgTXlMaXN0IGV4dGVuZHMgQ2FudmFzIHsKLQlpbnQgc2VsZWN0aW9uOwotCVN0cmluZyBbXSBpdGVtcyA9IG5ldyBTdHJpbmcgWzBdOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5TRVRfWCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlNFVF9ZID0gMjsKLQkKLXN0YXRpYyBpbnQgY2hlY2tTdHlsZSAoaW50IHN0eWxlKSB7Ci0Jc3R5bGUgJj0gfihTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXN0eWxlIHw9IFNXVC5OT19CQUNLR1JPVU5EIHwgU1dULk5PX1JFRFJBV19SRVNJWkU7Ci0JcmV0dXJuIHN0eWxlOwotfQotCi1wdWJsaWMgTXlMaXN0IChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQlzdXBlciAocGFyZW50LCBjaGVja1N0eWxlIChzdHlsZSkpOwotCXN1cGVyLnNldERyYWdEZXRlY3QgKGZhbHNlKTsKLQlhZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IG5ldyBHQyAoTXlMaXN0LnRoaXMpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGdldENsaWVudEFyZWEoKTsKLQkJCWludCBpbmRleCA9IDAsIHggPSBjbGllbnQueCArIElOU0VUX1gsIHkgPSBjbGllbnQueSArIElOU0VUX1k7Ci0JCQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkJCQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudChpdGVtcyBbaW5kZXhdKTsKLQkJCQlSZWN0YW5nbGUgaXRlbSA9IG5ldyBSZWN0YW5nbGUgKHgsIHksIHB0LngsIHB0LnkpOwotCQkJCWlmIChpdGVtLmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgYnJlYWs7Ci0JCQkJeSArPSBwdC55OwotCQkJCWlmICghY2xpZW50LmNvbnRhaW5zICh4LCB5KSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlnYy5kaXNwb3NlICgpOwotCQkJaWYgKGluZGV4ID09IGl0ZW1zLmxlbmd0aCB8fCAhY2xpZW50LmNvbnRhaW5zICh4LCB5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IGluZGV4OwotCQkJcmVkcmF3ICgpOwotCQkJdXBkYXRlICgpOwotCQkJZHJhZ0RldGVjdCAoZXZlbnQpOwotCQl9Ci0JfSk7Ci0JYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlDb2xvciBmb3JlZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCQlDb2xvciBiYWNrZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCQlDb2xvciBzZWxlY3RGb3JlZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQpOwotCQkJQ29sb3Igc2VsZWN0QmFja2dyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kKTsKLQkJCWdjLnNldEJhY2tncm91bmQgKGJhY2tncm91bmQpOwotCQkJTXlMaXN0LnRoaXMuZHJhd0JhY2tncm91bmQgKGdjLCBldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCWludCB4ID0gSU5TRVRfWCwgeSA9IElOU0VUX1k7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudChpdGVtcyBbaV0pOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGkgPT0gc2VsZWN0aW9uID8gc2VsZWN0Rm9yZWdyb3VuZCA6IGZvcmVncm91bmQpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGkgPT0gc2VsZWN0aW9uID8gc2VsZWN0QmFja2dyb3VuZCA6IGJhY2tncm91bmQpOwotCQkJCWdjLmRyYXdTdHJpbmcgKGl0ZW1zIFtpXSwgeCwgeSk7Ci0JCQkJeSArPSBwdC55OwotCQkJfQotCQkJCi0JCX0KLQl9KTsKLX0KLQotcHVibGljIFBvaW50IGNvbXB1dGVTaXplIChpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JR0MgZ2MgPSBuZXcgR0MgKHRoaXMpOwotCWludCBpbmRleCA9IDAsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2luZGV4XSk7Ci0JCXdpZHRoID0gTWF0aC5tYXggKHdpZHRoLCBwdC54KTsKLQkJaGVpZ2h0ICs9IHB0Lnk7Ci0JCWluZGV4Kys7Ci0JfQotCWdjLmRpc3Bvc2UgKCk7Ci0Jd2lkdGggKz0gSU5TRVRfWCAqIDI7Ci0JaGVpZ2h0ICs9IElOU0VUX1kgKiAyOwotCVJlY3RhbmdsZSByZWN0ID0gY29tcHV0ZVRyaW0gKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCXJldHVybiBuZXcgUG9pbnQgKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLX0KLQotcHVibGljIFN0cmluZyBbXSBnZXRJdGVtcyAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIGl0ZW1zOwotfQotCi1wdWJsaWMgdm9pZCBzZXRJdGVtcyAoU3RyaW5nIFtdIGl0ZW1zKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKGl0ZW1zID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXRoaXMuaXRlbXMgPSBpdGVtczsKLQlyZWRyYXcgKCk7CQotfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTXlMaXN0IHQxID0gbmV3IE15TGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXQxLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiU29tZSIsICJpdGVtcyIsICJpbiIsICJ0aGUiLCAibGlzdCJ9KTsKLQl0MS5hZGREcmFnRGV0ZWN0TGlzdGVuZXIgKG5ldyBEcmFnRGV0ZWN0TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRGV0ZWN0ZWQgKERyYWdEZXRlY3RFdmVudCBldmVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRHJhZyBzdGFydGVkIC4uLiIpOwotCQl9Ci0JfSk7Ci0JTXlMaXN0IHQyID0gbmV3IE15TGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXQyLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiU29tZSIsICJpdGVtcyIsICJpbiIsICJhbm90aGVyIiwgImxpc3QifSk7Ci0JdDIuYWRkRHJhZ0RldGVjdExpc3RlbmVyIChuZXcgRHJhZ0RldGVjdExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0RldGVjdGVkIChEcmFnRGV0ZWN0RXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRyYWcgc3RhcnRlZCAuLi4iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2U1ZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tYm8gZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb21ibyBib3ggKG5vbi1lZGl0YWJsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQSIsICJCIiwgIkMifSk7Ci0JY29tYm8uc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU5MzFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNb3ppbGxhIGluIGEgQnJvd3NlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJNb3ppbGxhIik7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk1PWklMTEEpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly9tb3ppbGxhLm9yZyIpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxMDhjNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIEV4Y2VsIHNoZWV0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJFeGNlbCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQluZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA4YTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgV29yZCBkb2N1bWVudC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MiB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQlzdGF0aWMgT2xlRnJhbWUgZnJhbWU7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiV29yZCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCWZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBzaGVsbC5nZXRNZW51QmFyKCk7Ci0JCWlmIChtZW51QmFyID09IG51bGwpIHsKLQkJCW1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQl9Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCi0JCU1lbnVJdGVtIG1lbnVGaWxlT3BlbiA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZU9wZW4uc2V0VGV4dCgiT3Blbi4uLiIpOwotCQltZW51RmlsZU9wZW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmlsZU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlRXhpdCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUV4aXQuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUV4aXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBmaWxlT3BlbigpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhjbGllbnRTaXRlLmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIiouZG9jIiB9KTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWNsaWVudFNpdGUuZGlzcG9zZSgpOwotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiLCBuZXcgRmlsZShmaWxlTmFtZSkpOwotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBiZmRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgUG93ZXJQb2ludCBzbGlkZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MyB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlBvd2VyUG9pbnQgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJY2xpZW50U2l0ZSAgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJQb3dlclBvaW50LlNsaWRlIik7Ci0JCQlhZGRGaWxlTWVudShmcmFtZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJTWVudUl0ZW0gbWVudUZpbGVDb250cm9sID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlQ29udHJvbC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNkOGJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgTWVkaWEgUGxheWVyLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY0IHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWVkaWEgUGxheWVyIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiTVBsYXllciIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNWRhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFdpbmRvd3MgTWVkaWEgUGxheWVyLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY1IHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWVkaWEgUGxheWVyIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXTVBsYXllci5PQ1giKTsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gc2hlbGwuZ2V0TWVudUJhcigpOwotCQlpZiAobWVudUJhciA9PSBudWxsKSB7Ci0JCQltZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJfQotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQotCQlNZW51SXRlbSBtZW51RmlsZU9wZW4gPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVPcGVuLnNldFRleHQoIk9wZW4uLi4iKTsKLQkJbWVudUZpbGVPcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlsZU9wZW4oKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY2xpZW50U2l0ZS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLndtdiIgfSk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7Ci0JCQlPbGVBdXRvbWF0aW9uIHBsYXllciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJaW50IHBsYXlVUkxbXSA9IHBsYXllci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJVUkwiIH0pOwotCQkJaWYgKHBsYXlVUkwgIT0gbnVsbCkgewotCQkJCVZhcmlhbnQgdGhlRmlsZSA9IG5ldyBWYXJpYW50KGZpbGVuYW1lKTsKLQkJCQlwbGF5ZXIuc2V0UHJvcGVydHkocGxheVVSTFswXSwgdGhlRmlsZSk7Ci0JCQl9Ci0JCQlwbGF5ZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllN2EwYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBTcGFuIGFuZCBjZW50ZXIgY29sdW1ucyB3aXRoIGEgR3JpZExheW91dC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQkKLQkJVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQkKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiU3RhbmRhcmQiKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoIldpZGdldCIpOwotCQlUcmVlSXRlbSBicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiRWZmaWNpZW50IiwgIlBvcnRhYmxlIn0pOwotCQlUcmVlSXRlbSBsZWFmID0gbmV3IFRyZWVJdGVtKGJyYW5jaCwgU1dULk5PTkUpOwotCQlsZWFmLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkNyb3NzIiwgIlBsYXRmb3JtIn0pOwotCQlicmFuY2guc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCWJyYW5jaCA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWJyYW5jaC5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJOYXRpdmUiLCAiQ29udHJvbHMifSk7Ci0JCWxlYWYgPSBuZXcgVHJlZUl0ZW0oYnJhbmNoLCBTV1QuTk9ORSk7Ci0JCWxlYWYuc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQ3Jvc3MiLCAiUGxhdGZvcm0ifSk7Ci0JCWJyYW5jaCA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWJyYW5jaC5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDcm9zcyIsICJQbGF0Zm9ybSJ9KTsKLQkJY29sdW1uMS5wYWNrKCk7Ci0JCWNvbHVtbjIucGFjaygpOwotCi0JCWl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUb29sa2l0Iik7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQoIlRvdGFsbHkiKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkKLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQXdlc29tZSIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmYzhkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcubW96aWxsYS5pbnRlcmZhY2VzLio7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogVG9nZ2xlIGEgTW96aWxsYSBCcm93c2VyIGJldHdlZW4gRGVzaWduIG1vZGUgYW5kIFZpZXcgbW9kZS4KLSAqIAotICogSU1QT1JUQU5UOiBGb3IgdGhpcyBzbmlwcGV0IHRvIHdvcmsgcHJvcGVybHkgYWxsIG9mIHRoZSByZXF1aXJlbWVudHMKLSAqIGZvciB1c2luZyBKYXZhWFBDT00gaW4gYSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHNhdGlzZmllZAotICogKHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI2hvd3VzZWphdmF4cGNvbSkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyNjcgewotCXN0YXRpYyBCcm93c2VyIGJyb3dzZXI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlzaGVsbC5zZXRUZXh0KCJVc2UgTW96aWxsYSdzIERlc2lnbiBNb2RlIik7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQotCQlmaW5hbCBCdXR0b24gb2ZmQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb2ZmQnV0dG9uLnNldFRleHQoIkRlc2lnbiBNb2RlIE9mZiIpOwotCQlvZmZCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9mZkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldERlc2lnbk1vZGUoIm9mZiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgQnV0dG9uIG9uQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb25CdXR0b24uc2V0VGV4dCgiRGVzaWduIE1vZGUgT24iKTsKLQkJb25CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKSByZXR1cm47Ci0JCQkJYm9vbGVhbiBzdWNjZXNzID0gc2V0RGVzaWduTW9kZSgib24iKTsKLQkJCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQkJb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJb2ZmQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlvZmZCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZXNpZ25Nb2RlKFN0cmluZyB2YWx1ZSkgewotCQluc0lXZWJCcm93c2VyIHdlYkJyb3dzZXIgPSAobnNJV2ViQnJvd3Nlcilicm93c2VyLmdldFdlYkJyb3dzZXIoKTsKLQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZ2V0IHRoZSBuc0lXZWJCcm93c2VyIGZyb20gdGhlIEJyb3dzZXIgd2lkZ2V0Iik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbnNJRE9NV2luZG93IHdpbmRvdyA9IHdlYkJyb3dzZXIuZ2V0Q29udGVudERPTVdpbmRvdygpOwotCQluc0lET01Eb2N1bWVudCBkb2N1bWVudCA9IHdpbmRvdy5nZXREb2N1bWVudCgpOwotCQluc0lET01OU0hUTUxEb2N1bWVudCBuc0RvY3VtZW50ID0gKG5zSURPTU5TSFRNTERvY3VtZW50KWRvY3VtZW50LnF1ZXJ5SW50ZXJmYWNlKG5zSURPTU5TSFRNTERvY3VtZW50Lk5TX0lET01OU0hUTUxET0NVTUVOVF9JSUQpOwotCQluc0RvY3VtZW50LnNldERlc2lnbk1vZGUodmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDdjMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3QgbW91c2Ugd2hlZWwgZXZlbnRzIHRvIGEgc3R5bGVkIHRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULlZfU0NST0xMKTsKLQlTdHJpbmcgbXVsdGlMaW5lU3RyaW5nID0gIiI7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQltdWx0aUxpbmVTdHJpbmcgPSBtdWx0aUxpbmVTdHJpbmcuY29uY2F0KCJUaGlzIGlzIGxpbmUgbnVtYmVyICIgKyBpICsgIiBpbiB0aGUgbXVsdGktbGluZSBzdHJpbmcuXG4iKTsKLQl9Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KG11bHRpTGluZVN0cmluZyk7Ci0Jc2hlbGwuc2V0U2l6ZShzdHlsZWRUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCA0MDApKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jc3R5bGVkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW91c2VXaGVlbCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW91c2UgV2hlZWwgZXZlbnQgIiArIGUpOwotCQl9Ci0JfSk7Ci0JZmluYWwgUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChzaGVsbCwgbnVsbCwgNTAsIDUwKTsKLQluZXcgVGhyZWFkKCl7Ci0JCUV2ZW50IGV2ZW50OwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VXaGVlbDsKLQkJCQlldmVudC5kZXRhaWwgPSBTV1QuU0NST0xMX0xJTkU7Ci0JCQkJZXZlbnQueCA9IHB0Lng7Ci0JCQkJZXZlbnQueSA9IHB0Lnk7Ci0JCQkJZXZlbnQuY291bnQgPSAtMjsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0JCi0JfS5zdGFydCgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhNGJkOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgY2FyZXQgcG9zaXRpb24gd2l0aGluIGEgQ29tYm8ncyB0ZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uYWRkICgiaXRlbSIpOwotCWNvbWJvLnNlbGVjdCAoMCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCWludCBzdHJpbmdMZW5ndGggPSBjb21iby5nZXRUZXh0ICgpLmxlbmd0aCAoKTsgCi0JY29tYm8uc2V0U2VsZWN0aW9uIChuZXcgUG9pbnQgKHN0cmluZ0xlbmd0aCwgc3RyaW5nTGVuZ3RoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2E5YzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBvcGVuIGEgc2hlbGwgbWluaW1pemVkIChpY29uaWZpZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TWluaW1pemVkICh0cnVlKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTZjMTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyIHdpdGggcG9wLXVwIHdpbmRvdyBzdXBwb3J0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjcwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCXNoZWxsLm9wZW4oKTsKLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLS8qIHJlZ2lzdGVyIFdpbmRvd0V2ZW50IGxpc3RlbmVycyAqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaXNwbGF5IGRpc3BsYXksIEJyb3dzZXIgYnJvd3NlcikgewotCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCWlmICghZXZlbnQucmVxdWlyZWQpIHJldHVybjsJLyogb25seSBkbyBpdCBpZiBuZWNlc3NhcnkgKi8KLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJc2hlbGwuc2V0VGV4dCgiTmV3IFdpbmRvdyIpOwotCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0JCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQubG9jYXRpb24pOwotCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCVBvaW50IHNpemUgPSBldmVudC5zaXplOwotCQkJCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MjE5My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgc25pcHBldDogc3BlY2lmeSBjdXN0b20gY29udGVudCBkaW1lbnNpb25zIGluIGEgdGFibGUgd2l0aCBubyBjb2x1bW5zCi0gKiAKLSAqIEZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgc25pcHBldCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1DdXN0b21EcmF3aW5nVGFibGVBbmRUcmVlSXRlbXMvY3VzdG9tRHJhdy5odG0jX2V4YW1wbGUxCi0gKiAgCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwxMCwyMDAsMjUwKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwxMCwxNTAsMjAwKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gIiArIGkpOwotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0gaXMgY2FsbGVkIHJlcGVhdGVkbHkuICBUaGVyZWZvcmUgaXQgaXMgY3JpdGljYWwKLQkgKiBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGlzIG1ldGhvZCBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgY2xpZW50V2lkdGggPSB0YWJsZS5nZXRDbGllbnRBcmVhKCkud2lkdGg7Ci0JCQlldmVudC5oZWlnaHQgPSBldmVudC5nYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpICogMjsKLQkJCWV2ZW50LndpZHRoID0gY2xpZW50V2lkdGggKiAyOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc4YzFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBzbmlwcGV0OiBzcGVjaWZ5IGN1c3RvbSBjb2x1bW4gd2lkdGhzIHdoZW4gYSBjb2x1bW4gaXMgcGFja2VkCi0gKiAgCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlMgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOyAKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsNDAwLDIwMCk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsMTAsMzUwLDE1MCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjAuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJY29sdW1uMC5wYWNrKCk7Ci0JCX0KLQl9KTsKLQljb2x1bW4xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWNvbHVtbjEucGFjaygpOwotCQl9Ci0JfSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCAiaXRlbSAiICsgaSArICIgY29sIDAiKTsKLQkJaXRlbS5zZXRUZXh0KDEsICJpdGVtICIgKyBpICsgIiBjb2wgMSIpOwotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0gaXMgY2FsbGVkIHJlcGVhdGVkbHkuICBUaGVyZWZvcmUgaXQgaXMgY3JpdGljYWwKLQkgKiBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGlzIG1ldGhvZCBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC53aWR0aCAqPSAyOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU2YzNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgc25pcHBldDogbW9kaWZ5IHRoZSBjbGlwcGluZyBvZiBjdXN0b20gYmFja2dyb3VuZCBwYWludHMKLSAqIAotICogRm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhpcyBzbmlwcGV0IHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUN1c3RvbURyYXdpbmdUYWJsZUFuZFRyZWVJdGVtcy9jdXN0b21EcmF3Lmh0bSNfZXhhbXBsZTQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgU3RyaW5nW10gTU9OVEhTID0gewotCQkiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotCQkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCi0JfTsKLQlmaW5hbCBpbnRbXSBISUdIUyA9IHstNywgLTQsIDEsIDExLCAxOCwgMjQsIDI2LCAyNSwgMjAsIDEzLCA1LCAtNH07Ci0JZmluYWwgaW50W10gTE9XUyA9IHstMTUsIC0xMywgLTcsIDEsIDcsIDEzLCAxNSwgMTQsIDEwLCA0LCAtMiwgLTExfTsKLQlmaW5hbCBpbnQgU0NBTEVfTUlOID0gLTMwOyBmaW5hbCBpbnQgU0NBTEVfTUFYID0gMzA7Ci0JZmluYWwgaW50IFNDQUxFX1JBTkdFID0gTWF0aC5hYnMoU0NBTEVfTUlOIC0gU0NBTEVfTUFYKTsKLQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLDEwLDQwMCwzNTApOwotCXNoZWxsLnNldFRleHQoIk90dGF3YSBBdmVyYWdlIERhaWx5IFRlbXBlcmF0dXJlIFJhbmdlcyIpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlmaW5hbCBDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCS8vIGZpbmFsIEltYWdlIHBhcmxpYW1lbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAiLi9wYXJsaWFtZW50LmpwZyIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLDEwLDM1MCwzMDApOwotCS8vIHRhYmxlLnNldEJhY2tncm91bmRJbWFnZShwYXJsaWFtZW50SW1hZ2UpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KE1PTlRIU1tpXSArICIgKCIgKyBMT1dTW2ldICsgIkMuLi4iICsgSElHSFNbaV0gKyAiQykiKTsKLQl9Ci0JZmluYWwgaW50IGNsaWVudFdpZHRoID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4gVGhlcmVmb3JlIGl0IGlzCi0JICogY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKWV2ZW50Lml0ZW0pOwotCQkJaW50IHJpZ2h0WCA9IChISUdIU1tpdGVtSW5kZXhdIC0gU0NBTEVfTUlOKSAqIGNsaWVudFdpZHRoIC8gU0NBTEVfUkFOR0U7Ci0JCQlldmVudC53aWR0aCA9IHJpZ2h0WDsKLQkJfQotCX0pOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpdGVtSW5kZXggPSB0YWJsZS5pbmRleE9mKChUYWJsZUl0ZW0pZXZlbnQuaXRlbSk7Ci0JCQlpbnQgbGVmdFggPSAoTE9XU1tpdGVtSW5kZXhdIC0gU0NBTEVfTUlOKSAqIGNsaWVudFdpZHRoIC8gU0NBTEVfUkFOR0U7Ci0JCQlpbnQgcmlnaHRYID0gKEhJR0hTW2l0ZW1JbmRleF0gLSBTQ0FMRV9NSU4pICogY2xpZW50V2lkdGggLyBTQ0FMRV9SQU5HRTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlSZWN0YW5nbGUgY2xpcHBpbmcgPSBnYy5nZXRDbGlwcGluZygpOwotCQkJY2xpcHBpbmcueCA9IGxlZnRYOwotCQkJY2xpcHBpbmcud2lkdGggPSByaWdodFggLSBsZWZ0WDsKLQkJCWdjLnNldENsaXBwaW5nKGNsaXBwaW5nKTsKLQkJCUNvbG9yIG9sZEZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQlDb2xvciBvbGRCYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChibHVlKTsKLQkJCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoIC8gMiwgZXZlbnQuaGVpZ2h0LCBmYWxzZSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQkJCWdjLnNldEJhY2tncm91bmQocmVkKTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgKLQkJCQlldmVudC54ICsgZXZlbnQud2lkdGggLyAyLCBldmVudC55LCBldmVudC53aWR0aCAvIDIsIGV2ZW50LmhlaWdodCwgZmFsc2UpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRGb3JlZ3JvdW5kKTsKLQkJCWdjLnNldEJhY2tncm91bmQob2xkQmFja2dyb3VuZCk7Ci0JCQlldmVudC5kZXRhaWwgJj0gflNXVC5CQUNLR1JPVU5EOwotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuSE9UOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vIHBhcmxpYW1lbnRJbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDdlOTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgc25pcHBldDogaW1wbGVtZW50IHN0YW5kYXJkIHRyZWUgY2hlY2sgYm94IGJlaGF2aW9yIChTV1QuQ0hFQ0spCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc0IHsKLQkKLQlzdGF0aWMgdm9pZCBjaGVja1BhdGgoVHJlZUl0ZW0gaXRlbSwgYm9vbGVhbiBjaGVja2VkLCBib29sZWFuIGdyYXllZCkgewotCSAgICBpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JICAgIGlmIChncmF5ZWQpIHsKLQkgICAgICAgIGNoZWNrZWQgPSB0cnVlOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgaW50IGluZGV4ID0gMDsKLQkgICAgICAgIFRyZWVJdGVtW10gaXRlbXMgPSBpdGVtLmdldEl0ZW1zKCk7Ci0JICAgICAgICB3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkgICAgICAgICAgICBUcmVlSXRlbSBjaGlsZCA9IGl0ZW1zW2luZGV4XTsKLQkgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0R3JheWVkKCkgfHwgY2hlY2tlZCAhPSBjaGlsZC5nZXRDaGVja2VkKCkpIHsKLQkgICAgICAgICAgICAgICAgY2hlY2tlZCA9IGdyYXllZCA9IHRydWU7Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpbmRleCsrOwotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkgICAgaXRlbS5zZXRHcmF5ZWQoZ3JheWVkKTsKLQkgICAgY2hlY2tQYXRoKGl0ZW0uZ2V0UGFyZW50SXRlbSgpLCBjaGVja2VkLCBncmF5ZWQpOwotCX0KLQotCXN0YXRpYyB2b2lkIGNoZWNrSXRlbXMoVHJlZUl0ZW0gaXRlbSwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JICAgIGl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQkgICAgaXRlbS5zZXRDaGVja2VkKGNoZWNrZWQpOwotCSAgICBUcmVlSXRlbVtdIGl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICBjaGVja0l0ZW1zKGl0ZW1zW2ldLCBjaGVja2VkKTsKLQkgICAgfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkgICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JICAgIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkgICAgdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCSAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IGl0ZW0uZ2V0Q2hlY2tlZCgpOwotCSAgICAgICAgICAgICAgICBjaGVja0l0ZW1zKGl0ZW0sIGNoZWNrZWQpOwotCSAgICAgICAgICAgICAgICBjaGVja1BhdGgoaXRlbS5nZXRQYXJlbnRJdGVtKCksIGNoZWNrZWQsIGZhbHNlKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgIH0pOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCSAgICAgICAgVHJlZUl0ZW0gaXRlbUkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5VTEwpOwotCSAgICAgICAgaXRlbUkuc2V0VGV4dCgiSXRlbSAiICsgaSk7Ci0JICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCSAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW1KID0gbmV3IFRyZWVJdGVtKGl0ZW1JLCBTV1QuTlVMTCk7Ci0JICAgICAgICAgICAgaXRlbUouc2V0VGV4dCgiSXRlbSAiICsgaSArICIgIiArIGopOwotCSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW1LID0gbmV3IFRyZWVJdGVtKGl0ZW1KLCBTV1QuTlVMTCk7Ci0JICAgICAgICAgICAgICAgIGl0ZW1LLnNldFRleHQoIkl0ZW0gIiArIGkgKyAiICIgKyBqICsgIiAiICsgayk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIHRyZWUuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0JICAgIHNoZWxsLnBhY2soKTsKLQkgICAgc2hlbGwub3BlbigpOwotCSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JICAgIH0KLQkgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDlmZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhbnZhcyBzbmlwcGV0OiB1cGRhdGUgYSBwb3J0aW9uIG9mIGEgQ2FudmFzIGZyZXF1ZW50bHkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzUgewotCi1zdGF0aWMgU3RyaW5nIHZhbHVlOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBpbnQgSU5URVJWQUwgPSA4ODg7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDc1MCwgNzUwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzICgxMCwgMTAsIDc5MCwgNzkwKTsKLQlmaW5hbCBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoc2hlbGwsIFNXVC5OT05FKTsKLQljYW52YXMuc2V0Qm91bmRzICgxMCwgMTAsIDc1MCwgNzUwKTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQl2YWx1ZSA9IFN0cmluZy52YWx1ZU9mIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCkpOwotCQkJZXZlbnQuZ2MuZHJhd0ltYWdlIChpbWFnZSwgMCwgMCk7Ci0JCQlldmVudC5nYy5kcmF3U3RyaW5nICh2YWx1ZSwgMTAsIDEwLCB0cnVlKTsKLQkJfQotCX0pOwotCWRpc3BsYXkudGltZXJFeGVjIChJTlRFUlZBTCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWlmIChjYW52YXMuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJLy8gY2FudmFzLnJlZHJhdyAoKTsgLy8gPC0tIGJhZCwgZGFtYWdlcyBtb3JlIHRoYW4gaXMgbmVlZGVkCi0JCQlHQyBnYyA9IG5ldyBHQyAoY2FudmFzKTsKLQkJCVBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudCAodmFsdWUgKyAnMCcpOwotCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCWNhbnZhcy5yZWRyYXcgKDEwLCAxMCwgZXh0ZW50LngsIGV4dGVudC55LCBmYWxzZSk7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAoSU5URVJWQUwsIHRoaXMpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc3OWY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IHNuaXBwZXQ6IG1hcCBmcm9tIGNvbnRyb2wtcmVsYXRpdmUgdG8gZGlzcGxheS1yZWxhdGl2ZSBjb29yZGluYXRlcwotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMjAwLCAyMDAsIDQwMCwgNDAwKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiY2xpY2sgaW4gc2hlbGwgdG8gcHJpbnQgZGlzcGxheS1yZWxhdGl2ZSBjb29yZGluYXRlIik7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZGlzcGxheS5tYXAgKChDb250cm9sKWV2ZW50LndpZGdldCwgbnVsbCwgcG9pbnQpKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiZDFmZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBJbXBsZW1lbnQgYSBjdXN0b20gZG93bmxvYWQgaGFuZGxlciBmb3IgYSBNb3ppbGxhIEJyb3dzZXIuCi0gKiAKLSAqIElNUE9SVEFOVDogRm9yIHRoaXMgc25pcHBldCB0byB3b3JrIHByb3Blcmx5IGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzCi0gKiBmb3IgdXNpbmcgSmF2YVhQQ09NIGluIGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gbXVzdCBiZSBzYXRpc2ZpZWQKLSAqIChzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2VqYXZheHBjb20pLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcubW96aWxsYS5pbnRlcmZhY2VzLio7Ci1pbXBvcnQgb3JnLm1vemlsbGEueHBjb20uTW96aWxsYTsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzcgewotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgVGFibGUgdGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2hlbGwuc2V0VGV4dCAoIkN1c3RvbSBEb3dubG9hZCBIYW5kbGVyIik7Ci0KLQkJQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyIChzaGVsbCwgU1dULk1PWklMTEEpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSAoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5taW5pbXVtSGVpZ2h0ID0gODAwOwotCQlkYXRhLm1pbmltdW1XaWR0aCA9IDgwMDsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5OT05FKTsKLQkJdGFibGUuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQluZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0KLQkJbnNJQ29tcG9uZW50UmVnaXN0cmFyIHJlZ2lzdHJhciA9IE1vemlsbGEuZ2V0SW5zdGFuY2UgKCkuZ2V0Q29tcG9uZW50UmVnaXN0cmFyICgpOwotCQlTdHJpbmcgTlNfRE9XTkxPQURfQ0lEID0gImUzZmE5RDBhLTFkZDEtMTFiMi1iZGVmLThjNzIwYjU5NzQ0NSI7Ci0JCVN0cmluZyBOU19UUkFOU0ZFUl9DT05UUkFDVElEID0gIkBtb3ppbGxhLm9yZy90cmFuc2ZlcjsxIjsKLQkJcmVnaXN0cmFyLnJlZ2lzdGVyRmFjdG9yeSAoTlNfRE9XTkxPQURfQ0lELCAiVHJhbnNmZXIiLCBOU19UUkFOU0ZFUl9DT05UUkFDVElELCBuZXcgbnNJRmFjdG9yeSAoKSB7Ci0JCQlwdWJsaWMgbnNJU3VwcG9ydHMgcXVlcnlJbnRlcmZhY2UgKFN0cmluZyB1dWlkKSB7Ci0JCQkJaWYgKHV1aWQuZXF1YWxzIChuc0lGYWN0b3J5Lk5TX0lGQUNUT1JZX0lJRCkgfHwKLQkJCQkJdXVpZC5lcXVhbHMgKG5zSUZhY3RvcnkuTlNfSVNVUFBPUlRTX0lJRCkpIHJldHVybiB0aGlzOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIG5zSVN1cHBvcnRzIGNyZWF0ZUluc3RhbmNlIChuc0lTdXBwb3J0cyBvdXRlciwgU3RyaW5nIGlpZCkgewotCQkJCXJldHVybiBjcmVhdGVUcmFuc2ZlciAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxvY2tGYWN0b3J5IChib29sZWFuIGxvY2spIHt9Ci0JCX0pOwotCi0JCWJyb3dzZXIuc2V0VXJsICgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci0KLQlzdGF0aWMgbnNJVHJhbnNmZXIgY3JlYXRlVHJhbnNmZXIgKCkgewotCQkvKiBuc0lUcmFuc2ZlciBpcyBkb2N1bWVudGVkIGF0IGh0dHA6Ly93d3cueHVscGxhbmV0LmNvbS9yZWZlcmVuY2VzL3hwY29tcmVmL2lmYWNlcy9uc0lUcmFuc2Zlci5odG1sICovCi0JCXJldHVybiBuZXcgbnNJVHJhbnNmZXIgKCkgewotCQkJcHVibGljIG5zSVN1cHBvcnRzIHF1ZXJ5SW50ZXJmYWNlIChTdHJpbmcgdXVpZCkgewotCQkJCWlmICh1dWlkLmVxdWFscyAobnNJVHJhbnNmZXIuTlNfSVRSQU5TRkVSX0lJRCkgfHwKLQkJCQkJdXVpZC5lcXVhbHMgKG5zSVRyYW5zZmVyLk5TX0lXRUJQUk9HUkVTU0xJU1RFTkVSMl9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lUcmFuc2Zlci5OU19JV0VCUFJPR1JFU1NMSVNURU5FUl9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lUcmFuc2Zlci5OU19JU1VQUE9SVFNfSUlEKSkgcmV0dXJuIHRoaXM7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvblN0YXRlQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBsb25nIHN0YXRlRmxhZ3MsIGxvbmcgc3RhdHVzKSB7Ci0JCQkJaWYgKChzdGF0ZUZsYWdzICYgbnNJV2ViUHJvZ3Jlc3NMaXN0ZW5lci5TVEFURV9TVE9QKSAhPSAwKSB7Ci0JCQkJCXJlbW92ZUZyb21UYWJsZSAoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlNjQgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgY3VyU2VsZlByb2dyZXNzLCBsb25nIG1heFNlbGZQcm9ncmVzcywgbG9uZyBjdXJUb3RhbFByb2dyZXNzLCBsb25nIG1heFRvdGFsUHJvZ3Jlc3MpIHsKLQkJCQlsb25nIGN1cnJlbnRLQnl0ZXMgPSBjdXJUb3RhbFByb2dyZXNzIC8gMTAyNDsKLQkJCQlsb25nIHRvdGFsS0J5dGVzID0gbWF4VG90YWxQcm9ncmVzcyAvIDEwMjQ7Ci0JCQkJdGFibGVJdGVtLnNldFRleHQgKDEsIGJhc2VTdHJpbmcgKyAiICgiICsgY3VycmVudEtCeXRlcyArICIvIiArIHRvdGFsS0J5dGVzICsgIikiKTsKLQkJCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnBhY2sgKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbml0IChuc0lVUkkgc291cmNlLCBuc0lVUkkgdGFyZ2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIG5zSU1JTUVJbmZvIE1JTUVJbmZvLCBkb3VibGUgc3RhcnRUaW1lLCBuc0lMb2NhbEZpbGUgdGVtcEZpbGUsIGZpbmFsIG5zSUNhbmNlbGFibGUgY2FuY2VsYWJsZSkgewotCQkJCXRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCAoIkNhbmNlbCIpOwotCQkJCWJ1dHRvbi5wYWNrICgpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljYW5jZWxhYmxlLmNhbmNlbCAoTW96aWxsYS5OU19FUlJPUl9BQk9SVCk7Ci0JCQkJCQlyZW1vdmVGcm9tVGFibGUgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChidXR0b24sIHRhYmxlSXRlbSwgMCk7Ci0JCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IGJ1dHRvbi5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWJhc2VTdHJpbmcgPSAiRG93bmxvYWRpbmcgdG8gIiArIHRhcmdldC5nZXRQYXRoICgpOwotCQkJCXRhYmxlSXRlbS5zZXRUZXh0ICgxLCBiYXNlU3RyaW5nKTsKLQkJCQlpZiAodGFibGUuZ2V0SXRlbUNvdW50ICgpID09IDEpIHsKLQkJCQkJKChHcmlkRGF0YSl0YWJsZS5nZXRMYXlvdXREYXRhICgpKS5leGNsdWRlID0gZmFsc2U7CS8qIHNob3cgdGhlIHRhYmxlICovCi0JCQkJCXRhYmxlLmdldENvbHVtbiAoMCkuc2V0V2lkdGggKGVkaXRvci5taW5pbXVtV2lkdGgpOwotCQkJCX0KLQkJCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnBhY2sgKCk7Ci0JCQkJdGFibGUuZ2V0U2hlbGwgKCkubGF5b3V0ICgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgb25TdGF0dXNDaGFuZ2UgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkge30KLQkJCXB1YmxpYyB2b2lkIG9uU2VjdXJpdHlDaGFuZ2UgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgc3RhdGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBpbnQgY3VyU2VsZlByb2dyZXNzLCBpbnQgbWF4U2VsZlByb2dyZXNzLCBpbnQgY3VyVG90YWxQcm9ncmVzcywgaW50IG1heFRvdGFsUHJvZ3Jlc3MpIHt9Ci0JCQlwdWJsaWMgdm9pZCBvbkxvY2F0aW9uQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBuc0lVUkkgbG9jYXRpb24pIHt9Ci0KLQkJCS8qIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBwYXJ0IG9mIHRoZSBuc0lUcmFuc2ZlciBpbnRlcmZhY2UgYnV0IGFyZSBoZXJlIGZvciB0aGUgc25pcHBldCdzIGNvbnZlbmllbmNlICovCi0JCQlCdXR0b24gYnV0dG9uOwotCQkJVGFibGVJdGVtIHRhYmxlSXRlbTsKLQkJCVN0cmluZyBiYXNlU3RyaW5nOwotCi0JCQl2b2lkIHJlbW92ZUZyb21UYWJsZSAoKSB7Ci0JCQkJdGFibGVJdGVtLmRpc3Bvc2UgKCk7Ci0JCQkJYnV0dG9uLmRpc3Bvc2UgKCk7Ci0JCQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCAoKSA9PSAwKSB7Ci0JCQkJCSgoR3JpZERhdGEpdGFibGUuZ2V0TGF5b3V0RGF0YSAoKSkuZXhjbHVkZSA9IHRydWU7CS8qIGhpZGUgdGhlIHRhYmxlICovCi0JCQkJfQotCQkJCXRhYmxlLmdldENvbHVtbiAoMSkucGFjayAoKTsKLQkJCQl0YWJsZS5nZXRTaGVsbCAoKS5sYXlvdXQgKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFlOTk0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIHRpcCBzbmlwcGV0OiBzaG93IGEgTGFiZWwncyB0b29sIHRpcCBpZmYgaXQncyBub3QgZnVsbHkgdmlzaWJsZQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzICgxMCwgMTAsIDMwMCwgMTAwKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgicmVzaXplIHRoZSBTaGVsbCB0aGVuIGhvdmVyIG92ZXIgdGhpcyBMYWJlbCIpOwotCWxhYmVsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCByZXF1aXJlZFNpemUgPSBsYWJlbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVBvaW50IGxhYmVsU2l6ZSA9IGxhYmVsLmdldFNpemUgKCk7Ci0JCQlib29sZWFuIGZ1bGx5VmlzaWJsZSA9IHJlcXVpcmVkU2l6ZS54IDw9IGxhYmVsU2l6ZS54ICYmIHJlcXVpcmVkU2l6ZS55IDw9IGxhYmVsU2l6ZS55OwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiTGFiZWwgaXMgZnVsbHkgdmlzaWJsZTogIiArIGZ1bGx5VmlzaWJsZSk7Ci0JCQlsYWJlbC5zZXRUb29sVGlwVGV4dCAoZnVsbHlWaXNpYmxlID8gbnVsbCA6IGxhYmVsLmdldFRleHQgKCkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWY3ZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGRyYXcgYSByZWZsZWN0aW9uIG9mIGFuIGltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlIChTV1QuSUNPTl9RVUVTVElPTik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlpbnQgeCA9IDEwLCB5ID0gMTA7Ci0JCQkJZ2MuZHJhd0ltYWdlIChpbWFnZSwgeCwgeSk7Ci0JCQkJVHJhbnNmb3JtIHRyID0gbmV3IFRyYW5zZm9ybSAoZS5kaXNwbGF5KTsKLQkJCQl0ci5zZXRFbGVtZW50cyAoMSwgMCwgMCwgLTEsIDEsIDIqKHkrcmVjdC5oZWlnaHQpKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0gKHRyKTsKLQkJCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCB4LCB5KTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0gKG51bGwpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kICgpOwotCQkJCVBhdHRlcm4gcCA9IG5ldyBQYXR0ZXJuIChlLmRpc3BsYXksIHgsIHkrcmVjdC5oZWlnaHQsIHgsIHkrKDIqcmVjdC5oZWlnaHQpLCBiYWNrZ3JvdW5kLCAwLCBiYWNrZ3JvdW5kLCAyNTUpOwotCQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuIChwKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlICh4LCB5K3JlY3QuaGVpZ2h0LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJcC5kaXNwb3NlICgpOwotCQkJCXRyLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplICg2MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkKLQkJCQlkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTFmY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBvcGVuIGEgc2hlbGwgbWF4aW1pemVkIChmdWxsIHNjcmVlbikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRNYXhpbWl6ZWQgKHRydWUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwOWIxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZHJhdyBhIG11bHRpLWdyYWRpZW50ICh3aXRob3V0IGFkdmFuY2VkIGdyYXBoaWNzKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yIChkaXNwbGF5LCAyMzQsIDI0NiwgMjUzKTsKLQkJCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvciAoZGlzcGxheSwgMjE3LCAyNDAsIDI1Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yMSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yMik7Ci0JCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUgKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAvIDIsIHRydWUpOwotCQkJY29sb3IxLmRpc3Bvc2UgKCk7Ci0JCQljb2xvcjIuZGlzcG9zZSAoKTsKLQkJCUNvbG9yIGNvbG9yMyA9IG5ldyBDb2xvciAoZGlzcGxheSwgMTkwLCAyMzAsIDI1Myk7Ci0JCQlDb2xvciBjb2xvcjQgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE2NywgMjE3LCAyNDUpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcjMpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcjQpOwotCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSArIChyZWN0LmhlaWdodCAvIDIpLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAvIDIgKyAxLCB0cnVlKTsKLQkJCWNvbG9yMy5kaXNwb3NlICgpOwotCQkJY29sb3I0LmRpc3Bvc2UgKCk7Ci0JCQkKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgNjQpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0JCQlkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlMGFjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZHJhdyBhIG11bHRpLWdyYWRpZW50Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5OT19CQUNLR1JPVU5EKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDIzNCwgMjQ2LCAyNTMpOwotCQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yIChkaXNwbGF5LCAyMTcsIDI0MCwgMjUyKTsKLQkJCUNvbG9yIGNvbG9yMyA9IG5ldyBDb2xvciAoZGlzcGxheSwgMTkwLCAyMzAsIDI1Myk7Ci0JCQlDb2xvciBjb2xvcjQgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE2NywgMjE3LCAyNDUpOwotCQkJUGF0dGVybiBwMSA9IG5ldyBQYXR0ZXJuIChkaXNwbGF5LCAwLCAwLCAwLCByZWN0LmhlaWdodCAvIDIsIGNvbG9yMSwgY29sb3IyKTsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuIChwMSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgLyAyKTsKLQkJCVBhdHRlcm4gcDIgPSBuZXcgUGF0dGVybiAoZGlzcGxheSwgMCwgcmVjdC5oZWlnaHQgLyAyLCAwLCByZWN0LmhlaWdodCwgY29sb3IzLCBjb2xvcjQpOwotCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4gKHAyKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUgKHJlY3QueCwgcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC8gMiksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0IC8gMiArIDEpOwotCQkJcDEuZGlzcG9zZSAoKTsKLQkJCXAyLmRpc3Bvc2UgKCk7Ci0JCQljb2xvcjEuZGlzcG9zZSAoKTsKLQkJCWNvbG9yMi5kaXNwb3NlICgpOwotCQkJY29sb3IzLmRpc3Bvc2UgKCk7Ci0JCQljb2xvcjQuZGlzcG9zZSAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgNjQpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0JCQlkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4ODRkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvcHkvcGFzdGUgaW1hZ2UgdG8vZnJvbSBjbGlwYm9hcmQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0pOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNoZWxsLnNldFRleHQoIkNsaXBib2FyZCBJbWFnZVRyYW5zZmVyIik7Ci0KLQkgICAgZmluYWwgQnV0dG9uIGltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULk5PTkUgKTsKLQkgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgICAgZ2QubWluaW11bUhlaWdodCA9IDQwMDsKLQkgICAgZ2QubWluaW11bVdpZHRoID0gNjAwOwotCSAgICBpbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgdHJ1ZSkpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJPcGVuIik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBTV1QuT1BFTik7Ci0JCQkJZGlhbG9nLnNldFRleHQoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQkJCQlTdHJpbmcgc3RyaW5nID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCUltYWdlIGltYWdlID0gaW1hZ2VCdXR0b24uZ2V0SW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyaW5nKTsKLQkJCQkJaW1hZ2VCdXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJDb3B5Iik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUltYWdlIGltYWdlID0gaW1hZ2VCdXR0b24uZ2V0SW1hZ2UoKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlJbWFnZVRyYW5zZmVyIHRyYW5zZmVyID0gSW1hZ2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtde2ltYWdlLmdldEltYWdlRGF0YSgpfSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiUGFzdGUiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW1hZ2VUcmFuc2ZlciB0cmFuc2ZlciA9IEltYWdlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gKEltYWdlRGF0YSljbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJCWlmIChpbWFnZURhdGEgIT0gbnVsbCkgewotCQkJCQlpbWFnZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQlpbWFnZUJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW1hZ2VCdXR0b24uc2V0VGV4dCgiTm8gaW1hZ2UiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJDbGVhciIpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpbWFnZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQkJCQlJbWFnZSBpbWFnZSA9IGltYWdlQnV0dG9uLmdldEltYWdlKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpbWFnZUJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJlMGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGxlZnQgYWxpZ25lZCBpY29uLCB0ZXh0IGFuZCBzZWxlY3Rpb24KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjgzIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBTbmlwcGV0MjgzLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVjbGlwc2UucG5nIikpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSArICIgd2l0aCBsb25nIHRleHQgdGhhdCBzY3JvbGxzLiIpOwotCQkJaWYgKGkgJSAyID09IDEpIGl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJfQotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJaWYgKHRhYmxlLmdldEl0ZW0ocG9pbnQpICE9IG51bGwpIHJldHVybjsKLQkJCQlmb3IgKGludCBpPXRhYmxlLmdldFRvcEluZGV4ICgpOyBpPHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQkJUmVjdGFuZ2xlIGl0ZW1SZWN0ID0gaXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJCWlmICghaXRlbVJlY3QuaW50ZXJzZWN0cyAocmVjdCkpIHJldHVybjsKLQkJCQkJaXRlbVJlY3QueCA9IHJlY3QueDsKLQkJCQkJaXRlbVJlY3Qud2lkdGggPSByZWN0LndpZHRoOwotCQkJCQlpZiAoaXRlbVJlY3QuY29udGFpbnMgKHBvaW50KSkgewotCQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uIChpdGVtKTsKLQkJCQkJCUV2ZW50IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEV2ZW50ICgpOwotCQkJCQkJc2VsZWN0aW9uRXZlbnQuaXRlbSA9IGl0ZW07Ci0JCQkJCQl0YWJsZS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgc2VsZWN0aW9uRXZlbnQpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJLyoKLQkJICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkJICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkJICovCi0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuRk9SRUdST1VORDsKLQkJCQlTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7Ci0JCQkJaWYgKG9zTmFtZSAhPSBudWxsICYmIG9zTmFtZS5pbmRleE9mICgiV2luZG93cyIpICE9IC0xKSB7Ci0JCQkJCWlmIChvc05hbWUuaW5kZXhPZiAoIlZpc3RhIikgIT0gLTEgfHwgb3NOYW1lLmluZGV4T2YgKCJ1bmtub3duIikgIT0gLTEpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlldmVudC5kZXRhaWwgJj0gfihTV1QuRk9SRUdST1VORCB8IFNXVC5TRUxFQ1RFRCB8IFNXVC5IT1QgfCBTV1QuRk9DVVNFRCk7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW1SZWN0ID0gaXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJaXRlbVJlY3QueCA9IHJlY3QueDsKLQkJCQlpdGVtUmVjdC53aWR0aCA9IHJlY3Qud2lkdGg7Ci0JCQkJZ2Muc2V0Q2xpcHBpbmcgKChSZWN0YW5nbGUpIG51bGwpOwotCQkJCWdjLmZpbGxSZWN0YW5nbGUgKGl0ZW1SZWN0KTsKLQkJCX0KLQkJfSk7Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlJbWFnZSBpbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UgKDApOwotCQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0ICgwKTsKLQkJCQlQb2ludCB0ZXh0RXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50ICh0ZXh0KTsKLQkJCQlSZWN0YW5nbGUgaW1hZ2VSZWN0ID0gaXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQkJCQlSZWN0YW5nbGUgdGV4dFJlY3QgPSBpdGVtLmdldFRleHRCb3VuZHMgKDApOwotCQkJCWludCB0ZXh0WSA9IHRleHRSZWN0LnkgKyBNYXRoLm1heCAoMCwgKHRleHRSZWN0LmhlaWdodCAtIHRleHRFeHRlbnQueSkgLyAyKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlnYy5kcmF3U3RyaW5nKHRleHQsIGltYWdlUmVjdC54LCB0ZXh0WSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUmVjdGFuZ2xlIGltYWdlRXh0ZW50ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJCQlpbnQgaW1hZ2VZID0gaW1hZ2VSZWN0LnkgKyBNYXRoLm1heCAoMCwgKGltYWdlUmVjdC5oZWlnaHQgLSBpbWFnZUV4dGVudC5oZWlnaHQpIC8gMik7Ci0JCQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIGltYWdlUmVjdC54LCBpbWFnZVkpOwotCQkJCQlnYy5kcmF3U3RyaW5nICh0ZXh0LCB0ZXh0UmVjdC54LCB0ZXh0WSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzZjNhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgYSBVUkwgYmV0d2VlbiB0d28gbGFiZWxzLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjg0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlVSTFRyYW5zZmVyIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0ICgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXNldERyYWdTb3VyY2UgKGxhYmVsMSk7Ci0Jc2V0RHJvcFRhcmdldCAobGFiZWwyKTsKLQlzaGVsbC5zZXRTaXplKDYwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RHJhZ1NvdXJjZSAoZmluYWwgTGFiZWwgbGFiZWwpIHsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtVUkxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQllLmRhdGEgPSBsYWJlbC5nZXRUZXh0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREcm9wVGFyZ2V0IChmaW5hbCBMYWJlbCBsYWJlbCkgewotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQobGFiZWwsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkKLQkJCQllLmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9OT05FKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbGFiZWwuc2V0VGV4dCgoKFN0cmluZykgZXZlbnQuZGF0YSkpOwotCQl9Ci0JfSk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWZiOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBjcmVhdGUgYSBjaXJjdWxhciBzaGVsbCBmcm9tIGEgcGF0aC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODUgewotCXN0YXRpYyB2b2lkIGxvYWRQYXRoKFJlZ2lvbiByZWdpb24sIGZsb2F0W10gcG9pbnRzLCBieXRlW10gdHlwZXMpIHsKLQkJaW50IHN0YXJ0ID0gMCwgZW5kID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJc3dpdGNoICh0eXBlc1tpXSkgewotCQkJCWNhc2UgU1dULlBBVEhfTU9WRV9UTzogewotCQkJCQlpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JCQkJCQlpbnQgbiA9IDA7Ci0JCQkJCQlpbnRbXSB0ZW1wID0gbmV3IGludFtlbmQgLSBzdGFydF07Ci0JCQkJCQlmb3IgKGludCBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykgewotCQkJCQkJCXRlbXBbbisrXSA9IE1hdGgucm91bmQocG9pbnRzW2tdKTsKLQkJCQkJCX0KLQkJCQkJCXJlZ2lvbi5hZGQodGVtcCk7Ci0JCQkJCX0KLQkJCQkJc3RhcnQgPSBlbmQ7Ci0JCQkJCWVuZCArPSAyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUEFUSF9MSU5FX1RPOiB7Ci0JCQkJCWVuZCArPSAyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUEFUSF9DTE9TRTogewotCQkJCQlpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JCQkJCQlpbnQgbiA9IDA7Ci0JCQkJCQlpbnRbXSB0ZW1wID0gbmV3IGludFtlbmQgLSBzdGFydF07Ci0JCQkJCQlmb3IgKGludCBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykgewotCQkJCQkJCXRlbXBbbisrXSA9IE1hdGgucm91bmQocG9pbnRzW2tdKTsKLQkJCQkJCX0KLQkJCQkJCXJlZ2lvbi5hZGQodGVtcCk7Ci0JCQkJCX0KLQkJCQkJc3RhcnQgPSBlbmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCB3aWR0aCA9IDI1MCwgaGVpZ2h0ID0gMjUwOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCWZpbmFsIFBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmFkZEFyYygwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAzNjApOwotCQlQYXRoIHBhdGgyID0gbmV3IFBhdGgoZGlzcGxheSwgcGF0aCwgMC4xZik7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlQYXRoRGF0YSBkYXRhID0gcGF0aDIuZ2V0UGF0aERhdGEoKTsKLQkJcGF0aDIuZGlzcG9zZSgpOwotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJbG9hZFBhdGgocmVnaW9uLCBkYXRhLnBvaW50cywgZGF0YS50eXBlcyk7Ci0JCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRG93bjogewotCQkJCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBTV1QuUGFpbnQ6IHsKLQkJCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCVBhdHRlcm4gcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRpc3BsYXksIHJlY3QueCwgcmVjdC55Ci0JCQkJCQkJCSsgcmVjdC5oZWlnaHQsIHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSwgZGlzcGxheQotCQkJCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpLCBkaXNwbGF5Ci0JCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQkJCQkJCXBhdHRlcm4uZGlzcG9zZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0JCXNoZWxsLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA2OTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiB1c2UgYSBtZW51IGl0ZW0ncyBhcm1MaXN0ZW5lciB0byB1cGRhdGUgYSBzdGF0dXMgbGluZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJQ2FudmFzIGJsYW5rQ2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWJsYW5rQ2FudmFzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDIwMCwgMjAwKSk7Ci0JCWZpbmFsIExhYmVsIHN0YXR1c0xpbmUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJc3RhdHVzTGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQotCQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JCQotCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVJdGVtLnNldFRleHQgKCJUZXN0Iik7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KGJhcik7Ci0JCW1lbnVJdGVtLnNldE1lbnUgKG1lbnUpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQkJaXRlbS5hZGRBcm1MaXN0ZW5lcihuZXcgQXJtTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0QXJtZWQoQXJtRXZlbnQgZSkgewotCQkJCQlzdGF0dXNMaW5lLnNldFRleHQoKChNZW51SXRlbSllLmdldFNvdXJjZSgpKS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWVlODRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHNlYXJjaCBmb3IgYSBzdHJpbmcgaW4gYSBUcmVlIHJlY3Vyc2l2ZWx5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjg3IHsKLQotc3RhdGljIFRyZWUgdHJlZTsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBTdHJpbmcgU0VBUkNIX1NUUklORyA9ICI0YiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzICgxMCwxMCwzMDAsMzAwKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQotCS8qIGNyZWF0ZSB0aGUgVHJlZSAqLwotCXRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCXRyZWUuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQluZXcgVHJlZUNvbHVtbiAodHJlZSwgU1dULk5PTkUpLnNldFdpZHRoICg5MCk7Ci0JfQotCWludCBpbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IGNyZWF0ZUl0ZW0gKG51bGwsIGluZGV4KyspOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJaXRlbSA9IGNyZWF0ZUl0ZW0gKGl0ZW0sIGluZGV4KyspOwotCQl9Ci0JfQotCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJGaW5kICciICsgU0VBUkNIX1NUUklORyArICInIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpdGVtQ291bnQgPSB0cmVlLmdldEl0ZW1Db3VudCAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gdHJlZS5nZXRJdGVtIChpKTsKLQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmaW5kIChpdGVtLCBTRUFSQ0hfU1RSSU5HKTsKLQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJGb3VuZCBpdCIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGlkIG5vdCBmaW5kIGl0Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLS8qIGZvciBjcmVhdGluZyBzYW1wbGUgVHJlZSAqLwotc3RhdGljIFRyZWVJdGVtIGNyZWF0ZUl0ZW0gKFRyZWVJdGVtIHBhcmVudCwgaW50IGl0ZW1JbmRleCkgewotCVRyZWVJdGVtIG5ld0l0ZW0gPSBudWxsOwotCWlmIChwYXJlbnQgPT0gbnVsbCkgewkvKiByb290IGxldmVsIGl0ZW0gKi8KLQkJbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCX0gZWxzZSB7Ci0JCW5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0gKHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQlTdHJpbmcgaW5kZXhTdHJpbmcgPSBTdHJpbmcudmFsdWVPZiAoaXRlbUluZGV4KTsgCi0JbmV3SXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Ci0JCWluZGV4U3RyaW5nICsgJ2EnLCBpbmRleFN0cmluZyArICdiJywgaW5kZXhTdHJpbmcgKyAnYyd9KTsKLQlyZXR1cm4gbmV3SXRlbTsKLX0KLQotLyogcmVjdXJzaXZlIGZpbmQgKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaW5kIChUcmVlSXRlbSBpdGVtLCBTdHJpbmcgc2VhcmNoU3RyaW5nKSB7Ci0JLyogY2hlY2sgdGhpcyBpdGVtICovCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLQkJU3RyaW5nIGNvbnRlbnRzID0gaXRlbS5nZXRUZXh0IChpKTsKLQkJaWYgKChjb250ZW50cy50b1VwcGVyQ2FzZSAoKS5pbmRleE9mIChzZWFyY2hTdHJpbmcudG9VcHBlckNhc2UgKCkpKSAhPSAtMSkgewotCQkJdHJlZS5zZXRTZWxlY3Rpb24gKGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlpZiAoIWl0ZW0uZ2V0RXhwYW5kZWQgKCkpIHJldHVybiBmYWxzZTsgLyogZG9uJ3QgY2hlY2sgY2hpbGQgaXRlbXMgKi8KLQotCS8qIGNoZWNrIGNoaWxkIGl0ZW1zICovCi0JaW50IGNoaWxkQ291bnQgPSBpdGVtLmdldEl0ZW1Db3VudCAoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBjaGlsZCA9IGl0ZW0uZ2V0SXRlbSAoaSk7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZpbmQgKGNoaWxkLCBzZWFyY2hTdHJpbmcpOwotCQlpZiAoc3VjY2VzcykgcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Y1ZTg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgVG9vbEJhciBjb250YWluaW5nIGFuaW1hdGVkIEdJRnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjg4IHsKLQkKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgR0Mgc2hlbGxHQzsKLQlzdGF0aWMgQ29sb3Igc2hlbGxCYWNrZ3JvdW5kOwotCXN0YXRpYyBJbWFnZUxvYWRlcltdIGxvYWRlcjsKLQlzdGF0aWMgSW1hZ2VEYXRhW11bXSBpbWFnZURhdGFBcnJheTsKLQlzdGF0aWMgVGhyZWFkIGFuaW1hdGVUaHJlYWRbXTsKLQlzdGF0aWMgSW1hZ2VbXVtdIGltYWdlOwotCXByaXZhdGUgc3RhdGljIFRvb2xJdGVtIGl0ZW1bXTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VHSUZCYWNrZ3JvdW5kID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGxCYWNrZ3JvdW5kID0gc2hlbGwuZ2V0QmFja2dyb3VuZCgpOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTiB8IFNXVC5NVUxUSSk7Ci0JCWRpYWxvZy5zZXRUZXh0KCJTZWxlY3QgTXVsdGlwbGUgQW5pbWF0ZWQgR0lGcyIpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmdpZiJ9KTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJU3RyaW5nIGZpbGVuYW1lc1tdID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpbnQgbnVtVG9vbEJhckl0ZW1zID0gZmlsZW5hbWVzLmxlbmd0aDsKLQkJaWYgKG51bVRvb2xCYXJJdGVtcyA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJbG9hZEFsbEltYWdlcyhuZXcgRmlsZShmaWxlbmFtZSkuZ2V0UGFyZW50KCksIGZpbGVuYW1lcyk7Ci0JCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgYW4gaW1hZ2UuIik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCQkJaXRlbSA9IG5ldyBUb29sSXRlbVtudW1Ub29sQmFySXRlbXNdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub29sQmFySXRlbXM7IGkrKykgewotCQkJCWl0ZW1baV0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCQlpdGVtW2ldLnNldEltYWdlKGltYWdlW2ldWzBdKTsKLQkJCX0KLQkJCXRvb2xCYXIucGFjayAoKTsKLQkJCXNoZWxsLm9wZW4gKCk7Ci0JCQkKLQkJCXN0YXJ0QW5pbWF0aW9uVGhyZWFkcygpOwotCQkJCi0JCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9vbEJhckl0ZW1zOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGltYWdlW2ldLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWltYWdlW2ldW2pdLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRBbGxJbWFnZXMoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nW10gZmlsZW5hbWVzKSB0aHJvd3MgU1dURXhjZXB0aW9uIHsKLQkJaW50IG51bUl0ZW1zID0gZmlsZW5hbWVzLmxlbmd0aDsKLQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyW251bUl0ZW1zXTsKLQkJaW1hZ2VEYXRhQXJyYXkgPSBuZXcgSW1hZ2VEYXRhW251bUl0ZW1zXVtdOwotCQlpbWFnZSA9IG5ldyBJbWFnZVtudW1JdGVtc11bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7Ci0JCQlsb2FkZXJbaV0gPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWludCBmdWxsV2lkdGggPSBsb2FkZXJbaV0ubG9naWNhbFNjcmVlbldpZHRoOwotCQkJaW50IGZ1bGxIZWlnaHQgPSBsb2FkZXJbaV0ubG9naWNhbFNjcmVlbkhlaWdodDsKLQkJCWltYWdlRGF0YUFycmF5W2ldID0gbG9hZGVyW2ldLmxvYWQoZGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlbmFtZXNbaV0pOwotCQkJaW50IG51bUZyYW1lc09mQW5pbWF0aW9uID0gaW1hZ2VEYXRhQXJyYXlbaV0ubGVuZ3RoOwotCQkJaW1hZ2VbaV0gPSBuZXcgSW1hZ2VbbnVtRnJhbWVzT2ZBbmltYXRpb25dOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1GcmFtZXNPZkFuaW1hdGlvbjsgaisrKSB7Ci0JCQkJaWYgKGogPT0gMCkgewotCQkJCQkvL2ZvciB0aGUgZmlyc3QgZnJhbWUgb2YgYW5pbWF0aW9uLCBqdXN0IGRyYXcgdGhlIGZpcnN0IGZyYW1lCi0JCQkJCWltYWdlW2ldW2pdID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YUFycmF5W2ldW2pdKTsKLQkJCQkJZnVsbFdpZHRoID0gaW1hZ2VEYXRhQXJyYXlbaV1bal0ud2lkdGg7Ci0JCQkJCWZ1bGxIZWlnaHQgPSBpbWFnZURhdGFBcnJheVtpXVtqXS5oZWlnaHQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvL2FmdGVyIHRoZSBmaXJzdCBmcmFtZSBvZiBhbmltYXRpb24sIGRyYXcgdGhlIGJhY2tncm91bmQgb3IgcHJldmlvdXMgZnJhbWUgZmlyc3QsIHRoZW4gdGhlIG5ldyBpbWFnZSBkYXRhIAotCQkJCQlpbWFnZVtpXVtqXSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQpOwotCQkJCQlHQyBnYyA9IG5ldyBHQyhpbWFnZVtpXVtqXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoc2hlbGxCYWNrZ3JvdW5kKTsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQpOwotCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhQXJyYXlbaV1bal07Ci0JCQkJCXN3aXRjaCAoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKSB7Ci0JCQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDoKLQkJCQkJCS8qIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCUNvbG9yIGJnQ29sb3IgPSBudWxsOwotCQkJCQkJaWYgKHVzZUdJRkJhY2tncm91bmQgJiYgbG9hZGVyW2ldLmJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGxvYWRlcltpXS5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJCQkJCX0KLQkJCQkJCWdjLnNldEJhY2tncm91bmQoYmdDb2xvciAhPSBudWxsID8gYmdDb2xvciA6IHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlRGF0YS54LCBpbWFnZURhdGEueSwgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCWlmIChiZ0NvbG9yICE9IG51bGwpIGJnQ29sb3IuZGlzcG9zZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQkvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCWdjLmRyYXdJbWFnZSgKLQkJCQkJCQlpbWFnZVtpXVtqLTFdLAotCQkJCQkJCTAsCi0JCQkJCQkJMCwKLQkJCQkJCQlmdWxsV2lkdGgsCi0JCQkJCQkJZnVsbEhlaWdodCwKLQkJCQkJCQkwLAotCQkJCQkJCTAsCi0JCQkJCQkJZnVsbFdpZHRoLAotCQkJCQkJCWZ1bGxIZWlnaHQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJSW1hZ2UgbmV3RnJhbWUgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJZ2MuZHJhd0ltYWdlKG5ld0ZyYW1lLAotCQkJCQkJCTAsCi0JCQkJCQkJMCwKLQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCW5ld0ZyYW1lLmRpc3Bvc2UoKTsKLQkJCQkJZ2MuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRBbmltYXRpb25UaHJlYWRzKCkgewotCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZFtpbWFnZS5sZW5ndGhdOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgaW1hZ2UubGVuZ3RoOyBpaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaSA9IGlpOwotCQkJYW5pbWF0ZVRocmVhZFtpXSA9IG5ldyBUaHJlYWQoIkFuaW1hdGlvbiAiK2kpIHsKLQkJCQlpbnQgaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCByZXBlYXRDb3VudCA9IGxvYWRlcltpXS5yZXBlYXRDb3VudDsKLQkJCQkJCXdoaWxlIChsb2FkZXJbaV0ucmVwZWF0Q291bnQgPT0gMCB8fCByZXBlYXRDb3VudCA+IDApIHsKLQkJCQkJCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXlbaV0ubGVuZ3RoOwotCQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICghaXRlbVtpXS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCQkJCWl0ZW1baV0uc2V0SW1hZ2UoaW1hZ2VbaV1baW1hZ2VEYXRhSW5kZXhdKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCS8qIFNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5IHRpbWUgKGFkZGluZyBjb21tb25seS11c2VkIHNsb3ctZG93biBmdWRnZSBmYWN0b3JzKS4gKi8KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbnQgbXMgPSBpbWFnZURhdGFBcnJheVtpXVtpbWFnZURhdGFJbmRleF0uZGVsYXlUaW1lICogMTA7Ci0JCQkJCQkJCWlmIChtcyA8IDIwKSBtcyArPSAzMDsKLQkJCQkJCQkJaWYgKG1zIDwgMzApIG1zICs9IDEwOwotCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvKiBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UsIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50IGFuZCBzdGFydCBhZ2Fpbi4gKi8KLQkJCQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXlbaV0ubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBhbmltYXRpbmcgdGhlIEdJRiIpOwotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJYW5pbWF0ZVRocmVhZFtpXS5zZXREYWVtb24odHJ1ZSk7Ci0JCQlhbmltYXRlVGhyZWFkW2ldLnN0YXJ0KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzhjMzZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBiYXIgYW5kIHB1bGwgZG93biBtZW51IChhY2NlbGVyYXRvcnMsIG1uZW1vbmljcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAoIiZGaWxlIik7Ci0JTWVudSBzdWJtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlmaWxlSXRlbS5zZXRNZW51IChzdWJtZW51KTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdCBBbGwiKTsKLQkJfQotCX0pOwotCWl0ZW0uc2V0VGV4dCAoIlNlbGVjdCAmQWxsXHRDdHJsK0EiKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yIChTV1QuTU9EMSArICdBJyk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWYxZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAoU1dULkZVTExfU0VMRUNUSU9OKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotCQkJfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChqLCAiSXRlbSAiICsgaSArICItIiArIGopOwotCQl9Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIDIwMCk7Ci0JdGFibGUuc2V0U2l6ZShzaXplKTsKLQlzaGVsbC5wYWNrKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0ocHQpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzKGkpOwotCQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gIiArIGluZGV4ICsgIi0iICsgaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmQ3NjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGludm9rZSB0aGUgc3lzdGVtIHRleHQgZWRpdG9yIG9uIGF1dG9leGVjLmJhdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlQcm9ncmFtIHAgPSBQcm9ncmFtLmZpbmRQcm9ncmFtICgiLnR4dCIpOwotCWlmIChwICE9IG51bGwpIHAuZXhlY3V0ZSAoImM6XFxhdXRvZXhlYy5iYXQiKTsgLy8gV2luZG93cy1zcGVjaWZpYyBmaWxlbmFtZQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OThjMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJhY2tlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyYWNrZXIgKGRyYWcgd2hlbiAidG9ybiBvZmYiKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJUG9pbnQgcG9pbnQgPSBudWxsOwotCQlzdGF0aWMgZmluYWwgaW50IEpJVFRFUiA9IDg7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKHBvaW50ID09IG51bGwpIHJldHVybjsKLQkJCQkJaW50IGRlbHRhWCA9IHBvaW50LnggLSBldmVudC54LCBkZWx0YVkgPSBwb2ludC55IC0gZXZlbnQueTsKLQkJCQkJaWYgKE1hdGguYWJzIChkZWx0YVgpIDwgSklUVEVSICYmIE1hdGguYWJzIChkZWx0YVkpIDwgSklUVEVSKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJVHJhY2tlciB0cmFja2VyID0gbmV3IFRyYWNrZXIgKGRpc3BsYXksIFNXVC5OT05FKTsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5Lm1hcCAoc2hlbGwsIG51bGwsIHNoZWxsLmdldENsaWVudEFyZWEgKCkpOwotCQkJCQlyZWN0LnggLT0gZGVsdGFYOwotCQkJCQlyZWN0LnkgLT0gZGVsdGFZOwotCQkJCQl0cmFja2VyLnNldFJlY3RhbmdsZXMgKG5ldyBSZWN0YW5nbGUgW10ge3JlY3R9KTsKLQkJCQkJdHJhY2tlci5vcGVuICgpOwotCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCXBvaW50ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWNiZGE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBmaW5kIHRoZSBpY29uIG9mIHRoZSBwcm9ncmFtIHRoYXQgZWRpdHMgLmJtcCBmaWxlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkNhbid0IGZpbmQgaWNvbiBmb3IgLmJtcCIpOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQlQcm9ncmFtIHAgPSBQcm9ncmFtLmZpbmRQcm9ncmFtICgiLmJtcCIpOwotCWlmIChwICE9IG51bGwpIHsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBwLmdldEltYWdlRGF0YSAoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGRhdGEpOwotCQkJbGFiZWwuc2V0SW1hZ2UgKGltYWdlKTsKLQkJfQotCX0KLQlsYWJlbC5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZjOTEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpcmVjdG9yeURpYWxvZyBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBkaXJlY3RvcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nIChzaGVsbCk7Ci0JZGlhbG9nLnNldEZpbHRlclBhdGggKCJjOlxcIik7IC8vV2luZG93cyBzcGVjaWZpYwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlJFU1VMVD0iICsgZGlhbG9nLm9wZW4gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzY1Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIExhYmVsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFiZWwgKHdpdGggYW4gaW1hZ2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0SW1hZ2UgKGltYWdlKTsKLQlsYWJlbC5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsgCi0JfSAKLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Mzg3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKG5vIGNvbHVtbnMsIG5vIGhlYWRlcnMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFNpemUgKDEwMCwgMTAwKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWU3Mjg0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZmxhdCB0b29sIGJhciAoaW1hZ2VzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JfQotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZjZjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMYWJlbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhYmVsIChhIHNlcGFyYXRvcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JbmV3IExhYmVsIChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULlZFUlRJQ0FMKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYWUzYTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAoY29sdW1ucywgaGVhZGVycywgbGluZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCVN0cmluZ1tdIHRpdGxlcyA9IHsiICIsICJDIiwgIiEiLCAiRGVzY3JpcHRpb24iLCAiUmVzb3VyY2UiLCAiSW4gRm9sZGVyIiwgIkxvY2F0aW9uIn07Ci0JZm9yIChpbnQgaT0wOyBpPHRpdGxlcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0ICh0aXRsZXMgW2ldKTsKLQl9CQotCWludCBjb3VudCA9IDEyODsKLQlmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoMCwgIngiKTsKLQkJaXRlbS5zZXRUZXh0ICgxLCAieSIpOwotCQlpdGVtLnNldFRleHQgKDIsICIhIik7Ci0JCWl0ZW0uc2V0VGV4dCAoMywgInRoaXMgc3R1ZmYgYmVoYXZlcyB0aGUgd2F5IEkgZXhwZWN0Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoNCwgImFsbW9zdCBldmVyeXdoZXJlIik7Ci0JCWl0ZW0uc2V0VGV4dCAoNSwgInNvbWUuZm9sZGVyIik7Ci0JCWl0ZW0uc2V0VGV4dCAoNiwgImxpbmUgIiArIGkgKyAiIGluIG5vd2hlcmUiKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPHRpdGxlcy5sZW5ndGg7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4gKGkpLnBhY2sgKCk7Ci0JfQkKLQl0YWJsZS5zZXRTaXplICh0YWJsZS5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIDIwMCkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjg1YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ0NvbWJvIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgQ0NvbWJvCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJY29tYm8uYWRkKCJpdGVtIiArIGkpOwotCQl9Ci0JCWNvbWJvLnNldFRleHQoIml0ZW0wIik7Ci0KLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIHNlbGVjdGVkIik7Ci0JCQl9OwotCQl9KTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzg0MTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBwcmV2ZW50IGVzY2FwZSBmcm9tIGNsb3NpbmcgYSBkaWFsb2cKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJPcGVuIERpYWxvZyAuLi4iKTsKLQkJYi5wYWNrKCk7Ci0JCWIuc2V0TG9jYXRpb24oMTAsIDEwKTsKLQkJYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCQkJCWRpYWxvZy5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUpIHsKLQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyNTc2Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHBvcHVwIG1lbnUgKHNldCBpbiBtdWx0aXBsZSBjb250cm9scykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzEuc2V0U2l6ZSAoMTAwLCAxMDApOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMi5zZXRCb3VuZHMgKDEwMCwgMCwgMTAwLCAxMDApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIlBvcHVwIik7Ci0JYzEuc2V0TWVudSAobWVudSk7Ci0JYzIuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBlMTljLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0b29sIHRpcHMgZm9yIGEgdGFiIGl0ZW0sIHRvb2wgaXRlbSwgYW5kIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlTdHJpbmcgc3RyaW5nID0gIlRoaXMgaXMgYSBzdHJpbmdcbndpdGggYSBuZXcgbGluZS4iOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvbGRlci5zZXRTaXplICgyMDAsIDIwMCk7Ci0JVGFiSXRlbSBpdGVtMCA9IG5ldyBUYWJJdGVtIChmb2xkZXIsIDApOwotCWl0ZW0wLnNldFRvb2xUaXBUZXh0ICgiVGFiSXRlbSB0b29sVGlwOiAiICsgc3RyaW5nKTsKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYmFyLnNldEJvdW5kcyAoMCwgMjAwLCAyMDAsIDY0KTsKLQlUb29sSXRlbSBpdGVtMSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQlpdGVtMS5zZXRUb29sVGlwVGV4dCAoIlRvb2xJdGVtIHRvb2xUaXA6ICIgKyBzdHJpbmcpOwotCXNoZWxsLnNldFRvb2xUaXBUZXh0ICgiU2hlbGwgdG9vbFRpcDogIiArIHN0cmluZyk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGY0MWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGdldCB0aGUgYm91bmRzIGFuZCBjbGllbnQgYXJlYSBvZiBhIGRpc3BsYXkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRpc3BsYXkgQm91bmRzPSIgKyBkaXNwbGF5LmdldEJvdW5kcyAoKSArICIgRGlzcGxheSBDbGllbnRBcmVhPSIgKyBkaXNwbGF5LmdldENsaWVudEFyZWEgKCkpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU2MzQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQgKHVzaW5nIGFuIGltYWdlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCAyMCwgMjApOwotCWdjLnNldEZvcmVncm91bmQgKHdoaXRlKTsKLQlnYy5kcmF3TGluZSAoMCwgMCwgMTksIDE5KTsKLQlnYy5kcmF3TGluZSAoMTksIDAsIDAsIDE5KTsKLQlnYy5kaXNwb3NlICgpOwotCWNhcmV0LnNldExvY2F0aW9uICgxMCwgMTApOwotCWNhcmV0LnNldEltYWdlIChpbWFnZSk7Ci0JZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQlnYy5kcmF3SW1hZ2UgKGltYWdlLCAxMCwgNjQpOwotCWNhcmV0LnNldFZpc2libGUgKGZhbHNlKTsKLQlnYy5kcmF3U3RyaW5nICgiVGVzdCIsIDEyLCAxMik7Ci0JY2FyZXQuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1Njg2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGhhbmQgY3Vyc29yIGludG8gYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvciAoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmaW5hbCBCdXR0b24gYiA9IG5ldyBCdXR0b24gKHNoZWxsLCAwKTsKLQliLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JYi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWIuc2V0Q3Vyc29yIChjdXJzb3IpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFjZWUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjYWxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2NhbGUgKG1heGltdW0gNDAsIHBhZ2UgaW5jcmVtZW50IDUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JU2NhbGUgc2NhbGUgPSBuZXcgU2NhbGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzY2FsZS5zZXRTaXplICgyMDAsIDY0KTsKLQlzY2FsZS5zZXRNYXhpbXVtICg0MCk7Ci0Jc2NhbGUuc2V0UGFnZUluY3JlbWVudCAoNSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWM2MjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGludGVyY2VwdCBtb3VzZSBldmVudHMgKGRyYWcgYSBidXR0b24gd2l0aCB0aGUgbW91c2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ2IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0RW5hYmxlZCAoZmFsc2UpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24iKTsKLQljb21wb3NpdGUucGFjayAoKTsKLQljb21wb3NpdGUuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JZmluYWwgUG9pbnQgW10gb2Zmc2V0ID0gbmV3IFBvaW50IFsxXTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMgKCk7Ci0JCQkJCWlmIChyZWN0LmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgewotCQkJCQkJUG9pbnQgcHQxID0gY29tcG9zaXRlLnRvRGlzcGxheSAoMCwgMCk7Ci0JCQkJCQlQb2ludCBwdDIgPSBzaGVsbC50b0Rpc3BsYXkgKGV2ZW50LngsIGV2ZW50LnkpOyAKLQkJCQkJCW9mZnNldCBbMF0gPSBuZXcgUG9pbnQgKHB0Mi54IC0gcHQxLngsIHB0Mi55IC0gcHQxLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9mZnNldCBbMF0gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcHQgPSBvZmZzZXQgWzBdOwotCQkJCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChldmVudC54IC0gcHQueCwgZXZlbnQueSAtIHB0LnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9mZnNldCBbMF0gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA1NWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKG5vcm1hbCwgaG90IGFuZCBkaXNhYmxlZCBpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JSW1hZ2UgZGlzYWJsZWRJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9HUkVFTik7Ci0JZ2MgPSBuZXcgR0MgKGRpc2FibGVkSW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChkaXNhYmxlZEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlJbWFnZSBob3RJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWdjID0gbmV3IEdDIChob3RJbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGhvdEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQliYXIuc2V0U2l6ZSAoMjAwLCAzMik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQlpdGVtLnNldERpc2FibGVkSW1hZ2UgKGRpc2FibGVkSW1hZ2UpOwotCQlpdGVtLnNldEhvdEltYWdlIChob3RJbWFnZSk7Ci0JCWlmIChpICUgMyA9PSAwKSBpdGVtLnNldEVuYWJsZWQgKGZhbHNlKTsKLQl9Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNhYmxlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JaG90SW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzYmE3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENhbnZhcyBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhbiBpbWFnZSAoZmxpY2tlciBmcmVlLCBubyBkb3VibGUgYnVmZmVyaW5nKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JSW1hZ2Ugb3JpZ2luYWxJbWFnZSA9IG51bGw7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5PUEVOKTsKLQlkaWFsb2cuc2V0VGV4dCAoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQlTdHJpbmcgc3RyaW5nID0gZGlhbG9nLm9wZW4gKCk7Ci0JaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHN0cmluZyk7Ci0JfQotCWlmIChvcmlnaW5hbEltYWdlID09IG51bGwpIHsKLQkJaW50IHdpZHRoID0gMTUwLCBoZWlnaHQgPSAyMDA7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQlHQyBnYyA9IG5ldyBHQyAob3JpZ2luYWxJbWFnZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kcmF3TGluZSAoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLmRyYXdMaW5lICgwLCBoZWlnaHQsIHdpZHRoLCAwKTsKLQkJZ2MuZHJhd1RleHQgKCJEZWZhdWx0IEltYWdlIiwgMTAsIDEwKTsKLQkJZ2MuZGlzcG9zZSAoKTsKLQl9Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBvcmlnaW5hbEltYWdlOwotCWZpbmFsIFBvaW50IG9yaWdpbiA9IG5ldyBQb2ludCAoMCwgMCk7Ci0JZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCB8Ci0JCQlTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCBkZXN0WCA9IC1oU2VsZWN0aW9uIC0gb3JpZ2luLng7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCWNhbnZhcy5zY3JvbGwgKGRlc3RYLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyICgpOwotCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IGRlc3RZID0gLXZTZWxlY3Rpb24gLSBvcmlnaW4ueTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJY2FudmFzLnNjcm9sbCAoMCwgZGVzdFksIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQlvcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQl9Ci0JfSk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChyZWN0LndpZHRoKTsKLQkJCXZCYXIuc2V0TWF4aW11bSAocmVjdC5oZWlnaHQpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3Qud2lkdGgsIGNsaWVudC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3QuaGVpZ2h0LCBjbGllbnQuaGVpZ2h0KSk7Ci0JCQlpbnQgaFBhZ2UgPSByZWN0LndpZHRoIC0gY2xpZW50LndpZHRoOwotCQkJaW50IHZQYWdlID0gcmVjdC5oZWlnaHQgLSBjbGllbnQuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlvcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQkJaWYgKHZTZWxlY3Rpb24gPj0gdlBhZ2UpIHsKLQkJCQlpZiAodlBhZ2UgPD0gMCkgdlNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJCX0KLQkJCWNhbnZhcy5yZWRyYXcgKCk7Ci0JCX0KLQl9KTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIG9yaWdpbi54LCBvcmlnaW4ueSk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWludCBtYXJnaW5XaWR0aCA9IGNsaWVudC53aWR0aCAtIHJlY3Qud2lkdGg7Ci0JCQlpZiAobWFyZ2luV2lkdGggPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdC53aWR0aCwgMCwgbWFyZ2luV2lkdGgsIGNsaWVudC5oZWlnaHQpOwotCQkJfQotCQkJaW50IG1hcmdpbkhlaWdodCA9IGNsaWVudC5oZWlnaHQgLSByZWN0LmhlaWdodDsKLQkJCWlmIChtYXJnaW5IZWlnaHQgPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoMCwgcmVjdC5oZWlnaHQsIGNsaWVudC53aWR0aCwgbWFyZ2luSGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMTUwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlvcmlnaW5hbEltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZhMTI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKHdyYXAgb24gcmVzaXplKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULldSQVApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUgKHJlY3Qud2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJCXRvb2xCYXIuc2V0U2l6ZSAoc2l6ZSk7Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWE5NzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY3JvbGxlZENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNvbnRyb2wgaW4gYSBzY3JvbGxlZCBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIAotewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBpcyBhbHdheXMgNDAwIHggNDAwLiBTY3JvbGxiYXJzIGFwcGVhciBpZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUKLSAgICAvLyB0b28gc21hbGwgdG8gc2hvdyBwYXJ0IG9mIHRoZSBidXR0b24KLSAgICBTY3JvbGxlZENvbXBvc2l0ZSBjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgQnV0dG9uIGIxID0gbmV3IEJ1dHRvbihjMSwgU1dULlBVU0gpOwotICAgIGIxLnNldFRleHQoImZpeGVkIHNpemUgYnV0dG9uIik7Ci0gICAgYjEuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0gICAgYzEuc2V0Q29udGVudChiMSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBoYXMgYSBtaW5pbXVtIHNpemUgb2YgNDAwIHggNDAwLiBJZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUgYmlnCi0gICAgLy8gZW5vdWdoIHRvIHNob3cgbW9yZSB0aGFuIDQwMCB4IDQwMCwgdGhlIGJ1dHRvbiB3aWxsIGdyb3cgaW4gc2l6ZS4gSWYgdGhlIHdpbmRvdwotICAgIC8vIGlzIG1hZGUgdG9vIHNtYWxsIHRvIHNob3cgNDAwIHggNDAwLCBzY3JvbGxiYXJzIHdpbGwgYXBwZWFyLgotICAgIFNjcm9sbGVkQ29tcG9zaXRlIGMyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBCdXR0b24gYjIgPSBuZXcgQnV0dG9uKGMyLCBTV1QuUFVTSCk7Ci0gICAgYjIuc2V0VGV4dCgiZXhwYW5kaW5nIGJ1dHRvbiIpOwotICAgIGMyLnNldENvbnRlbnQoYjIpOwotICAgIGMyLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgYzIuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0gICAgYzIuc2V0TWluV2lkdGgoNDAwKTsKLSAgICBjMi5zZXRNaW5IZWlnaHQoNDAwKTsKLQotICAgIHNoZWxsLnNldFNpemUoNjAwLCAzMDApOwotICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2ZDI5OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBkaWFsb2cgc2hlbGwKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiU2hlbGwiKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsKTsKLQlkaWFsb2cuc2V0VGV4dCAoIkRpYWxvZyIpOwotCWRpYWxvZy5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFiZDc0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGEgdGFibGUgKHNldCB0aGUgdG9wIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRUb3BJbmRleCAoOTUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDI0NjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzZWxlY3QgYW4gaW5kZXggKHNlbGVjdCBhbmQgc2Nyb2xsKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTZWxlY3Rpb24gKDk1KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNhZTQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHJlbW92ZSBzZWxlY3RlZCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCXRhYmxlLnNldE1lbnUgKG1lbnUpOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJEZWxldGUgU2VsZWN0aW9uIik7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQl0YWJsZS5yZW1vdmUgKHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMgKCkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYjNhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2FzaCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNhc2ggKGFsbG93IGl0IHRvIGJlIG1vdmVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WRVJUSUNBTCk7Ci0Jc2FzaC5zZXRCb3VuZHMgKDEwLCAxMCwgMzIsIDEwMCk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXNhc2guc2V0Qm91bmRzIChlLngsIGUueSwgZS53aWR0aCwgZS5oZWlnaHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlzYXNoLnNldEZvY3VzICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YTgzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBhIHRleHQgY29udHJvbCAoc2hvdyBhYm91dCAxMCBjaGFyYWN0ZXJzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JaW50IGNvbHVtbnMgPSAxMDsKLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQlpbnQgd2lkdGggPSBjb2x1bW5zICogZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCAoKTsKLQlpbnQgaGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0ICgpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JdGV4dC5zZXRTaXplICh0ZXh0LmNvbXB1dGVTaXplICh3aWR0aCwgaGVpZ2h0KSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlYWJiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmVzc0JhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHByb2dyZXNzIGJhciAoZnJvbSBhbm90aGVyIHRocmVhZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIFNXVC5TTU9PVEgpOwotCQliYXIuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAzMik7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJZmluYWwgaW50IG1heGltdW0gPSBiYXIuZ2V0TWF4aW11bSgpOwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07IGlbMF0gPD0gbWF4aW11bTsgaVswXSsrKSB7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAgKDEwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7fQotCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGJhci5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQkJCQkJYmFyLnNldFNlbGVjdGlvbihpWzBdKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Mjk1ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3Jlc3NCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgKGZyb20gdGhlIFVJIHRocmVhZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIgKHNoZWxsLCBTV1QuU01PT1RIKTsKLQliYXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZm9yIChpbnQgaT0wOyBpPD1iYXIuZ2V0TWF4aW11bSAoKTsgaSsrKSB7Ci0JCXRyeSB7VGhyZWFkLnNsZWVwICgxMDApO30gY2F0Y2ggKFRocm93YWJsZSB0aCkge30KLQkJYmFyLnNldFNlbGVjdGlvbiAoaSk7Ci0JfQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxNDQxNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBjb21ibyBib3ggaW4gYSB0b29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlUb29sSXRlbSBzZXAgPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlNFUEFSQVRPUik7Ci0JaW50IHN0YXJ0ID0gYmFyLmdldEl0ZW1Db3VudCAoKTsKLQlmb3IgKGludCBpPXN0YXJ0OyBpPHN0YXJ0KzQ7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKGJhciwgU1dULlJFQURfT05MWSk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQljb21iby5hZGQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JY29tYm8ucGFjayAoKTsKLQlzZXAuc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0Jc2VwLnNldENvbnRyb2wgKGNvbWJvKTsKLQliYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhkYWNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpc3QgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIGxpc3QKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBMaXN0IGxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgbGlzdC5hZGQgKCJJdGVtICIgKyBpKTsKLQlsaXN0LnNldEJvdW5kcyAoMCwgMCwgMTAwLCAxMDApOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlpbnQgW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JbGlzdC5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlpbnQgW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzMyNDc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGluc2VydCB3aWRnZXRzIGludG8gYSBncmlkIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGZpbmFsIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgYy5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICAgICAgYi5zZXRUZXh0KCJCdXR0b24gIitpKTsKLSAgICB9Ci0KLSAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICBiLnNldFRleHQoImFkZCBhIG5ldyBidXR0b24gYXQgcm93IDIgY29sdW1uIDEiKTsKLSAgICBmaW5hbCBpbnRbXSBpbmRleCA9IG5ldyBpbnRbMV07Ci0gICAgYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIEJ1dHRvbiBzID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBzLnNldFRleHQoIlNwZWNpYWwgIitpbmRleFswXSk7Ci0gICAgICAgICAgICBpbmRleFswXSsrOwotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gYy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgcy5tb3ZlQWJvdmUoY2hpbGRyZW5bM10pOwotICAgICAgICAgICAgc2hlbGwubGF5b3V0KG5ldyBDb250cm9sW10ge3N9KTsKLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgc2hlbGwub3BlbiAoKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmJjZTEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdHdvIG9uZSBzaG90IHRpbWVycyAoNTAwMCBtcywgMjAwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoNTAwMCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIjUwMDAiKTsKLQkJfQotCX0pOwotCWRpc3BsYXkudGltZXJFeGVjICgyMDAwLCBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiMjAwMCIpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk1ZTZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0wID0gbmV3IFRyZWVJdGVtICh0cmVlLCAwKTsKLQkJaXRlbTAuc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQlmb3IgKGludCBqPTA7IGo8NDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSAoaXRlbTAsIDApOwotCQkJaXRlbTEuc2V0VGV4dCAoIlN1Ykl0ZW0gIiArIGkgKyAiICIgKyBqKTsKLQkJCWZvciAoaW50IGs9MDsgazw0OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbSAoaXRlbTEsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKCJTdWJJdGVtICIgKyBpICsgIiAiICsgaiArICIgIiArIGspOwotCQkJfQkKLQkJfQotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVHJlZUl0ZW0gW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFeHBhbmQ9eyIgKyBlLml0ZW0gKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkNvbGxhcHNlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ29sbGFwc2U9eyIgKyBlLml0ZW0gKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5nZXRJdGVtcyAoKSBbMF0uc2V0RXhwYW5kZWQgKHRydWUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjk2NzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBtb3VzZSBzdGF0ZSBhbmQgYnV0dG9uIChkb3duLCBtb3ZlLCB1cCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYyIHsKLQotc3RhdGljIFN0cmluZyBzdGF0ZU1hc2sgKGludCBzdGF0ZU1hc2spIHsKLQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMCkgc3RyaW5nICs9ICIgQ1RSTCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwKSBzdHJpbmcgKz0gIiBBTFQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSBzdHJpbmcgKz0gIiBTSElGVCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ09NTUFORCkgIT0gMCkgc3RyaW5nICs9ICIgQ09NTUFORCI7Ci0JcmV0dXJuIHN0cmluZzsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiVW5rbm93biI7Ci0JCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjogc3RyaW5nID0gIkRPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6IHN0cmluZyA9ICJNT1ZFIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDogc3RyaW5nID0gIlVQIjsgYnJlYWs7Ci0JCQl9Ci0JCQlzdHJpbmcgKz0iOiBidXR0b246ICIgKyBlLmJ1dHRvbiArICIsICI7Ci0JCQlzdHJpbmcgKz0gInN0YXRlTWFzaz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLnN0YXRlTWFzaykgKyBzdGF0ZU1hc2sgKGUuc3RhdGVNYXNrKSArICIsIHg9IiArIGUueCArICIsIHk9IiArIGUueTsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMSI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjIpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjIiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04zKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04zIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9ONCkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9ONCI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjUpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjUiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHJpbmcpOwotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZTFhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbCAocHJvbXB0IGZvciBhIHZhbHVlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZmluYWwgYm9vbGVhbiBbXSByZXN1bHQgPSBuZXcgYm9vbGVhbiBbMV07Ci0JZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlkaWFsb2cuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlmaW5hbCBCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQlvay5zZXRUZXh0ICgiT0siKTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JY2FuY2VsLnNldFRleHQgKCJDYW5jZWwiKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9bmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlyZXN1bHQgWzBdID0gZXZlbnQud2lkZ2V0ID09IG9rOwotCQkJZGlhbG9nLmNsb3NlICgpOwotCQl9Ci0JfTsKLQlvay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCWNhbmNlbC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCWRpYWxvZy5wYWNrICgpOwotCWRpYWxvZy5vcGVuICgpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlByb21wdCAuLi4iKTsKLQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlJlc3VsdDogIiArIHJlc3VsdCBbMF0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4ZGIxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldEJvdW5kcyAoMCwgMCwgMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVGFibGVJdGVtIFtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRhYmxlSXRlbSBbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRlZmF1bHRTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNTUyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNpbXBsZSBkaWFsb2cgdXNpbmcgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuV1JBUCk7Ci0JbGFiZWwuc2V0VGV4dCAoIlRoaXMgaXMgYSBsb25nIHRleHQgc3RyaW5nIHRoYXQgd2lsbCB3cmFwIHdoZW4gdGhlIGRpYWxvZyBpcyByZXNpemVkLiIpOwotCUxpc3QgbGlzdCA9IG5ldyBMaXN0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JbGlzdC5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7Ikl0ZW0gMSIsICJJdGVtIDIifSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIk9LIik7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkNhbmNlbCIpOwotCQotCWZpbmFsIGludCBpbnNldFggPSA0LCBpbnNldFkgPSA0OwotCUZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSBpbnNldFg7Ci0JZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSBpbnNldFk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQkKLQlQb2ludCBzaXplID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JZmluYWwgRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhIChzaXplLngsIFNXVC5ERUZBVUxUKTsKLQlsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxhYmVsLnNldExheW91dERhdGEgKGxhYmVsRGF0YSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlsYWJlbERhdGEud2lkdGggPSByZWN0LndpZHRoIC0gaW5zZXRYICogMjsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCQkKLQlGb3JtRGF0YSBidXR0b24yRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24yRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtaW5zZXRYKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMURhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFgpOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQkKLQlGb3JtRGF0YSBsaXN0RGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsaXN0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlsaXN0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsaXN0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCBpbnNldFkpOwotCWxpc3REYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoYnV0dG9uMiwgLWluc2V0WSk7Ci0JbGlzdC5zZXRMYXlvdXREYXRhIChsaXN0RGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyOGY4Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCBhIHNpbXBsZSBzY3JpYmJsZSBwcm9ncmFtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlpbnQgbGFzdFggPSAwLCBsYXN0WSA9IDA7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSA9PSAwKSBicmVhazsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQkJCQkJZ2MuZHJhd0xpbmUgKGxhc3RYLCBsYXN0WSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlsYXN0WCA9IGV2ZW50Lng7Ci0JCQkJCWxhc3RZID0gZXZlbnQueTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNGU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBkcm9wIGRvd24gbWVudSBpbiBhIHRvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCWZpbmFsIFRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChyZWN0LngsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTsKLQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5IChwdCk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCW1lbnUuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1MmIxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgYSByZXBlYXRpbmcgdGltZXIgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIlN0b3AgVGltZXIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JZmluYWwgUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJaWYgKGxhYmVsLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCUNvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZCAoKS5lcXVhbHMgKHJlZCkgPyBibHVlIDogcmVkOwotCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCQkJZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRoaXMpOwotCQl9Ci0JfTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGltZXIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAoLTEsIHRpbWVyKTsKLQkJfQotCX0pOwotCWJ1dHRvbi5wYWNrICgpOwotCWxhYmVsLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhIChidXR0b24uZ2V0U2l6ZSAoKSkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YmY5OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNlbnRlciBhIGxhYmVsIGFuZCBzaW5nbGUgbGluZSB0ZXh0IHVzaW5nIGEgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSB8IFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQgKCJOYW1lIik7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0KLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQotCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzICgpOwotCWludCBjaGFyV2lkdGggPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCWludCB3aWR0aCA9IHRleHQuY29tcHV0ZVNpemUgKGNoYXJXaWR0aCAqIDgsIFNXVC5ERUZBVUxUKS54OwotCWdjLmRpc3Bvc2UgKCk7Ci0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSAod2lkdGgsIFNXVC5ERUZBVUxUKTsKLQl0ZXh0LnNldExheW91dERhdGEgKGRhdGEpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgzNjNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRhYmxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJZm9yIChpbnQgaT0wOyBpPDIwMDAwOyBpKyspIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCWZpbmFsIGludCBbXSBpbmRleCA9IG5ldyBpbnQgW10ge2l9OwotCQkJCWRpc3BsYXkuc3luY0V4ZWMgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJaXRlbS5zZXRUZXh0ICgiVGFibGUgSXRlbSAiICsgaW5kZXggWzBdKTsKLQkJCQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc3RhcnQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjMjc3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbiBpY29uIChpbiBtZW1vcnkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAocmVkKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSAoKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhICgKLQkJbmV3IFJHQiBbXSB7Ci0JCQluZXcgUkdCICgwLCAwLCAwKSwKLQkJCW5ldyBSR0IgKDB4RkYsIDB4RkYsIDB4RkYpLAotCQl9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCUltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQlnYyA9IG5ldyBHQyAobWFzayk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUgKDUsIDUsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQltYXNrRGF0YSA9IG1hc2suZ2V0SW1hZ2VEYXRhICgpOwotCQotCUltYWdlIGljb24gPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlRGF0YSwgbWFza0RhdGEpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UgKGljb24pOwotCWJ1dHRvbi5zZXRTaXplICg2MCwgNjApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWljb24uZGlzcG9zZSAoKTsKLQlpbWFnZS5kaXNwb3NlICgpOwotCW1hc2suZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwZDRmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2ltcGxlIE9LL0NBTkNFTCBkaWFsb2cgdXNpbmcgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJFeGl0IHRoZSBhcHBsaWNhdGlvbj8iKTsKLQlCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQlva0J1dHRvbi5zZXRUZXh0ICgiJk9LIik7Ci0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0ICgiJkNhbmNlbCIpOwotCQotCUZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm0ubWFyZ2luV2lkdGggPSBmb3JtLm1hcmdpbkhlaWdodCA9IDg7Ci0JZGlhbG9nLnNldExheW91dCAoZm9ybSk7Ci0JRm9ybURhdGEgb2tEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCW9rRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA4KTsKLQlva0J1dHRvbi5zZXRMYXlvdXREYXRhIChva0RhdGEpOwotCUZvcm1EYXRhIGNhbmNlbERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JY2FuY2VsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgOCk7Ci0JY2FuY2VsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKG9rQnV0dG9uLCAwLCBTV1QuVE9QKTsKLQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YSAoY2FuY2VsRGF0YSk7Ci0JCi0JZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rQnV0dG9uKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmM4OWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsZURpYWxvZyBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBmaWxlIG5hbWUgKHRvIHNhdmUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULlNBVkUpOwotCWRpYWxvZy5zZXRGaWx0ZXJOYW1lcyAobmV3IFN0cmluZyBbXSB7IkJhdGNoIEZpbGVzIiwgIkFsbCBGaWxlcyAoKi4qKSJ9KTsKLQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAobmV3IFN0cmluZyBbXSB7IiouYmF0IiwgIiouKiJ9KTsgLy9XaW5kb3dzIHdpbGQgY2FyZHMKLQlkaWFsb2cuc2V0RmlsdGVyUGF0aCAoImM6XFwiKTsgLy9XaW5kb3dzIHBhdGgKLQlkaWFsb2cuc2V0RmlsZU5hbWUgKCJmcmVkLmJhdCIpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNhdmUgdG86ICIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ4NTVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUgbWVudSBpdGVtcyBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW0uZ2V0VGV4dCAoKSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG1lbnVJdGVtcyBbaV0uZ2V0VGV4dCAoKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleDx0cmVlSXRlbXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0cmVlSXRlbXMgW2luZGV4XS5nZXRUZXh0ICgpLmVxdWFscyAodGV4dCkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQltZW51SXRlbXMgW2ldLnNldEVuYWJsZWQgKGluZGV4ICE9IHRyZWVJdGVtcy5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQljYXJldC5zZXRCb3VuZHMgKDEwLCAxMCwgMiwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3OWNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHRhYiB0cmF2ZXJzYWwgb3JkZXIgb2YgY2hpbGRyZW4KLSAqIEluIHRoaXMgZXhhbXBsZSwgY29tcG9zaXRlMSAoaS5lLiBjMSkgdGFiIG9yZGVyIGlzIHNldCB0bzogQjIsIEIxLCBCMywgYW5kCi0gKiBzaGVsbCB0YWIgb3JkZXIgaXMgc2V0IHRvOiBjMSwgQjcsIHRvb2xCYXIxLCAoYzQ6IG5vIGZvY3VzYWJsZSBjaGlsZHJlbiksIGMyLCBMMgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCQotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjEuc2V0VGV4dCAoIkImMSIpOwotCUJ1dHRvbiByMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIxLnNldFRleHQgKCJSMSIpOwotCUJ1dHRvbiByMiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIyLnNldFRleHQgKCJSJjIiKTsKLQlCdXR0b24gcjMgPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQlyMy5zZXRUZXh0ICgiUjMiKTsKLQlCdXR0b24gYjIgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIyLnNldFRleHQgKCJCMiIpOwotCUxpc3QgbDEgPSBuZXcgTGlzdCAoYzEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwxIn0pOwotCUJ1dHRvbiBiMyA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjMuc2V0VGV4dCAoIkImMyIpOwotCUJ1dHRvbiBiNCA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjQuc2V0VGV4dCAoIkImNCIpOwotCQotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiNSA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjUuc2V0VGV4dCAoIkImNSIpOwotCUJ1dHRvbiBiNiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjYuc2V0VGV4dCAoIkImNiIpOwotCQotCUxpc3QgbDIgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwyIn0pOwotCQotCVRvb2xCYXIgdGIxID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCVRvb2xJdGVtIGkxID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5SQURJTyk7Ci0JaTEuc2V0VGV4dCAoIkkxIik7Ci0JVG9vbEl0ZW0gaTIgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMi5zZXRUZXh0ICgiSTIiKTsKLQlDb21ibyBjb21ibzEgPSBuZXcgQ29tYm8gKHRiMSwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCWNvbWJvMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkMxIn0pOwotCWNvbWJvMS5zZXRUZXh0ICgiQzEiKTsKLQljb21ibzEucGFjayAoKTsKLQlUb29sSXRlbSBpMyA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuU0VQQVJBVE9SKTsKLQlpMy5zZXRXaWR0aCAoY29tYm8xLmdldFNpemUgKCkueCk7Ci0JaTMuc2V0Q29udHJvbCAoY29tYm8xKTsKLQlUb29sSXRlbSBpNCA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUFVTSCk7Ci0JaTQuc2V0VGV4dCAoIkkmNCIpOwotCVRvb2xJdGVtIGk1ID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5DSEVDSyk7Ci0JaTUuc2V0VGV4dCAoIkk1Iik7Ci0JCi0JQnV0dG9uIGI3ID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliNy5zZXRUZXh0ICgiQiY3Iik7Ci0JCi0JQ29tcG9zaXRlIGM0ID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUNvbXBvc2l0ZSBjNSA9IG5ldyBDb21wb3NpdGUgKGM0LCBTV1QuQk9SREVSKTsKLQljNS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IExhYmVsKGM1LCBTV1QuTk9ORSkuc2V0VGV4dCgiTm8iKTsKLQljNS5wYWNrKCk7Ci0KLQlDb250cm9sIFtdIHRhYkxpc3QxID0gbmV3IENvbnRyb2wgW10ge2IyLCBiMSwgYjN9OwotCWMxLnNldFRhYkxpc3QgKHRhYkxpc3QxKTsKLQlDb250cm9sIFtdIHRhYkxpc3QyID0gbmV3IENvbnRyb2wgW10ge2MxLCBiNywgdGIxLCBjNCwgYzIsIGwyfTsKLQlzaGVsbC5zZXRUYWJMaXN0ICh0YWJMaXN0Mik7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3ODNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYiBmb2xkZXIgKHNpeCBwYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJUYWJJdGVtICIgKyBpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYkZvbGRlciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlBhZ2UgIiArIGkpOwotCQlpdGVtLnNldENvbnRyb2wgKGJ1dHRvbik7Ci0JfQotCXRhYkZvbGRlci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjI3NmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgY29sdW1ucyBhcyB0YWJsZSByZXNpemVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gMCIgKyBpLCAiaXRlbSAxIitpfSk7Ci0JfQotCWNvbXAuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBhcmVhID0gY29tcC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVNjcm9sbEJhciB2QmFyID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSB0YWJsZS5jb21wdXRlVHJpbSgwLDAsMCwwKS53aWR0aCAtIHZCYXIuZ2V0U2l6ZSgpLng7Ci0JCQlpZiAoc2l6ZS55ID4gYXJlYS5oZWlnaHQgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSkgewotCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCVBvaW50IHZCYXJTaXplID0gdkJhci5nZXRTaXplKCk7Ci0JCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCX0KLQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zIAotCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGgvMyk7Ci0JCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAtIGNvbHVtbjEuZ2V0V2lkdGgoKSk7Ci0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlIAotCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aC8zKTsKLQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC0gY29sdW1uMS5nZXRXaWR0aCgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWRhOTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgdGV4dCBiZXR3ZWVuIHR3byBsYWJlbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCAoIlRFWFQiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzZXREcmFnRHJvcCAobGFiZWwxKTsKLQlzZXREcmFnRHJvcCAobGFiZWwyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIHNldERyYWdEcm9wIChmaW5hbCBMYWJlbCBsYWJlbCkgewotCQotCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIodHlwZXMpOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kb2l0ID0gKGxhYmVsLmdldFRleHQgKCkubGVuZ3RoICgpICE9IDApOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSBsYWJlbC5nZXRUZXh0ICgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlsYWJlbC5zZXRUZXh0ICgiIik7Ci0JCX0KLQl9KTsKLQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQobGFiZWwsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbGFiZWwuc2V0VGV4dCAoKFN0cmluZykgZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWQzNWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgbXkgb3duIGRhdGEgdHJhbnNmZXIgdHlwZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3OSB7Ci0KLS8qIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZSBNeVR5cGUgaXMgZGVmaW5lIGFzOiAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJuYW1lX2Zvcl9teV90eXBlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUgKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIgKCk7Ci0KLXB1YmxpYyBzdGF0aWMgTXlUcmFuc2ZlciBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCX0KLQlNeVR5cGUgW10gbXlUeXBlcyA9IChNeVR5cGUgW10pIG9iamVjdDsKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtICgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0gKG91dCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBteVR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIFtdIGJ1ZmZlciA9IG15VHlwZXMgW2ldLmZpbGVOYW1lLmdldEJ5dGVzICgpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQgKGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUgKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcgKG15VHlwZXMgW2ldLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nIChteVR5cGVzIFtpXS5sYXN0TW9kaWZpZWQpOwotCQl9Ci0JCWJ5dGUgW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5ICgpOwotCQl3cml0ZU91dC5jbG9zZSAoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlIChidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotfQotCi1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YSAoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmIChpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJYnl0ZSBbXSBidWZmZXIgPSAoYnl0ZSBbXSkgc3VwZXIubmF0aXZlVG9KYXZhICh0cmFuc2ZlckRhdGEpOwotCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCi0JCU15VHlwZSBbXSBteURhdGEgPSBuZXcgTXlUeXBlIFswXTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtIChidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0gKGluKTsKLQkJCXdoaWxlIChyZWFkSW4uYXZhaWxhYmxlICgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlICgpOwotCQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQgKCk7Ci0JCQkJYnl0ZSBbXSBuYW1lID0gbmV3IGJ5dGUgW3NpemVdOwotCQkJCXJlYWRJbi5yZWFkIChuYW1lKTsKLQkJCQlkYXR1bS5maWxlTmFtZSA9IG5ldyBTdHJpbmcgKG5hbWUpOwotCQkJCWRhdHVtLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcgKCk7Ci0JCQkJZGF0dW0ubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nICgpOwotCQkJCU15VHlwZSBbXSBuZXdNeURhdGEgPSBuZXcgTXlUeXBlIFtteURhdGEubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSAobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YSBbbXlEYXRhLmxlbmd0aF0gPSBkYXR1bTsKLQkJCQlteURhdGEgPSBuZXdNeURhdGE7Ci0JCQl9Ci0JCQlyZWFkSW4uY2xvc2UgKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbXlEYXRhOwotCX0KLQotCXJldHVybiBudWxsOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIFtdIGdldFR5cGVOYW1lcyAoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcgW10ge01ZVFlQRU5BTUV9OwotfQotCi1wcm90ZWN0ZWQgaW50IFtdIGdldFR5cGVJZHMgKCkgewotCXJldHVybiBuZXcgaW50IFtdIHtNWVRZUEVJRH07Ci19Ci0KLWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCAKLQkJIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgCi0JCSgoTXlUeXBlW10pb2JqZWN0KS5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pb2JqZWN0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAobXlUeXBlc1tpXSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQgKCJEcmFnIFNvdXJjZSBmb3IgTXlEYXRhW10iKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMi5zZXRUZXh0ICgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YVtdIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCXNvdXJjZS5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJTXlUeXBlIG15VHlwZTEgPSBuZXcgTXlUeXBlICgpOwotCQkJbXlUeXBlMS5maWxlTmFtZSA9ICJDOlxcYWJjLnR4dCI7Ci0JCQlteVR5cGUxLmZpbGVMZW5ndGggPSAxMDAwOwotCQkJbXlUeXBlMS5sYXN0TW9kaWZpZWQgPSAxMjMxMjMxMzsKLQkJCU15VHlwZSBteVR5cGUyID0gbmV3IE15VHlwZSAoKTsKLQkJCW15VHlwZTIuZmlsZU5hbWUgPSAiQzpcXHh5ei50eHQiOwotCQkJbXlUeXBlMi5maWxlTGVuZ3RoID0gNTAwOwotCQkJbXlUeXBlMi5sYXN0TW9kaWZpZWQgPSAxMjMxMjMyMzsKLQkJCWV2ZW50LmRhdGEgPSBuZXcgTXlUeXBlIFtdIHtteVR5cGUxLCBteVR5cGUyfTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQgKGxhYmVsMiwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldC5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlIFtdIG15VHlwZXMgPSAoTXlUeXBlIFtdKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGVzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0cmluZyArPSBteVR5cGVzIFtpXS5maWxlTmFtZSArICIgIjsKLQkJCQkJfQotCQkJCQlsYWJlbDIuc2V0VGV4dCAoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTJiNzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyZWUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZpbGUgW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cyAoKTsKLQlmb3IgKGludCBpPTA7IGk8cm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gcm9vdCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCXJvb3Quc2V0VGV4dCAocm9vdHMgW2ldLnRvU3RyaW5nICgpKTsKLQkJcm9vdC5zZXREYXRhIChyb290cyBbaV0pOwotCQluZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIHJvb3QgPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlUcmVlSXRlbSBbXSBpdGVtcyA9IHJvb3QuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXREYXRhICgpICE9IG51bGwpIHJldHVybjsKLQkJCQlpdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IChGaWxlKSByb290LmdldERhdGEgKCk7Ci0JCQlGaWxlIFtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMgKCk7Ci0JCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJZm9yIChpbnQgaT0gMDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoZmlsZXMgW2ldLmdldE5hbWUgKCkpOwotCQkJCWl0ZW0uc2V0RGF0YSAoZmlsZXMgW2ldKTsKLQkJCQlpZiAoZmlsZXMgW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbmV3IFRyZWVJdGVtIChpdGVtLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlQb2ludCBzaXplID0gdHJlZS5jb21wdXRlU2l6ZSAoMzAwLCBTV1QuREVGQVVMVCk7Ci0JaW50IHdpZHRoID0gTWF0aC5tYXggKDMwMCwgc2l6ZS54KTsKLQlpbnQgaGVpZ2h0ID0gTWF0aC5tYXggKDMwMCwgc2l6ZS55KTsKLQlzaGVsbC5zZXRTaXplIChzaGVsbC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDU1ODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGxpbWl0IHNlbGVjdGlvbiB0byBpdGVtcyB0aGF0IG1hdGNoIGEgcGF0dGVybgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMjsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBrKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlUcmVlSXRlbVtdIHJldmlzZWRTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bMF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ZXh0ID0gc2VsZWN0aW9uW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCIxIikgPiAwKSB7Ci0JCQkJCVRyZWVJdGVtW10gbmV3U2VsZWN0aW9uID0gbmV3IFRyZWVJdGVtW3JldmlzZWRTZWxlY3Rpb24ubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocmV2aXNlZFNlbGVjdGlvbiwgMCwgbmV3U2VsZWN0aW9uLCAwLCByZXZpc2VkU2VsZWN0aW9uLmxlbmd0aCk7Ci0JCQkJCW5ld1NlbGVjdGlvbltyZXZpc2VkU2VsZWN0aW9uLmxlbmd0aF0gPSBzZWxlY3Rpb25baV07Ci0JCQkJCXJldmlzZWRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQkJdHJlZS5zZXRTZWxlY3Rpb24ocmV2aXNlZFNlbGVjdGlvbik7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1N2VkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGJyb3dzZSB0aGUgdHlwZWxpYmluZm8gZm9yIGEgcHJvZ3JhbSBpZCAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBNYWluIDxwcm9ncmFtIGlkPiIpOwotCQlyZXR1cm47Ci0JfQotCi0JU3RyaW5nIHByb2dJRCA9IGFyZ3NbMF07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JT2xlQ29udHJvbFNpdGUgc2l0ZSA9IG51bGw7Ci0JT2xlQXV0b21hdGlvbiBhdXRvID0gbnVsbDsKLQl0cnkgewotCQlzaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsJCi0JCWF1dG8gPSBuZXcgT2xlQXV0b21hdGlvbihzaXRlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiB0eXBlIGxpYnJhcnkgZm9yICIrcHJvZ0lEKTsKLQkJcmV0dXJuOwotCX0KLQkJCi0JcHJpbnRUeXBlSW5mbyhhdXRvKTsKLQkKLQlhdXRvLmRpc3Bvc2UoKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0KLX0KLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFR5cGVJbmZvKE9sZUF1dG9tYXRpb24gYXV0bykgewotCVRZUEVBVFRSIHR5cGVhdHRyID0gYXV0by5nZXRUeXBlSW5mb0F0dHJpYnV0ZXMoKTsKLQlpZiAodHlwZWF0dHIgIT0gbnVsbCkgewkJCi0JCWlmICh0eXBlYXR0ci5jRnVuY3MgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bmN0aW9ucyA6XG4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlYXR0ci5jRnVuY3M7IGkrKykgewkJCQotCQkJT2xlRnVuY3Rpb25EZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGkpOwotCQkJU3RyaW5nIGFyZ0xpc3QgPSAiIjsKLQkJCWludCBmaXJzdE9wdGlvbmFsQXJnSW5kZXggPSBkYXRhLmFyZ3MubGVuZ3RoIC0gZGF0YS5vcHRpb25hbEFyZ0NvdW50OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmFyZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQlhcmdMaXN0ICs9ICJbIjsKLQkJCQlpZiAoaiA+PSBmaXJzdE9wdGlvbmFsQXJnSW5kZXgpIGFyZ0xpc3QgKz0gIm9wdGlvbmFsLCAiOwotCQkJCWFyZ0xpc3QgKz0gZ2V0RGlyZWN0aW9uKGRhdGEuYXJnc1tqXS5mbGFncykrIl0gIitnZXRUeXBlTmFtZShkYXRhLmFyZ3Nbal0udHlwZSkrIiAiK2RhdGEuYXJnc1tqXS5uYW1lOwotCQkJCWlmICggaiA8IGRhdGEuYXJncy5sZW5ndGggLSAxKSBhcmdMaXN0ICs9ICIsICI7Ci0JCQl9CQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0SW52b2tlS2luZChkYXRhLmludm9rZUtpbmQpKyIgKGlkID0gIitkYXRhLmlkKyIpIDogIgotCQkJCQkgICAgICAgICsiXG5cdFNpZ25hdHVyZSAgIDogIitnZXRUeXBlTmFtZShkYXRhLnJldHVyblR5cGUpKyIgIitkYXRhLm5hbWUrIigiK2FyZ0xpc3QrIikiCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdERlc2NyaXB0aW9uIDogIitkYXRhLmRvY3VtZW50YXRpb24KLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0SGVscCBGaWxlICAgOiAiK2RhdGEuaGVscEZpbGUrIlxuIik7Ci0JCX0KLQkJCi0JCWlmICh0eXBlYXR0ci5jVmFycyA+IDApIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblZhcmlhYmxlcyAgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY1ZhcnM7IGkrKykgewotCQkJT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQUk9QRVJUWSAoaWQgPSAiK2RhdGEuaWQrIikgOiIKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0TmFtZSA6ICIrZGF0YS5uYW1lCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdFR5cGUgOiAiK2dldFR5cGVOYW1lKGRhdGEudHlwZSkrIlxuIik7Ci0JCX0KLQl9Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoaW50IHR5cGUpIHsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiI7Ci0JCWNhc2UgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCI7Ci0JCWNhc2UgT0xFLlZUX1I4IDogcmV0dXJuICJkb3VibGUiOwotCQljYXNlIE9MRS5WVF9JNCA6IHJldHVybiAiaW50IjsKLQkJY2FzZSBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCI7Ci0JCWNhc2UgT0xFLlZUX1VOS05PV04gOiByZXR1cm4gIklVbmtub3duIjsKLQkJY2FzZSBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0IjsKLQkJY2FzZSBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nIjsKLQkJY2FzZSBPTEUuVlRfVkFSSUFOVCA6IHJldHVybiAiVmFyaWFudCI7Ci0JCWNhc2UgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSI7Ci0JCWNhc2UgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUiOwotCQljYXNlIE9MRS5WVF9VSTEgOiByZXR1cm4gInVuc2lnbmVkIGNoYXIiOwotCQljYXNlIE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCI7Ci0JCWNhc2UgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCI7Ci0JCWNhc2UgT0xFLlZUX0hSRVNVTFQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX1ZPSUQgOiByZXR1cm4gInZvaWQiOwotCQkKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjQgOiByZXR1cm4gImZsb2F0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9JNCA6IHJldHVybiAiaW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9ESVNQQVRDSCA6IHJldHVybiAiSURpc3BhdGNoICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9CU1RSIDogcmV0dXJuICJTdHJpbmcgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfREFURSA6IHJldHVybiAiRGF0ZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVVNFUkRFRklORUQgOiByZXR1cm4gIlVzZXJEZWZpbmVkICoiOwotCX0KLQlyZXR1cm4gInVua25vd24gIisgdHlwZTsJCi19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCVN0cmluZyBkaXJTdHJpbmcgPSAiIjsKLQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GSU4pICE9IDApIHsKLQkJZGlyU3RyaW5nICs9ICJpbiI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GT1VUKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJvdXQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRkxDSUQpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOwotCQlkaXJTdHJpbmcgKz0gImxjaWQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRlJFVFZBTCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7IAotCQlkaXJTdHJpbmcgKz0gInJldHZhbCI7Ci0JfQotCQotCXJldHVybiBkaXJTdHJpbmc7Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW52b2tlS2luZChpbnQgaW52S2luZCkgewotCXN3aXRjaCAoaW52S2luZCkgewotCQljYXNlIE9MRS5JTlZPS0VfRlVOQyA6IHJldHVybiAiTUVUSE9EIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZR0VUIDogcmV0dXJuICJQUk9QRVJUWSBHRVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVQgOiByZXR1cm4gIlBST1BFUlRZIFBVVCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWVBVVFJFRiA6IHJldHVybiAiUFJPUEVSVFkgUFVUIEJZIFJFRiI7Ci0JfQotCXJldHVybiAidW5rbm93biAiK2ludktpbmQ7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ3MjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhbiBpdGVtIGZyb20gY2xvc2luZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JCXRleHQuc2V0VGV4dCgiQ29udGVudCBmb3IgSXRlbSAiK2kpOwotCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JfQotCQotCWZpbmFsIENUYWJJdGVtIHNwZWNpYWxJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkNMT1NFKTsKLQlzcGVjaWFsSXRlbS5zZXRUZXh0KCJEb24ndCBDbG9zZSBNZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIlRoaXMgdGFiIGNhbiBuZXZlciBiZSBjbG9zZWQiKTsKLQlzcGVjaWFsSXRlbS5zZXRDb250cm9sKHRleHQpOwotCQkKLQlmb2xkZXIuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lcihuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pdGVtLmVxdWFscyhzcGVjaWFsSXRlbSkpIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBDVGFiSXRlbSBub0Nsb3NlSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQlub0Nsb3NlSXRlbS5zZXRUZXh0KCJObyBDbG9zZSBCdXR0b24iKTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCXRleHQyLnNldFRleHQoIlRoaXMgdGFiIGRvZXMgbm90IGhhdmUgYSBjbG9zZSBidXR0b24iKTsKLQlub0Nsb3NlSXRlbS5zZXRDb250cm9sKHRleHQyKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY4ZmNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRldGVybWluZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODMgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQ4MyBfaW5zdGFuY2UgPSBuZXcgU25pcHBldDgzKCk7Ci1wcml2YXRlIGludFtdIGlkczsKLXByaXZhdGUgU3RyaW5nW10gbmFtZXM7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgY29udHJvbCA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb250cm9sLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KCJEcmFnIGRhdGEgb3ZlciB0aGlzIHNpdGUgdG8gc2VlIHRoZSBuYXRpdmUgdHJhbnNmZXIgdHlwZS4iKTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGNvbnRyb2wsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyB8IERORC5EUk9QX01PVkUpOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7U25pcHBldDgzLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQ4MyBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLVNuaXBwZXQ4MygpIHsKLQlpZHMgPSBuZXcgaW50WzgwMDAwXTsKLQluYW1lcyA9IG5ldyBTdHJpbmdbODAwMDBdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCWlkc1tpXSA9IGk7Ci0JCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewotCXJldHVybiAiSGVsbG8gV29ybGQiOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuYW1lczsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCl7Ci0JcmV0dXJuIGlkczsKLX0KLXN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21JZChpbnQgaWQpIHsKLQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JaW50IG1heFNpemUgPSAxMjg7Ci0JVENIQVIgYnVmZmVyID0gbmV3IFRDSEFSKDAsIG1heFNpemUpOwotCWludCBzaXplID0gQ09NLkdldENsaXBib2FyZEZvcm1hdE5hbWUoaWQsIGJ1ZmZlciwgbWF4U2l6ZSk7Ci0JaWYgKHNpemUgIT0gMCkgewotCQluYW1lID0gYnVmZmVyLnRvU3RyaW5nKDAsIHNpemUpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgQ09NLkNGX0hEUk9QOgotCQkJCW5hbWUgPSAiQ0ZfSERST1AiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVEVYVDoKLQkJCQluYW1lID0gIkNGX1RFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfQklUTUFQOgotCQkJCW5hbWUgPSAiQ0ZfQklUTUFQIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01FVEFGSUxFUElDVDoKLQkJCQluYW1lID0gIkNGX01FVEFGSUxFUElDVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9TWUxLOgotCQkJCW5hbWUgPSAiQ0ZfU1lMSyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9ESUY6Ci0JCQkJbmFtZSA9ICJDRl9ESUYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVElGRjoKLQkJCQluYW1lID0gIkNGX1RJRkYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfT0VNVEVYVDoKLQkJCQluYW1lID0gIkNGX09FTVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElCOgotCQkJCW5hbWUgPSAiQ0ZfRElCIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BBTEVUVEU6Ci0JCQkJbmFtZSA9ICJDRl9QQUxFVFRFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BFTkRBVEE6Ci0JCQkJbmFtZSA9ICJDRl9QRU5EQVRBIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1JJRkY6Ci0JCQkJbmFtZSA9ICJDRl9SSUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1dBVkU6Ci0JCQkJbmFtZSA9ICJDRl9XQVZFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1VOSUNPREVURVhUOgotCQkJCW5hbWUgPSAiQ0ZfVU5JQ09ERVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRU5ITUVUQUZJTEU6Ci0JCQkJbmFtZSA9ICJDRl9FTkhNRVRBRklMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9MT0NBTEU6Ci0JCQkJbmFtZSA9ICJDRl9MT0NBTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTUFYOgotCQkJCW5hbWUgPSAiQ0ZfTUFYIjsKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZmMTEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGEgZGVmYXVsdCBvcGVyYXRpb24gKGluIHRoaXMgZXhhbXBsZSwgQ29weSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gIlRleHQgVHJhbnNmZXJyZWQiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kb2l0KSB7Ci0JCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIERORC5EUk9QX01PVkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQkJb3BlcmF0aW9uID0gImNvcGllZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTk9ORToKLQkJCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlvcGVyYXRpb24gPSAidW5rbm93biI7IGJyZWFrOwotCQkJCX0KLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZGF0YSAiK29wZXJhdGlvbisiKSIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZHJhZyBjYW5jZWxsZWQpIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIkRyb3AgVGFyZ2V0Iik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0LCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9DT1BZOgotCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQlvcGVyYXRpb24gPSAibGlua2VkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCX0KLQkJCXRleHQuYXBwZW5kKCJcbiIrb3BlcmF0aW9uKyhTdHJpbmcpZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2QwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBTaGVsbCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlCi0JICogaS5lLiBmdWxsIHNjcmVlbiwgbm8gZGVjb3JhdGlvbiBvbiBQb2NrZXRQQy4KLQkgKi8KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCS8qIAotCSAqIFNldCBhIHRleHQgc28gdGhhdCB0aGUgdG9wIGxldmVsIFNoZWxsCi0JICogYWxzbyBhcHBlYXJzIGluIHRoZSBQb2NrZXRQQyB0YXNrIGxpc3QKLQkgKi8KLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0KLQkvKgotCSAqIFNldCBhIG1lbnViYXIgdG8gZm9sbG93IFVJIGd1aWRlbGluZXMKLQkgKiBvbiBQb2NrZXRQQwotCSAqLwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTkyNDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiAnT2snIGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULkNMT1NFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDA2ODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGF1dG9tYXRpY2FsbHkgYXMgU0lQIGlzIG9uIG9yIG9mZgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5SRVNJWkUpOwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCS8qIEFkZCBhIGJ1dHRvbiB0byBtYWtlIHRoZSByZXNpemUgbW9yZSB2aXN1YWwgKi8KLQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiTWFpbiIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNjBkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0YWJsZSBpdGVtIChpbiBwbGFjZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIgKyBpLCAiZWRpdCB0aGlzIHZhbHVlIn0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCS8vVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JLy8gZWRpdGluZyB0aGUgc2Vjb25kIGNvbHVtbgotCWZpbmFsIGludCBFRElUQUJMRUNPTFVNTiA9IDE7Ci0JCi0JdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJQ29udHJvbCBvbGRFZGl0b3IgPSBlZGl0b3IuZ2V0RWRpdG9yKCk7Ci0JCQlpZiAob2xkRWRpdG9yICE9IG51bGwpIG9sZEVkaXRvci5kaXNwb3NlKCk7Ci0JCi0JCQkvLyBJZGVudGlmeSB0aGUgc2VsZWN0ZWQgcm93Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJLy8gVGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHRoZSBlZGl0b3IgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBUYWJsZQotCQkJVGV4dCBuZXdFZGl0b3IgPSBuZXcgVGV4dCh0YWJsZSwgU1dULk5PTkUpOwotCQkJbmV3RWRpdG9yLnNldFRleHQoaXRlbS5nZXRUZXh0KEVESVRBQkxFQ09MVU1OKSk7Ci0JCQluZXdFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgbWUpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZWRpdG9yLmdldEVkaXRvcigpOwotCQkJCQllZGl0b3IuZ2V0SXRlbSgpLnNldFRleHQoRURJVEFCTEVDT0xVTU4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW5ld0VkaXRvci5zZWxlY3RBbGwoKTsKLQkJCW5ld0VkaXRvci5zZXRGb2N1cygpOwotCQkJZWRpdG9yLnNldEVkaXRvcihuZXdFZGl0b3IsIGl0ZW0sIEVESVRBQkxFQ09MVU1OKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjcyNWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbWVudSB3aXRoIHJhZGlvIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCQlpZiAoaXRlbS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtICsgIiBzZWxlY3RlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgdW5zZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1YmUyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNoaWxkIGNvbnRyb2wgYXV0b21hdGljYWxseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb21wb3NpdGUuc2V0U2l6ZSAoNzAwLCA2MDApOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyIChuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2Muc2V0QmFja2dyb3VuZCAocmVkKTsKLQkJCWUuZ2MuZmlsbE92YWwgKDUsIDUsIDY5MCwgNTkwKTsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciBoQmFyID0gc2hlbGwuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlsb2NhdGlvbi54ID0gLWhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhciA9IHNoZWxsLmdldFZlcnRpY2FsQmFyICgpOwotCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWxvY2F0aW9uLnkgPSAtdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IHNpemUgPSBjb21wb3NpdGUuZ2V0U2l6ZSAoKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWhCYXIuc2V0TWF4aW11bSAoc2l6ZS54KTsKLQkJCXZCYXIuc2V0TWF4aW11bSAoc2l6ZS55KTsKLQkJCWhCYXIuc2V0VGh1bWIgKE1hdGgubWluIChzaXplLngsIHJlY3Qud2lkdGgpKTsKLQkJCXZCYXIuc2V0VGh1bWIgKE1hdGgubWluIChzaXplLnksIHJlY3QuaGVpZ2h0KSk7Ci0JCQlpbnQgaFBhZ2UgPSBzaXplLnggLSByZWN0LndpZHRoOwotCQkJaW50IHZQYWdlID0gc2l6ZS55IC0gcmVjdC5oZWlnaHQ7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJaWYgKGhTZWxlY3Rpb24gPj0gaFBhZ2UpIHsKLQkJCQlpZiAoaFBhZ2UgPD0gMCkgaFNlbGVjdGlvbiA9IDA7Ci0JCQkJbG9jYXRpb24ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQkJaWYgKHZTZWxlY3Rpb24gPj0gdlBhZ2UpIHsKLQkJCQlpZiAodlBhZ2UgPD0gMCkgdlNlbGVjdGlvbiA9IDA7Ci0JCQkJbG9jYXRpb24ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmMTNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IG1vdXNlIGRvd24gaW4gYSB0cmVlIGl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlUcmVlSXRlbSBpdGVtID0gdHJlZS5nZXRJdGVtIChwb2ludCk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiTW91c2UgZG93bjogIiArIGl0ZW0pOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmOTUzNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkcmFnIGxlYWYgaXRlbXMgaW4gYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDM7IGsrKykgewotCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2orIiAiK2spOwotCQkJfQotCQl9Ci0JfQotCQotCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKHRyZWUsIG9wZXJhdGlvbnMpOwotCXNvdXJjZS5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JZmluYWwgVHJlZUl0ZW1bXSBkcmFnU291cmNlSXRlbSA9IG5ldyBUcmVlSXRlbVsxXTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwICYmIHNlbGVjdGlvblswXS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJZXZlbnQuZG9pdCA9IHRydWU7Ci0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0gPSBzZWxlY3Rpb25bMF07Ci0JCQl9IGVsc2UgewotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9IGRyYWdTb3VyY2VJdGVtWzBdLmdldFRleHQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpCi0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0uZGlzcG9zZSgpOwotCQkJCWRyYWdTb3VyY2VJdGVtWzBdID0gbnVsbDsKLQkJfQotCX0pOwotCi0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0cmVlLCBvcGVyYXRpb25zKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJaWYgKGV2ZW50Lml0ZW0gIT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCWlmIChldmVudC5pdGVtID09IG51bGwpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpdGVtc1tpXSA9PSBpdGVtKSB7Ci0JCQkJCQkJaW5kZXggPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSwgaW5kZXgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUsIGluZGV4KzEpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW1zW2ldID09IGl0ZW0pIHsKLQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaW5kZXgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpbmRleCsxKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCQotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5zZXRTaXplICg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNzEwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjdXJzb3IgZnJvbSBhIHNvdXJjZSBhbmQgYSBtYXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSArKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IDIwOyBqKyspIHsKLQkJCXNvdXJjZURhdGEuc2V0UGl4ZWwoaSwgaiwgMSk7Ci0JCX0KLQl9Ci0JCi0JLy9DcmVhdGUgYSBtYXNrIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCXBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkgKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0JCQltYXNrRGF0YS5zZXRQaXhlbChpLCBqLCAxKTsKLQkJfQotCX0KLQkvL0NyZWF0ZSBjdXJzb3IKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCBtYXNrRGF0YSwgMTAsIDEwKTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCS8vRHJhdyBzb3VyY2UgYW5kIG1hc2sganVzdCB0byBzaG93IHdoYXQgdGhleSBsb29rIGxpa2UKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5kcmF3U3RyaW5nKCJzb3VyY2U6ICIsIDEwLCAxMCk7Ci0JCQlnYy5kcmF3SW1hZ2Uoc291cmNlLCAwLCAwLCAyMCwgMjAsIDYwLCAxMCwgMjAsIDIwKTsKLQkJCWdjLmRyYXdTdHJpbmcoIm1hc2s6ICIsMTAsIDQwKTsKLQkJCWdjLmRyYXdJbWFnZShtYXNrLCAwLCAwLCAyMCwgMjAsIDYwLCA0MCwgMjAsIDIwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTcyOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBtZWFzdXJlIGEgc3RyaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGxhYmVsKTsKLQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudCAoIkhlbGxvIik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlsYWJlbC5zZXRUZXh0ICgiSGVsbG8gLT4gIiArIHNpemUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyNmUyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBjb3B5IGFuZCBwYXN0ZSBkYXRhIHdpdGggdGhlIGNsaXBib2FyZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENsaXBib2FyZCBjYiA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCi0JQnV0dG9uIGNvcHkgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JY29weS5zZXRUZXh0KCJDb3B5Iik7Ci0JY29weS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0RGF0YSA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJaWYgKHRleHREYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCVRleHRUcmFuc2ZlciB0ZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQljYi5zZXRDb250ZW50cyhuZXcgT2JqZWN0W117dGV4dERhdGF9LCBuZXcgVHJhbnNmZXJbXXt0ZXh0VHJhbnNmZXJ9KTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBwYXN0ZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlwYXN0ZS5zZXRUZXh0KCJQYXN0ZSIpOwotCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2IuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCXRleHQuaW5zZXJ0KGRhdGEpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwYXN0ZSwgMCwgU1dULkxFRlQpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JY29weS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIDUpOwotCXBhc3RlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHBhc3RlLCAtNSk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkYzEwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBjYXB0dXJlIGEgd2lkZ2V0IGltYWdlIHdpdGggYSBHQwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIldpZGdldCIpOwotCQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0iICsgaSk7Ci0JfQotCQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNhcHR1cmUiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTQwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgdGFibGVTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJR0MgZ2MgPSBuZXcgR0ModGFibGUpOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPQotCQkJCW5ldyBJbWFnZShkaXNwbGF5LCB0YWJsZVNpemUueCwgdGFibGVTaXplLnkpOwotCQkJZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCQkJZ2MuZGlzcG9zZSgpOwotCQkJCi0JCQlTaGVsbCBwb3B1cCA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JCQlwb3B1cC5zZXRUZXh0KCJJbWFnZSIpOwotCQkJcG9wdXAuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHBvcHVwLCBTV1QuTk9ORSk7Ci0JCQljYW52YXMuc2V0Qm91bmRzKDEwLCAxMCwgdGFibGVTaXplLngrMTAsIHRhYmxlU2l6ZS55KzEwKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAucGFjaygpOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmUyNDg1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IG5hdmlnYXRlIGEgdGFibGUgY2VsbHMgd2l0aCBhcnJvdyBrZXlzLiAKLSAqIEVkaXQgd2hlbiB1c2VyIGhpdHMgUmV0dXJuIGtleS4gIEV4aXQgZWRpdCBtb2RlIGJ5IGhpdHRpbmcgRXNjYXBlIChjYW5jZWxzIGVkaXQpCi0gKiBvciBSZXR1cm4gKGFwcGxpZXMgZWRpdCB0byB0YWJsZSkuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkvLyBjcmVhdGUgYSBhIHRhYmxlIHdpdGggMyBjb2x1bW5zIGFuZCBmaWxsIHdpdGggZGF0YQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiY2VsbCAiICsgaSArICIgMCIsIAkiY2VsbCAiICsgaSArICIgMSIsICJjZWxsICIgKyBpICsgIiAyIiB9KTsKLQl9Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JY29sdW1uMy5wYWNrKCk7Ci0KLQkvLyBjcmVhdGUgYSBUYWJsZUN1cnNvciB0byBuYXZpZ2F0ZSBhcm91bmQgdGhlIHRhYmxlCi0JZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JLy8gY3JlYXRlIGFuIGVkaXRvciB0byBlZGl0IHRoZSBjZWxsIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIAotCS8vIHdoaWxlIG92ZXIgYSBjZWxsIGluIHRoZSB0YWJsZQotCWZpbmFsIENvbnRyb2xFZGl0b3IgZWRpdG9yID0gbmV3IENvbnRyb2xFZGl0b3IoY3Vyc29yKTsKLQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCi0JY3Vyc29yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkvLyB3aGVuIHRoZSBUYWJsZUVkaXRvciBpcyBvdmVyIGEgY2VsbCwgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHJvdyBpbiAKLQkJLy8gdGhlIHRhYmxlCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBjdXJzb3IuZ2V0Um93KCl9KTsKLQkJfQotCQkvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQgZWRpdG9yIHNvIHRoYXQgCi0JCS8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY3Vyc29yLCBTV1QuTk9ORSk7Ci0JCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCXRleHQuc2V0VGV4dChyb3cuZ2V0VGV4dChjb2x1bW4pKTsKLQkJCXRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciBhbmQgY29weSB0aGUgZGF0YSBvdmVyIAotCQkJCQkvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCQkJCXJvdy5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIHRhYnMgYXdheQotCQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWVkaXRvci5zZXRFZGl0b3IodGV4dCk7Ci0JCQl0ZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQkvLyBIaWRlIHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJDVFJMIiBvciAiU0hJRlQiIGtleS4KLQkvLyBUaGlzIGFsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JY3Vyc29yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJCQl8fCBlLmtleUNvZGUgPT0gU1dULlNISUZUCi0JCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJCQljdXJzb3Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkvLyBXaGVuIHRoZSB1c2VyIGRvdWJsZSBjbGlja3MgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0IGVkaXRvciBzbyB0aGF0IAotCS8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCWN1cnNvci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQl0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCQl0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlciAKLQkJCQkJLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQkJCQlyb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGhpdHMgIkVTQyIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBjbGlja3MgYXdheQotCQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWVkaXRvci5zZXRFZGl0b3IodGV4dCk7Ci0JCQl0ZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBTaG93IHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSAiU0hJRlQiIG9yICJDVFJMIiBrZXkuCi0JLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIG11bHRpcGxlIHNlbGVjdGlvbiB0YXNrLgotCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQlpZiAoZS5rZXlDb2RlID09IFNXVC5DT05UUk9MICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlID09IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlICE9IFNXVC5DT05UUk9MCi0JCQkJJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkJCXJldHVybjsKLQotCQkJVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlUYWJsZUl0ZW0gcm93ID0gKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgPyB0YWJsZS5nZXRJdGVtKHRhYmxlLmdldFRvcEluZGV4KCkpIDogc2VsZWN0aW9uWzBdOwotCQkJdGFibGUuc2hvd0l0ZW0ocm93KTsKLQkJCWN1cnNvci5zZXRTZWxlY3Rpb24ocm93LCAwKTsKLQkJCWN1cnNvci5zZXRWaXNpYmxlKHRydWUpOwotCQkJY3Vyc29yLnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwMTc0Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGZpbGwgYSBtZW51IGR5bmFtaWNhbGx5ICh3aGVuIG1lbnUgc2hvd24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCXRyZWUuc2V0TWVudSAobWVudSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JbWVudS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJTWVudUl0ZW0gW10gbWVudUl0ZW1zID0gbWVudS5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQltZW51SXRlbXMgW2ldLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTx0cmVlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCW1lbnVJdGVtLnNldFRleHQgKHRyZWVJdGVtcyBbaV0uZ2V0VGV4dCAoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzkxODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbmQgZGlzcG9zZSBjaGlsZHJlbiBvZiBhIGNvbXBvc2l0ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5OCB7Ci0KLXN0YXRpYyBpbnQgcGFnZU51bSA9IDA7Ci1zdGF0aWMgQ29tcG9zaXRlIHBhZ2VDb21wb3NpdGU7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQdXNoIik7Ci0JcGFnZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlwYWdlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmICgocGFnZUNvbXBvc2l0ZSAhPSBudWxsKSAmJiAoIXBhZ2VDb21wb3NpdGUuaXNEaXNwb3NlZCgpKSkgewotCQkJCXBhZ2VDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJfQotCQkJcGFnZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCWlmIChwYWdlTnVtKysgJSAyID09IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYWdlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSkuc2V0VGV4dCgidGFibGUgaXRlbSAiICsgaSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXcgQnV0dG9uKHBhZ2VDb21wb3NpdGUsIFNXVC5SQURJTykuc2V0VGV4dCgicmFkaW8iKTsKLQkJCX0KLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmEzYWNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgYSBzaGVsbCBmcm9tIGNsb3NpbmcgKHByb21wdCB0aGUgdXNlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBzdHlsZSA9IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ZRVMgfCBTV1QuTk87Ci0JCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveCAoc2hlbGwsIHN0eWxlKTsKLQkJCW1lc3NhZ2VCb3guc2V0VGV4dCAoIkluZm9ybWF0aW9uIik7Ci0JCQltZXNzYWdlQm94LnNldE1lc3NhZ2UgKCJDbG9zZSB0aGUgc2hlbGw/Iik7Ci0JCQlldmVudC5kb2l0ID0gbWVzc2FnZUJveC5vcGVuICgpID09IFNXVC5ZRVM7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0TGF1bmNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0MTk5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0TGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2ltcGxlICJoYWNrYWJsZSIgY29kZSB0aGF0IHJ1bnMgYWxsIG9mIHRoZSBTV1QgU25pcHBldHMsCi0gKiB0eXBpY2FsbHkgZm9yIHRlc3RpbmcuIE9uZSBleGFtcGxlIG9mIGEgdXNlZnVsICJoYWNrIiBpcwotICogdG8gYWRkIHRoZSBsaW5lOgotICogICAgaWYgKHNvdXJjZS5pbmRleE9mKCJUYWJsZSIpID09IC0xICYmIHNvdXJjZS5pbmRleE9mKCJUcmVlIikgPT0gLTEpIGNvbnRpbnVlOwotICogYWZ0ZXIgdGhlIGxpbmU6Ci0gKiAgICBTdHJpbmcgc291cmNlID0gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKLSAqIGluIG9yZGVyIHRvIHJ1biBhbGwgb2YgdGhlIFRhYmxlIGFuZCBUcmVlIFNuaXBwZXRzLgotICovCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXRMYXVuY2hlciB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRmlsZSBzb3VyY2VEaXIgPSBuZXcgRmlsZSgic3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cyIpOwotCQlib29sZWFuIGhhc1NvdXJjZSA9IHNvdXJjZURpci5leGlzdHMoKTsKLQkJaW50IGNvdW50ID0gMzAwOwotCQlpZiAoaGFzU291cmNlKSB7Ci0JCQlGaWxlIFtdIGZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotCQkJaWYgKGkgPT0gMTM2IHx8IGkgPT0gMTUxIHx8IGkgPT0gMTgwIHx8IGkgPT0gMjE5KSBjb250aW51ZTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAiU25pcHBldCIgKyBpOwotCQkJQ2xhc3MgY2xhenogPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy4iICsgY2xhc3NOYW1lKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge30KLQkJCWlmIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBjbGF6ei5nZXROYW1lKCkpOwotCQkJCWlmIChoYXNTb3VyY2UpIHsKLQkJCQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyLCBjbGFzc05hbWUgKyAiLmphdmEiKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7Ci0JCQkJCQljaGFyIFtdIGJ1ZmZlciA9IG5ldyBjaGFyIFsoaW50KXNvdXJjZUZpbGUubGVuZ3RoKCldOwotCQkJCQkJcmVhZGVyLnJlYWQoYnVmZmVyKTsKLQkJCQkJCVN0cmluZyBzb3VyY2UgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotCQkJCQkJaW50IHN0YXJ0ID0gc291cmNlLmluZGV4T2YoInBhY2thZ2UiKTsKLQkJCQkJCXN0YXJ0ID0gc291cmNlLmluZGV4T2YoIi8qIiwgc3RhcnQpOwotCQkJCQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCIqIEZvciBhIGxpc3Qgb2YgYWxsIik7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kLTMpKTsKLQkJCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCQkJCQlpZiAoc291cmNlLmluZGV4T2YoIlBvY2tldFBDIikgIT0gLTEpIHsKLQkJCQkJCQlwbGF0Zm9ybSA9ICJQb2NrZXRQQyI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHNvdXJjZS5pbmRleE9mKCJPcGVuR0wiKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIk9wZW5HTCI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHNvdXJjZS5pbmRleE9mKCJKYXZhWFBDT00iKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIkphdmFYUENPTSI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBbXSBwbGF0Zm9ybXMgPSB7IndpbjMyIiwgIm1vdGlmIiwgImd0ayIsICJwaG90b24iLCAiY2FyYm9uIn07Ci0JCQkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwbGF0Zm9ybXMubGVuZ3RoOyBwKyspIHsKLQkJCQkJCQkJaWYgKCFwbGF0Zm9ybXNbcF0uZXF1YWxzKHBsYXRmb3JtKSAmJiBzb3VyY2UuaW5kZXhPZigiLiIgKyBwbGF0Zm9ybXNbcF0pICE9IC0xKSB7Ci0JCQkJCQkJCQlwbGF0Zm9ybSA9IHBsYXRmb3Jtc1twXTsKLQkJCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2tpcCkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLi4uc2tpcHBpbmcgIiArIHBsYXRmb3JtICsgIiBleGFtcGxlLi4uIik7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJCQlTdHJpbmcgW10gcGFyYW0gPSBuZXcgU3RyaW5nIFswXTsKLQkJCQlpZiAoaSA9PSA4MSkgcGFyYW0gPSBuZXcgU3RyaW5nW10geyJTaGVsbC5FeHBsb3JlciJ9OwotCQkJCXRyeSB7Ci0JCQkJCW1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtwYXJhbS5nZXRDbGFzcygpfSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBEaWQgbm90IGZpbmQgbWFpbihTdHJpbmcgW10pIik7Ci0JCQkJfQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbWV0aG9kLmludm9rZShjbGF6eiwgbmV3IE9iamVjdCBbXSB7cGFyYW19KTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEZhaWxlZCB0byBsYXVuY2ggKGlsbGVnYWwgYWNjZXNzKSIpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBGYWlsZWQgdG8gbGF1bmNoIChpbGxlZ2FsIGFyZ3VtZW50IHRvIG1haW4pIik7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBFeGNlcHRpb24gaW4gU25pcHBldDogIiArIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvY2FuY2VsLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2NhbmNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjQ3NjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvY2FuY2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2VjbGlwc2UucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTc1MjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuamF2YQppbmRleCBlZDczNTI4Li5lMjhjNWQ0IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAl9CiAKIAl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10ge30pOworCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10gezAsIDB4NGYsIDB4NGYsIDB9KTsKIAkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFsZXR0ZURhdGEgPT0gbnVsbCIpOwogCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJfQpAQCAtNzQsMjAgKzc0LDIyIEBACiB9CiAKIHB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCKCkgeworCWJ5dGVbXSB2YWxpZERhdGEgPSBuZXcgYnl0ZVtdIHswLCAweDRmLCAweDRmLCAwfTsKKwkKIAl0cnkgewotCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOworCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIHZhbGlkRGF0YSk7CiAJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDwgMCIpOwogCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJfQogCiAJdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAtMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKKwkJbmV3IEltYWdlRGF0YSgxLCAtMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCB2YWxpZERhdGEpOwogCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7CiAJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKIAl9CiAKIAl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10ge30pOworCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIHZhbGlkRGF0YSk7CiAJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKIAl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCX0KQEAgLTk5LDI2ICsxMDEsNDQgQEAKIAl9CiAKIAl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7CisJCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKKwkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGF0YSBhcnJheSB0b28gc21hbGwiKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCX0KKworCXRyeSB7CisJCW5ldyBJbWFnZURhdGEoMSwgMSwgMTYsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7MHg0Zn0pOworCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkYXRhIGFycmF5IHRvbyBzbWFsbCIpOworCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJfQorCisJdHJ5IHsKKwkJbmV3IEltYWdlRGF0YSgxLCAxLCAzMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHsweDRmLCAweDRmfSk7CisJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgYXJyYXkgdG9vIHNtYWxsIik7CisJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwl9CisKKwl0cnkgeworCQluZXcgSW1hZ2VEYXRhKDIsIDIsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7MHg0ZiwgMHg0ZiwgMHg0Zn0pOworCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkYXRhIGFycmF5IHRvbyBzbWFsbCIpOworCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJfQorCisJdHJ5IHsKKwkJbmV3IEltYWdlRGF0YSgxLCAxLCAzLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIHZhbGlkRGF0YSk7CiAJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVuc3VwcG9ydGVkIGRlcHRoIik7CiAJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKIAl9CiAJCisJLy8gdmVyaWZ5IGFsbCB2YWxpZCBkZXB0aHMKIAlpbnRbXSB2YWxpZERlcHRocyA9IHsxLCAyLCA0LCA4LCAxNiwgMjQsIDMyfTsKIAlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkRGVwdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgdmFsaWREZXB0aHNbaV0sIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7CisJCW5ldyBJbWFnZURhdGEoMSwgMSwgdmFsaWREZXB0aHNbaV0sIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgdmFsaWREYXRhKTsKIAl9CiAJCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgZGF0YSBpcyBudWxsCisJLy8gdmVyaWZ5IG5vIGRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiBpZiBzY2FubGluZVBhZCA9PSAwCiAJdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDQsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGRhdGEiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyBkaXZpZGUgYnkgemVybyBleGNlcHRpb24gaWYgc2NhbmxpbmVQYWQgPT0gMAotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAwLCBuZXcgYnl0ZVtdIHt9KTsKKwkJbmV3IEltYWdlRGF0YSgxLCAxLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDAsIHZhbGlkRGF0YSk7CiAJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjYW5saW5lUGFkID09IDAiKTsKIAl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCX0K