LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwojaWZuZGVmIFNBTUxfSAojZGVmaW5lIFNBTUxfSAoKI2luY2x1ZGUgPGF4dXRpbF91dGlscy5oPgojaW5jbHVkZSA8YXh1dGlsX2FycmF5X2xpc3QuaD4KI2luY2x1ZGUgPGF4dXRpbF9oYXNoLmg+CiNpbmNsdWRlIDxheHV0aWxfZGF0ZV90aW1lLmg+CiNpbmNsdWRlIDxheGlvbS5oPgojaW5jbHVkZSA8b3hzX3htbF9zaWduYXR1cmUuaD4KI2luY2x1ZGUgPG94c19zaWduX2N0eC5oPgojaW5jbHVkZSA8b3hzX3htbF9rZXlfcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxveHNfdXRpbGl0eS5oPgojaW5jbHVkZSA8b3hzX3RyYW5zZm9ybXNfZmFjdG9yeS5oPgojaW5jbHVkZSA8b3hzX3htbF9rZXlfaW5mb19idWlsZGVyLmg+CiNpbmNsdWRlIDxveHNfa2V5X21nci5oPgojaW5jbHVkZSA8b3hzX3RyYW5zZm9ybS5oPgojaW5jbHVkZSA8b3hzX3g1MDlfY2VydC5oPgojaW5jbHVkZSA8b3BlbnNzbF9wa2V5Lmg+CgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgp7CiNlbmRpZgoKCiNkZWZpbmUgU0FNTF9WRVJTSU9OX01BWCAgICAxNgojZGVmaW5lIFNBTUxfVVJJX0xFTl9NQVggICAgMjA0OAojZGVmaW5lIFNBTUxfQVJSQVlfTElTVF9ERUYgICAgNAoKI2RlZmluZSBTQU1MX1BSRUZJWAkJCQkJCQkic2FtbCIKI2RlZmluZSBTQU1MX05NU1BfVVJJCQkJCQkJInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDphc3NlcnRpb24iCiNkZWZpbmUgU0FNTF9YTUxfVFlQRQkJCQkJCSJ0eXBlIgojZGVmaW5lIFNBTUxfWFNJX05TCQkJCQkJCSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKI2RlZmluZSBTQU1MX1hTSQkJCQkJCQkieHNpIgoKI2RlZmluZSBTQU1MX01BSk9SVkVSU0lPTgkJCQkJIk1ham9yVmVyc2lvbiIKI2RlZmluZSBTQU1MX01JTk9SVkVSU0lPTgkJCQkJIk1pbm9yVmVyc2lvbiIKI2RlZmluZSBTQU1MX0FTU0VSVElPTl9JRAkJCQkJIkFzc2VydGlvbklEIgojZGVmaW5lIFNBTUxfSVNTVUVSCQkJCQkJCSJJc3N1ZXIiCiNkZWZpbmUgU0FNTF9JU1NVRV9JTlNUQU5UCQkJCQkiSXNzdWVJbnN0YW50IgojZGVmaW5lIFNBTUxfU1RBVEVNRU5UCQkJCQkJIlN0YXRlbWVudCIKI2RlZmluZSBTQU1MX1NVQkpFQ1RfU1RBVEVNRU5UCQkJCSJTdWJqZWN0U3RhdGVtZW50IgojZGVmaW5lIFNBTUxfQVVUSEVOVElDQVRJT05fU1RBVEVNRU5UCQkiQXV0aGVudGljYXRpb25TdGF0ZW1lbnQiCiNkZWZpbmUgU0FNTF9BVVRIT1JJWkFUSU9OX0RFQ0lTSU9OX1NUQVRFTUVOVCAiQXV0aG9yaXphdGlvbkRlY2lzaW9uU3RhdGVtZW50IgojZGVmaW5lIFNBTUxfQVRUUklCVVRFX1NUQVRFTUVOVAkJCSJBdHRyaWJ1dGVTdGF0ZW1lbnQiCiNkZWZpbmUgU0FNTF9DT05ESVRJT05TCQkJCQkJIkNvbmRpdGlvbnMiCiNkZWZpbmUgU0FNTF9BRFZJQ0UJCQkJCQkJIkFkdmljZSIKI2RlZmluZSBTQU1MX05PVF9CRUZPUkUJCQkJCQkiTm90QmVmb3JlIgojZGVmaW5lIFNBTUxfTk9UX09OX09SX0FGVEVSICAgICAgICAgICAgICAgICJOb3RPbk9yQWZ0ZXIiCiNkZWZpbmUgU0FNTF9TSUdOQVRVUkUJCQkJCQkiU2lnbmF0dXJlIgoKI2RlZmluZSBTQU1MX0VNQUlMX0FERFJFU1MJCQkJCSIjZW1haWxBZGRyZXNzIgojZGVmaW5lIFNBTUxfWDUwOV9TVUJKRUNUX05BTUUJCQkJIiNYNTA5U3ViamVjdE5hbWUiCiNkZWZpbmUgU0FNTF9XSU5ET1dTX0RPTUFJTl9RVUFMSUZJRURfTkFNRSAgIiNXaW5kb3dzRG9tYWluUXVhbGlmaWVkTmFtZSIKCiNkZWZpbmUgU0FNTF9OQU1FX1FVQUxJRklFUgkJCQkJIk5hbWVRdWFsaWZpZXIiCiNkZWZpbmUgU0FNTF9GT1JNQVQJCQkJCQkJIkZvcm1hdCIKI2RlZmluZSBTQU1MX05BTUVfSURFTlRJRklFUiAgICAgICAgICAgICAgICAiTmFtZUlkZW50aWZpZXIiCiNkZWZpbmUgU0FNTF9TVUJKRUNUX0NPTkZJUk1BVElPTgkJCSJTdWJqZWN0Q29uZmlybWF0aW9uIgojZGVmaW5lIFNBTUxfQ09ORklSTUFUSU9OX01FVEhPRCAgICAgICAgICAgICJDb25maXJtYXRpb25NZXRob2QiCiNkZWZpbmUgU0FNTF9TVUJKRUNUX0NPTkZJUk1BVElPTl9EQVRBCQkiU3ViamVjdENvbmZpcm1hdGlvbkRhdGEiCiNkZWZpbmUgU0FNTF9LRVlfSU5GTwkJCQkJCSJLZXlJbmZvIgojZGVmaW5lIFNBTUxfU1VCSkVDVAkJCQkJCSJTdWJqZWN0IgoKI2RlZmluZSBTQU1MX0FVRElFTkNFCQkJCQkJIkF1ZGllbmNlIgojZGVmaW5lIFNBTUxfQVVESUVOQ0VfUkVTVFJJQ1RJT05fQ09ORElUSU9OX1RZUEUgIkF1ZGllbmNlUmVzdHJpY3Rpb25Db25kaXRpb25UeXBlIiAKI2RlZmluZSBTQU1MX0FVRElFTkNFX1JFU1RSSUNUSU9OX0NPTkRJVElPTiAiQXVkaWVuY2VSZXN0cmljdGlvbkNvbmRpdGlvbiIKCiNkZWZpbmUgU0FNTF9BVVRIRU5USUNBVElPTl9NRVRIT0QJCQkiQXV0aGVudGljYXRpb25NZXRob2QiCiNkZWZpbmUgU0FNTF9BVVRIRU5USUNBVElPTl9JTlNUQU5UCQkJIkF1dGhlbnRpY2F0aW9uSW5zdGFudCIKI2RlZmluZSBTQU1MX0lQX0FERFJFU1MJCQkJCQkiSVBBZGRyZXNzIiAKI2RlZmluZSBTQU1MX0ROU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAiRE5TQWRkcmVzcyIKI2RlZmluZSBTQU1MX1NVQkpFQ1RfTE9DQUxJVFkgICAgICAgICAgICAgICAgIlN1YmplY3RMb2NhbGl0eSIKI2RlZmluZSBTQU1MX0FVVEhPUklUWV9CSU5ESU5HCQkJCSJBdXRob3JpdHlCaW5kaW5nIgojZGVmaW5lIFNBTUxfQVVUSE9SSVRZX0tJTkQJCQkJCSJBdXRob3JpdHlLaW5kIgojZGVmaW5lIFNBTUxfTE9DQVRJT04JCQkJCQkiTG9jYXRpb24iCiNkZWZpbmUgU0FNTF9CSU5ESU5HCQkJCQkJIkJpbmRpbmciCgojZGVmaW5lIFNBTUxfUkVTT1VSQ0UJCQkJCQkiUmVzb3VyY2UiCiNkZWZpbmUgU0FNTF9ERUNJU0lPTgkJCQkJCSJEZWNpc2lvbiIgICAgCiNkZWZpbmUgU0FNTF9BQ1RJT04JCQkJCQkJIkFjdGlvbiIKI2RlZmluZSBTQU1MX05BTUVTUEFDRQkJCQkJCSJOYW1lc3BhY2UiCiNkZWZpbmUgU0FNTF9BU1NFUlRJT05fSURfUkVGRVJFTkNFCQkJIkFzc2VydGlvbklEUmVmZXJlbmNlIiAKI2RlZmluZSBTQU1MX0FTU0VSVElPTgkJCQkJCSJBc3NlcnRpb24iICAgIAojZGVmaW5lIFNBTUxfQUNUSU9OCQkJCQkJCSJBY3Rpb24iCiNkZWZpbmUgU0FNTF9FVklERU5DRQkJCQkJCSJFdmlkZW5jZSIKCiNkZWZpbmUgU0FNTF9BVFRSSUJVVEVfTkFNRQkJCQkJIkF0dHJpYnV0ZU5hbWUiCiNkZWZpbmUgU0FNTF9BVFRSSUJVVEVfTkFNRVNQQUNFICAgICAgICAgICAgIkF0dHJpYnV0ZU5hbWVzcGFjZSIKI2RlZmluZSBTQU1MX0FUVFJJQlVURV9WQUxVRSAgICAgICAgICAgICAgICAiQXR0cmlidXRlVmFsdWUiCiNkZWZpbmUgU0FNTF9BVFRSSUJVVEUJCQkJCQkiQXR0cmlidXRlIgojZGVmaW5lIFNBTUxfQVRUUklCVVRFX0RFU0lHTkFUT1IJCQkiQXR0cmlidXRlRGVzaWduYXRvciIKCiNkZWZpbmUgU0FNTF9TVUJfQ09ORklSTUFUSU9OX0hPTERFUl9PRl9LRVkJInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDpjbTpob2xkZXItb2Yta2V5IgojZGVmaW5lIFNBTUxfU1VCX0NPTkZJUk1BVElPTl9TRU5ERVJfVk9VQ0hFUwkidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4wOmNtOnNlbmRlci12b3VjaGVzIgojZGVmaW5lIFNBTUxfU1VCX0NPTkZJUk1BVElPTl9BUlRJRkFDVAkJInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDpjbTphcnRpZmFjdC0wMSIKI2RlZmluZSBTQU1MX1NVQl9DT05GSVJNQVRJT05fQkVBUkVSCQkidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4wOmNtOmJlYXJlciIKCiNkZWZpbmUgU0FNTF9BVVRIX01FVEhPRF9VUklfUEFTU1dPUkQJCSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjA6YW06cGFzc3dvcmQiCiNkZWZpbmUgU0FNTF9BVVRIX01FVEhPRF9VUklfS0VSQkVST1MJCSJ1cm46aWV0ZjpyZmM6MTUxMCIKI2RlZmluZSBTQU1MX0FVVEhfTUVUSE9EX1VSSV9TUlAJCQkidXJuOmlldGY6cmZjOjI5NDUiCiNkZWZpbmUgU0FNTF9BVVRIX01FVEhPRF9VUklfSEFSRFdBUkVfVE9LRU4JInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDphbTpIYXJkd2FyZVRva2VuIgojZGVmaW5lIFNBTUxfQVVUSF9NRVRIT0RfVVJJX1NTTF9UTFMJCSJ1cm46aWV0ZjpyZmM6MjI0NiIKI2RlZmluZSBTQU1MX0FVVEhfTUVUSE9EX1VSSV9YNTA5CQkJInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDphbTpYNTA5LVBLSSIKI2RlZmluZSBTQU1MX0FVVEhfTUVUSE9EX1VSSV9QR1AJCQkidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4wOmFtOlBHUCIKI2RlZmluZSBTQU1MX0FVVEhfTUVUSE9EX1VSSV9TUEtJCQkJInVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMDphbTpTUEtJIgojZGVmaW5lIFNBTUxfQVVUSF9NRVRIT0RfVVJJX1hLTVMJCQkidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4wOmFtOlhLTVMiCiNkZWZpbmUgU0FNTF9BVVRIX01FVEhPRF9VUklfWE1MX0RTCQkJInVybjppZXRmOnJmYzozMDc1IgojZGVmaW5lIFNBTUxfQVVUSF9NRVRIT0RfVVJJX1VOU1BFQ0lGSUVECSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjA6YW06dW5zcGVjaWZpZWQiCgojZGVmaW5lIFNBTUxfQUNUSU9OX1VSSV9SV0VEQ19OCQkJCSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjA6YWN0aW9uOnJ3ZWRjLW5lZ2F0aW9uIgojZGVmaW5lIFNBTUxfQUNUSU9OX1VSSV9SV0VEQwkJCQkidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4wOmFjdGlvbjpyd2VkYyIKCiNkZWZpbmUgU0FNTF9BQ1RJT05fUkVBRAkJCQkJIlJlYWQiCiNkZWZpbmUgU0FNTF9BQ1RJT05fV1JJVEUJCQkJCSJXcml0ZSIKI2RlZmluZSBTQU1MX0FDVElPTl9FWEVDVVRFCQkJCQkiRXhlY3V0ZSIKI2RlZmluZSBTQU1MX0FDVElPTl9ERUxFVEUJCQkJCSJEZWxldGUiCiNkZWZpbmUgU0FNTF9BQ1RJT05fQ09OVFJPTAkJCQkJIkNvbnRyb2wiCiNkZWZpbmUgU0FNTF9BQ1RJT05fUkVBRF9OCQkJCQkiflJlYWQiCiNkZWZpbmUgU0FNTF9BQ1RJT05fV1JJVEVfTgkJCQkJIn5Xcml0ZSIKI2RlZmluZSBTQU1MX0FDVElPTl9FWEVDVVRFX04JCQkJIn5FeGVjdXRlIgojZGVmaW5lIFNBTUxfQUNUSU9OX0RFTEVURV9OCQkJCSJ+RGVsZXRlIgojZGVmaW5lIFNBTUxfQUNUSU9OX0NPTlRST0xfTgkJCQkifkNvbnRyb2wiCgojZGVmaW5lIFNBTUxfTUFKT1JfVkVSU0lPTgkJCQkJIjEiCgp0eXBlZGVmIHN0cnVjdCBzYW1sX2Fzc2VydGlvbl9zIHNhbWxfYXNzZXJ0aW9uX3Q7CgojaWZuZGVmIFNBTUxfREVDTEFSRQojZGVmaW5lIFNBTUxfREVDTEFSRSh0eXBlKQlBWElTMl9FWFRFUk4gdHlwZSBBWElTMl9DQUxMCiNlbmRpZgoKLyogRGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzIHRvIGJlIHJlcG9ydGVkIGFzIHRoZSBzdGF0dXMgb2YgYW4KICogYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQuCiAqLwp0eXBlZGVmIGVudW0gZGVjaXNpb25fdHlwZQp7CiAgICBQRVJNSVQgPSAwLAogICAgREVOWSwKICAgIElOREVURVJNSU5BVEUKfSBkZWNpc2lvbl90eXBlX3Q7Cgp0eXBlZGVmIGVudW0KewogICAgU0FNTF9DT05EX1VOU1BFQ0ZJRUQgPSAwLAogICAgU0FNTF9DT05EX0FVRElfUkVTVFJJQ1RJT04gCn0gc2FtbF9jb25kX3R5cGVfdDsgCgp0eXBlZGVmIHN0cnVjdCBjb25kaXRpb25fcyAKewogICAgc2FtbF9jb25kX3R5cGVfdCB0eXBlOwogICAgdm9pZCAqY29uZDsKfSBzYW1sX2NvbmRpdGlvbl90OwoKdHlwZWRlZiBzdHJ1Y3Qgc2FtbF9hdWRpX3Jlc3RyaWN0aW9uX2NvbmRfcwp7CiAgICBheHV0aWxfYXJyYXlfbGlzdF90ICphdWRpZW5jZXM7CQp9IHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3Q7Cgp0eXBlZGVmIHN0cnVjdCBzYW1sX2FkdmlzZV9zCnsKICAgIGludCBhOwp9IHNhbWxfYWR2aXNlX3Q7Cgp0eXBlZGVmIGVudW0KewogICAgU0FNTF9TVE1UX1VOU1BFQ0lGRUQgPSAwLAogICAgU0FNTF9TVE1UX1NVQkpFQ1RTVEFURU1FTlQsCiAgICBTQU1MX1NUTVRfQVVUSEVOVElDQVRJT05TVEFURU1FTlQsCiAgICBTQU1MX1NUTVRfQVVUSE9SSVpBVElPTkRFQ0lTSU9OU1RBVEVNRU5ULAogICAgU0FNTF9TVE1UX0FUVFJJQlVURVNUQVRFTUVOVAp9IHNhbWxfc3RtdF90eXBlX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBzYW1sX3N0bXRfdHlwZV90IHR5cGU7CiAgICB2b2lkICpzdG10Owp9IHNhbWxfc3RtdF90OwoKdHlwZWRlZiBzdHJ1Y3Qgc2FtbF9uYW1lZF9pZF9zCnsKICAgIC8qIFRoZSBzZWN1cml0eSBvciBhZG1pbmlzdHJhdGl2ZSBkb21haW4gdGhhdCBxdWFsaWZpZXMgdGhlIG5hbWUgb2YgCiAgICAgKiB0aGUgc3ViamVjdCAKICAgICAqLwogICAgYXhpczJfY2hhcl90ICpuYW1lX3F1YWxpZmllcjsKCiAgICAvKiBUaGUgc3ludGF4IHVzZWQgdG8gZGVzY3JpYmUgdGhlIG5hbWUgb2YgdGhlIHN1YmplY3QgKi8KICAgIGF4aXMyX2NoYXJfdCAqZm9ybWF0OwoKICAgIGF4aXMyX2NoYXJfdCAqbmFtZTsKfSBzYW1sX25hbWVkX2lkX3Q7CgoKdHlwZWRlZiBzdHJ1Y3Qgc2FtbF9zdWJqZWN0X3MKewogICAgc2FtbF9uYW1lZF9pZF90ICpuYW1lZF9pZDsKICAgIAogICAgLyogVVJJIHJlZmVyZW5jZSB0aGF0IGlkZW50aWZpZXMgYSBwcm90b2NvbCB0byBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSAKICAgICAqIHRoZSBzdWJqZWN0IAogICAgICovCiAgICBheHV0aWxfYXJyYXlfbGlzdF90ICpjb25maXJtYXRpb25fbWV0aG9kczsKCiAgICAvKiBBbiBYTUwgU2lnbmF0dXJlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjcnlwdG9ncmFwaGljIGtleSBoZWxkIGJ5IAogICAgICogdGhlIHN1YmplY3QgCiAgICAgKi8KICAgIGF4aW9tX25vZGVfdCAqa2V5X2luZm87CgogICAgLyogQWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiB0byBiZSB1c2VkIGJ5IGEgc3BlY2lmaWMgCiAgICAgKiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAKICAgICAqLwogICAgYXhpb21fbm9kZV90ICpjb25maXJtYXRpb25fZGF0YTsgICAgCn0gc2FtbF9zdWJqZWN0X3Q7Cgp0eXBlZGVmIHN0cnVjdCBzYW1sX3N1YmplY3Rfc3RtdF9zCnsKICAgIHNhbWxfc3ViamVjdF90ICpzdWJqZWN0Owp9IHNhbWxfc3ViamVjdF9zdG10X3Q7Cgp0eXBlZGVmIHN0cnVjdCBzYW1sX2FjdGlvbgp7CiAgICAvKiBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCAqLwogICAgY2hhciAqbmFtZV9zcGFjZTsKCiAgICAvKiBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBkYXRhICovCiAgICBjaGFyICpkYXRhOwp9IHNhbWxfYWN0aW9uX3Q7CgoKdHlwZWRlZiBzdHJ1Y3Qgc2FtbF9ldmlkZW5jZV9zCnsKICAgIC8qIFNwZWNpZmllcyBhbiBhc3NlcnRpb24gYnkgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYXNzZXJ0aW9uknMgCiAgICAgKiBBc3NlcnRpb25JRCBhdHRyaWJ1dGUgCiAgICAgKi8KICAgIGF4dXRpbF9hcnJheV9saXN0X3QgKmFzc2VydGlvbl9pZHM7CgogICAgLyogU3BlY2lmaWVzIGFuIGFzc2VydGlvbiBieSB2YWx1ZSAqLwogICAgYXh1dGlsX2FycmF5X2xpc3RfdCAqYXNzZXJ0aW9uczsKfSBzYW1sX2V2aWRlbmNlX3Q7CgoKdHlwZWRlZiBzdHJ1Y3Qgc2FtbF9zdWJqZWN0X2xvY2FsaXR5CnsKICAgIC8qIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gZW50aXR5IHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQgKi8KICAgIGF4aXMyX2NoYXJfdCAqaXA7CgogICAgLyogVGhlIEROUyBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gZW50aXR5IHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQgKi8KICAgIGF4aXMyX2NoYXJfdCAqZG5zOwp9IHNhbWxfc3ViamVjdF9sb2NhbGl0eV90OwoKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXV0aF9iaW5kaW5nCnsKICAgIC8qIFRoZSB0eXBlIG9mIFNBTUwgUHJvdG9jb2wgcXVlcmllcyB0byB3aGljaCB0aGUgYXV0aG9yaXR5IGRlc2NyaWJlZCAKICAgICAqIGJ5IHRoaXMgZWxlbWVudCB3aWxsIHJlc3BvbmQgCiAgICAgKi8KICAgIGF4aXMyX2NoYXJfdCAqYXV0aF9raW5kOwoKICAgIC8qIEEgVVJJIHJlZmVyZW5jZSBkZXNjcmliaW5nIGhvdyB0byBsb2NhdGUgYW5kIGNvbW11bmljYXRlIHdpdGggdGhlIAogICAgICogYXV0aG9yaXR5IAogICAgICovCiAgICBheGlzMl9jaGFyX3QgKmxvY2F0aW9uOwoKICAgIC8qIEEgVVJJIHJlZmVyZW5jZSBpZGVudGlmeWluZyB0aGUgU0FNTCBwcm90b2NvbCBiaW5kaW5nIHRvIHVzZSAKICAgICAqIGluIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgYXV0aG9yaXR5IAogICAgICovCiAgICBheGlzMl9jaGFyX3QgKmJpbmRpbmc7Cn0gc2FtbF9hdXRoX2JpbmRpbmdfdDsKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXV0aF9zdG10CnsKCXNhbWxfc3ViamVjdF90ICpzdWJqZWN0OwoKICAgIC8qIEEgVVJJIHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0aGF0IHRvb2sgcGxhY2UgKi8KICAgIGF4aXMyX2NoYXJfdCAqYXV0aF9tZXRob2Q7CiAgICAKICAgIC8qIFNwZWNpZmllcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgYXV0aGVudGljYXRpb24gdG9vayBwbGFjZSAqLwogICAgYXh1dGlsX2RhdGVfdGltZV90ICphdXRoX2luc3RhbnNlOwoKICAgIC8qIAogICAgICogU3BlY2lmaWVzIHRoZSBETlMgZG9tYWluIG5hbWUgYW5kIElQIGFkZHJlc3MgZm9yIHRoZSBzeXN0ZW0gZW50aXR5IGZyb20gd2hpY2ggdGhlIFN1YmplY3Qgd2FzCiAgICAgKiBhcHBhcmVudGx5IGF1dGhlbnRpY2F0ZWQgCiAgICAgKi8KICAgIC8qc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKnN1Yl9sb2NhbGl0eTsqLwoJYXhpczJfY2hhcl90ICppcDsKCQoJYXhpczJfY2hhcl90ICpkbnM7CgogICAgLyogSW5kaWNhdGVzIHRoYXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ViamVjdCBvZiB0aGUgc3RhdGVtZW50IG1heSBiZSBhdmFpbGFibGUgKi8KICAgIGF4dXRpbF9hcnJheV9saXN0X3QgKmF1dGhfYmluZGluZzsKCn0gc2FtbF9hdXRoX3N0bXRfdDsKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10CnsKICAgIHNhbWxfc3ViamVjdF90ICpzdWJqZWN0OwogICAgLyogQSBVUkkgcmVmZXJlbmNlIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZSB0byB3aGljaCBhY2Nlc3MgYXV0aG9yaXphdGlvbiAqLwogICAgY2hhciAqcmVzb3VyY2U7CgogICAgLyogVGhlIGRlY2lzaW9uIHJlbmRlcmVkIGJ5IHRoZSBpc3N1ZXIgd2l0aCByZXNwZWN0IHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgKi8KICAgIGNoYXIgKmRlY2lzaW9uOwoKICAgIC8qIFRoZSBzZXQgb2YgYWN0aW9ucyBhdXRob3JpemVkIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlICovCiAgICBheHV0aWxfYXJyYXlfbGlzdF90ICphY3Rpb247CgogICAgLyogQSBzZXQgb2YgYXNzZXJ0aW9ucyB0aGF0IHRoZSBpc3N1ZXIgcmVsaWVkIG9uIGluIG1ha2luZyB0aGUgZGVjaXNpb24gKi8KICAgIHNhbWxfZXZpZGVuY2VfdCAqZXZpZGVuY2U7Cn0gc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfdDsKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXR0cl9zIAp7CiAgICAvKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBjaGFyICphdHRyX25hbWU7CgogICAgLyogVGhlIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgQXR0cmlidXRlTmFtZSBlbGVtZW50cyBhcmUgaW50ZXJwcmV0ZWQgKi8KICAgIGNoYXIgKmF0dHJfbm1zcDsKCiAgICBheHV0aWxfYXJyYXlfbGlzdF90ICphdHRyX3ZhbHVlOwp9IHNhbWxfYXR0cl90OwoKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXR0cl9zdG10X3MgCnsKICAgIHNhbWxfc3ViamVjdF90ICpzdWJqZWN0OwogICAgLyogQW4gYXR0cmlidXRlICovCiAgICBheHV0aWxfYXJyYXlfbGlzdF90ICphdHRyaWJ1dGU7Cn0gc2FtbF9hdHRyX3N0bXRfdDsKCnR5cGVkZWYgc3RydWN0IHNhbWxfYXR0cl9kZXNpZ19zCnsKICAgIGF4aXMyX2NoYXJfdCAqYXR0cl9uYW1lOwogICAgYXhpczJfY2hhcl90ICphdHRyX25tc3A7Cn0gc2FtbF9hdHRyX2Rlc2lnX3Q7CgpzdHJ1Y3Qgc2FtbF9hc3NlcnRpb25fcwp7CiAgICAvKiBtYWpvZCB2ZXJzaW9uICovCiAgICBheGlzMl9jaGFyX3QgKm1ham9yX3ZlcnNpb247CgogICAgLyogbWlub3IgdmVyc2lvbiAqLwogICAgYXhpczJfY2hhcl90ICptaW5vcl92ZXJzaW9uOwoKICAgIC8qIGlkICovCiAgICBheGlzMl9jaGFyX3QgKmFzc2VydGlvbl9pZDsKCiAgICAvKiB1cmkgcmVwcmVzZW50aW5nIHRoZSBpc3N1ZXIgKi8KICAgIGF4aXMyX2NoYXJfdCAqaXNzdWVyOwoKICAgIC8qIHRpbWUgaW5zdGFudCBvZiB0aGUgaXNzdWUgKi8KICAgIGF4dXRpbF9kYXRlX3RpbWVfdCAqaXNzdWVfaW5zdGFudDsKCQoJLyogc3BlY2lmaWVzIHRoZSB0aW1lIGluc3RhbnQgYXQgd2hpY2ggdGhlIHZhbGlkaXR5IGludGVydmFsIGJlZ2lucyAqLwogICAgYXh1dGlsX2RhdGVfdGltZV90ICpub3RfYmVmb3JlOyAgICAKCgkvKiBzcGVjaWZpZXMgdGhlIHRpbWUgaW5zdGFudCBhdCB3aGljaCB0aGUgdmFsaWRpdHkgaW50ZXJ2YWwgaGFzIGVuZGVkICovCiAgICBheHV0aWxfZGF0ZV90aW1lX3QgKm5vdF9vbl9vcl9hZnRlcjsKCiAgICAvKiBTQU1MIGNvbmRpdGlvbiAqLwogICAgYXh1dGlsX2FycmF5X2xpc3RfdCAqY29uZGl0aW9uczsKCiAgICAvKiBBbiBYTUwgU2lnbmF0dXJlIHRoYXQgYXV0aGVudGljYXRlcyB0aGUgYXNzZXJ0aW9uICovCiAgICBheGlvbV9ub2RlX3QgKnNpZ25hdHVyZTsKCgkvKiBhcnJheSBsaXN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlbWVudHMgKi8KCWF4dXRpbF9hcnJheV9saXN0X3QgKnN0YXRlbWVudHM7CgoJLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpZ25pbmcgKi8KCW94c19zaWduX2N0eF90ICpzaWduX2N0eDsKCgkvKiBUaGUgeG1sIG5vZGUgd2hpY2ggaXMgdXNlZCB0byBidWlsZCB0aGUgYXNzZXJ0aW9uICovCglheGlvbV9ub2RlX3QgKm9yaV94bWw7CQp9OwoKLyogYXNzZXJ0aW9uICovCgovKiAKICogQ3JlYXRlcyBhIHNhbWwgYXNzZXJ0aW9uLgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9hc3NlcnRpb25fdCAqQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fY3JlYXRlKAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIEZyZWUgYSBzYW1sIGFzc2VydGlvbgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2Fzc2VydGlvbl9mcmVlKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBCdWlsZCB0aGUgc2FtbCBhc3NlcnRpb24gZnJvbSBhIGF4aW9tIG5vZGUuCiAqIEBwYXJhbSBhc3NlcnRpb24gYXNzZXJ0aW9uIHRvIGJlIHBvcHVsYXRlZAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX2J1aWxkKAoJc2FtbF9hc3NlcnRpb25fdCAqYSwgCglheGlvbV9ub2RlX3QgKm5vZGUsIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFNlcmlhbGl6ZSBhIHNhbWwgYXNzZXJ0aW9uIHRvIGEgb20gbm9kZS4KICogQHBhcmFtIGFzc2VydGlvbiBhc3NlcnRpb24gdG8gYmUgc2VyaWFsaXplZAogKiBAcGFyYW0gcGFyZW50IGlmIHNwZWNpZmllZCBjcmVhdGVkIG5vZGUgd2lsbCBiZSBhIGNoaWxkIG9mIHRoaXMgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fdG9fb20oCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJYXhpb21fbm9kZV90ICpwYXJlbnQsIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFJldHVybnMgYWxsIHRoZSBjb25kaXRpb24gaW4gdGhlIGFzc2VydGlvbi4KICogQHBhcmFtIGFzc2VydGlvbiBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBheHV0aWxfYXJyYXlfbGlzdF90ICogQVhJUzJfQ0FMTCAKc2FtbF9hc3NldGlvbl9nZXRfY29uZGl0aW9ucygKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogUmV0dXJucyBhbGwgdGhlIHN0YXRlbWVudHMgaW4gdGhlIGFzc2VydGlvbi4KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGF4dXRpbF9hcnJheV9saXN0X3QgKiBBWElTMl9DQUxMIApzYW1sX2Fzc2VydGlvbl9nZXRfc3RhdGVtZW50cygKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogU2V0IHRoZSBjb25kaXRpb25zIGZvciB0aGUgYXNzZXJ0aW9uLiBJZiB0aGVyZSBhcmUgY29uZGl0aW9ucyBhbHJlYWR5IAogKiBzcGVjaWZpZWQsIHRoZXkgd2lsbCBiZSBmcmVlZC4gCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGxpc3QgYXJyYXkgbGlzdCBjb250YWluaW5nIHRoZSBjb25kaXRpb25zCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX3NldF9jb25kaXRpb25zKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheHV0aWxfYXJyYXlfbGlzdF90ICpsaXN0KTsKCi8qIAogKiBBZGQgYSBjb25kaXRpb24gdG8gdGhlIGFzc2VydGluLgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBjb25kIGEgcG9pbnRlciB0byBhIGNvbmRpdGlvbiB0byBiZSBhZGRlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2Fzc2VydGlvbl9hZGRfY29uZGl0aW9uKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCXNhbWxfY29uZGl0aW9uX3QgKmNvbmQpOwoKLyoKICogUmVtb3ZlIGEgY29uZGl0aW9uIGZyb20gdGhlIGFzc2VydGlvbi4KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2Fzc2VydGlvbl9yZW1vdmVfY29uZGl0aW9uKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCWludCBpbmRleCk7CgovKiAKICogU2V0IHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgYXNzZXJ0aW9uLiBJZiB0aGVyZSBhcmUgc3RhdGVtZW50cyBhbHJlYWR5IAogKiBzcGVjaWZpZWQsIHRoZXkgd2lsbCBiZSBmcmVlZC4gCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGxpc3QgYXJyYXkgbGlzdCBjb250YWluaW5nIHRoZSBzdGF0ZW1lbnRzCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX3NldF9zdGF0ZW1lbnRzKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCWF4dXRpbF9hcnJheV9saXN0X3QgKmxpc3QpOwoKLyogCiAqIEFkZCBhIHN0YXRlbWVudCB0byB0aGUgYXNzZXJ0aW4uCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGNvbmQgYSBwb2ludGVyIHRvIGEgc3RhdGVtZW50IHRvIGJlIGFkZGVkCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX2FkZF9zdGF0ZW1lbnQoCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJc2FtbF9zdG10X3QgKnN0bXQpOwoKLyoKICogUmVtb3ZlIGEgc3RhdGVtZW50IGZyb20gdGhlIGFzc2VydGlvbi4KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2Fzc2VydGlvbl9yZW1vdmVfc3RhdGVtZW50KAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCWludCBpbmRleCk7CgovKiAKICogU2V0IHRoZSBtaW5vciB2ZXJ0aW9uIG9mIHRoZSBhc3NlcnRpb24KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gdmVyc2lvbiBtaW5vciB2ZXJzaW9uIG51bWJlcgogKi8gCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fc2V0X21pbm9yX3ZlcnNpb24oCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJaW50IHZlcnNpb24pOwoKLyogCiAqIFNldCB0aGUgbWlub3IgdmVydGlvbiBvZiB0aGUgYXNzZXJ0aW9uCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovIApBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX3NldF9pc3N1ZXIoCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJYXhpczJfY2hhcl90ICppc3N1ZXIpOwoKLyogCiAqIFNldCB0aGUgaXNzdWVyIG9mIHRoZSBhc3NlcnRpb24KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAaW5zdGFudCB0aW1lIG9mIHRoZSBzYW1sIGlzc3VlCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX3NldF9pc3N1ZV9pbnN0YW50KAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCWF4dXRpbF9kYXRlX3RpbWVfdCAqaW5zdGFudCk7CgovKiAKICogU3BlY2lmaWVzIHRoZSB0aW1lIGluc3RhbnQgYXQgd2hpY2ggdGhlIHZhbGlkaXR5IGludGVydmFsIGJlZ2lucy4KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAaW5zdGFudCB0aW1lIGF0IHdoaWNoIHZhbGlkaXR5IGludGVydmFsIGJlZ2lucyAKICovIApBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX3NldF9ub3RfYmVmb3JlKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCWF4dXRpbF9kYXRlX3RpbWVfdCAqdGltZSk7CgovKiAKICogU3BlY2lmaWVzIHRoZSB0aW1lIGluc3RhbnQgYXQgd2hpY2ggdGhlIHZhbGlkaXR5IGludGVydmFsIGhhcyBlbmRlZAogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBpbnN0YW50IHRpbWUgYXQgd2hpY2ggdmFsaWRpdHkgaW50ZXJ2YWwgaGFzIGVuZGVkIAogKi8gCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fc2V0X25vdF9vbl9vcl9hZnRlcigKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudiwgCglheHV0aWxfZGF0ZV90aW1lX3QgKnRpbWUpOwoKLyogCiAqIFJldHVybiBTQU1MIGF1dGhvcml0eSB0aGF0IGNyZWF0ZWQgdGhlIGFzc2VydGlvbi4gVGhlIG5hbWUgb2YgdGhlIGlzc3VlciAKICogaXMgcHJvdmlkZWQgYXMgYSBzdHJpbmcgYW5kIGl0IGlzIHVuYW1iaWd1b3VzIHRvIHRoZSByZWx5aW5nIHBhcnR5LgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fZ2V0X2lzc3VlcigKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIHRpbWUgaW5zdGFudCBvZiBpc3N1ZS4KICogQHBhcmFtIGFzc2VydGlvbiBTQU1MIGFzc2VydGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGF4dXRpbF9kYXRlX3RpbWVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX2dldF9pc3N1ZV9pbnN0YW50KAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBHZXQgdGhlIHRpbWUgaW5zdGFudCBhdCB3aGljaCB0aGUgdmFsaWRpdHkgaW50ZXJ2YWwgYmVnaW5zLgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLyAKQVhJUzJfRVhURVJOIGF4dXRpbF9kYXRlX3RpbWVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXNzZXJ0aW9uX2dldF9ub3RfYmVmb3JlKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBHZXQgdGhlIHRpbWUgaW5zdGFudCBhdCB3aGljaCB0aGUgdmFsaWRpdHkgaW50ZXJ2YWwgaGFzIGVuZGVkCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovIApBWElTMl9FWFRFUk4gYXh1dGlsX2RhdGVfdGltZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fZ2V0X25vdF9vbl9vcl9hZnRlcigKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiBzaWduIG1ldGhvZHMgKi8KCi8qIAogKiBHZXQgd2VhdGhlciBhIGFzc2VydGlvbiBpcyBzaWduZWQuIFRoaXMgaXMgc2V0IHdoZW4gdGhlIEFzc2VydGlvbiBpcyBidWlsdCAKICogZnJvbSBhIG9tIG5vZGUuCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHJldHVybiBBWElTMl9UUlVFIGlmIHNpZ25lZC4KICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTApzYW1sX2Fzc2VydGlvbl9pc19zaWduZWQoCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IHdlYXRoZXIgYSBhc3NlcnRpb24gaXMgc2V0IHRvIGJlIHNpZ25lZC4gVGhpcyBhcHBsaWVzIHdoZW4gYnVpbGRpbmcgCiAqIHRoZSBTQU1MIG9iamVjdCBwcm9ncmFtbWF0aWNhbGx5LgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gQVhJUzJfVFJVRSBpZiB0aGUgb2JqZWN0IG1vZGVsIGlzIHNldCB0byBiZSBzaWduZWQuCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwKc2FtbF9hc3NlcnRpb25faXNfc2lnbl9zZXQoCglzYW1sX2Fzc2VydGlvbl90ICphc3NlcnRpb24sIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogVmVyaWZ5IHRoZSBhc3NlcnRpb24gYWNjb3JkaW5nIHRvIHRoZSBzaWduIGNvbnRleHQgc2V0IGluIHRoZSAKICogc2FtbF9hc3NlcnRpb25fc2V0X2RlZmF1bHRfc2lnbmF0dXJlIG9yIHNhbWxfYXNzZXJ0aW9uX3NldF9zaWduYXR1cmUgbWV0aG9kLgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwKc2FtbF9hc3NlcnRpb25fc2lnbmF0dXJlX3ZlcmlmeSgKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogU2lnbiB0aGUgYXNzZXJ0aW9uIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBzZXQgaW4gdGhlIAogKiBzYW1sX2Fzc2VydGlvbl9zZXRfZGVmYXVsdF9zaWduYXR1cmUgb3Igc2FtbF9hc3NlcnRpb25fc2V0X3NpZ25hdHVyZSBtZXRob2QuCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTApzYW1sX2Fzc2VydGlvbl9zaWduKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWF4aW9tX25vZGVfdCAqbm9kZSwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogUmVtb3ZlIHRoZSBpbmZvcm1hdGlvbiBzZXQgZm9yIHNpZ25pbmcgb3IgdmVyaWZ5aW5nIHRoZSBhc3NlcnRpb24uCiAqIEBwYXJhbSBhc3NlcnRpb24gU0FNTCBhc3NlcnRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fdW5zaWduKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBTZXQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHNpZ24gdGhlIG1lc3NhZ2UuIAogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBzaWduX2N0eCBveHNfc2lnbl9jdHhfdCBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHNpZ24gaW5mb3JtYXRpb24KICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fc2V0X2RlZmF1bHRfc2lnbmF0dXJlKAoJc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uLCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCW94c19zaWduX2N0eF90ICpzaWduX2N0eCk7CgovKiAKICogU2V0IHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBzaWduIHRoZSBtZXNzYWdlLgogKiBAcGFyYW0gYXNzZXJ0aW9uIFNBTUwgYXNzZXJ0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBzaWduX2N0eCBveHNfc2lnbl9jdHhfdCBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHNpZ24gaW5mb3JtYXRpb24KICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hc3NlcnRpb25fc2V0X3NpZ25hdHVyZSgKCXNhbWxfYXNzZXJ0aW9uX3QgKmFzc2VydGlvbiwgCgljb25zdCBheHV0aWxfZW52X3QgKmVudiwgCglveHNfc2lnbl9jdHhfdCAqc2lnbl9jdHgpOwoKCi8qIHN0YXRlbWVudCAqLwoKLyogCiAqIENyZWF0ZSBhIHNhbWwgc3RhdGVtZW50LiBTdGF0ZW1lbnQgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBjYW4gaG9sZCAKICogdGF0ZW1lbnQgb2JqZWN0IGNhbiBob2xkIG90aGVyIHN0YXRlbWVudHMgbGlrZSBBdXRoZXJpemF0aW9uIHN0YXRlbWVudHMuCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gc2FtbF9zdG10IG9iamVjdCB0byBob2xkIG90aGVyIHN0YW1lbnRzCiAqLwpBWElTMl9FWFRFUk4gc2FtbF9zdG10X3QgKiBBWElTMl9DQUxMIApzYW1sX3N0bXRfY3JlYXRlKAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIEZyZWUgYSBzYW1sIHN0YXRtZW50LiAKICogQHBhcmFtIHN0bXQgU0FNTCBzdG10IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX3N0bXRfZnJlZSgKCXNhbWxfc3RtdF90ICpzdG10LCAKCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBCdWlsZCBhIHNhbWwgc3RhdGVtZW50IGZyb20gYSBYTUwgbm9kZS4gVGhlIHN0YXRlbWVudCB0eXBlcyB0aGF0IGFyZSAKICogc3VwcG9ydGVkIGFyZSBBdXRoZW50aWNhdGlvbiBTdGF0ZW1lbnQsIEF0dHJpYnV0ZSBTdGF0ZW1lbnQsIAogKiBBdXRoZW50aWNhdGlvbiBEaWNpc2lvbiBTdGF0ZW1lbnQuCiAqIEBwYXJhbSBzdG10IFNBTUwgc3RtdCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N0bXRfYnVpbGQoCglzYW1sX3N0bXRfdCAqc3RtdCwgCglheGlvbV9ub2RlX3QgKm5vZGUsIAoJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2VyaWFsaXplIGEgc3RhdGVtZW50IHRvIGEgYXhpb20gbm9kZS4KICogQHBhcmFtIHN0bXQgU0FNTCBzdG10IG9iamVjdAogKiBAcGFyYW0gcGFyZW50IGlmIHNwZWNpZmllZCBjcmVhdGVkIG5vZGUgd2lsbCBiZSBhIGNoaWxkIG9mIHRoaXMgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9zdG10X3RvX29tKHNhbWxfc3RtdF90ICpzdG10LCBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IHRoZSB0eXBlIG9mIHRoZSBzdGF0ZW1lbnQuIAogKiBAcGFyYW0gc3RtdCBTQU1MIHN0bXQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHJldHVybiBzdGF0bWVudCB0eXBlIGFzIHNhbWxfc3RtdF90eXBlX3QKICovCkFYSVMyX0VYVEVSTiBzYW1sX3N0bXRfdHlwZV90IEFYSVMyX0NBTEwgCnNhbWxfc3RtdF9nZXRfdHlwZShzYW1sX3N0bXRfdCAqc3RtdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIHRoZSBzcGVjaWZpYyBzdGFtZW50IGluIHRoaXMgc3RhdGVtZW50LiAKICogQHBhcmFtIHN0bXQgU0FNTCBzdG10IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9zdG10X3QgKiBBWElTMl9DQUxMIApzYW1sX3N0bXRfZ2V0X3N0bXQoc2FtbF9zdG10X3QgKnN0bXQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBTZXQgdGhlIHR5cGUgb2Ygc3RhdGVtZW50LgogKiBAcGFyYW0gc3RtdCBTQU1MIHN0bXQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIHR5cGUgdHlwZSBvZiB0aGUgc3RhdGVtZW50IGFzIHNhbWxfc3RtdF90eXBlX3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3RtdF9zZXRfdHlwZShzYW1sX3N0bXRfdCAqc3RtdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIHNhbWxfc3RtdF90eXBlX3QgdHlwZSk7CgovKgogKiBTZXQgdGhlIHN0YXRlbWVudC4gSWYgYSBzdGF0bWVudCBpcyBhbHJlYWR5IHNwZWNpZmllZCBpdCB3aWxsIGJlIGZyZWVkLgogKiBAcGFyYW0gc3RtdCBTQU1MIHN0bXQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIHN0IHBvaW50ZXIgdG8gdGhlIHN0YXRlbWVudCB0byBiZSBzZXQKICogQHBhcmFtIHR5cGUgdHlwZSBvZiB0aGUgc3RhdGVtZW50IGFzIHNhbWxfc3RtdF90eXBlX3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3RtdF9zZXRfc3RtdChzYW1sX3N0bXRfdCAqc3RtdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJCQkJICAgdm9pZCAqc3QsIHNhbWxfc3RtdF90eXBlX3QgdHlwZSk7CgoKLypBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgc2FtbF9pZF9pbml0KHNhbWxfaWRfdCAqaWQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCBzYW1sX2lkX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyhjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci8qQVhJUzJfRVhURVJOIHZvaWQgQVhJUzJfQ0FMTCBzYW1sX2lkX3VuaW5pdChzYW1sX2lkX3QgKmlkLCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ki8KCgovKiBBdXRob3JpdHlCaW5kaW5nICovCgovKgogKiBDcmVhdGVzIGEgU0FNTCBBdXRob3JpdHlCaW5kaW5nLgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9hdXRoX2JpbmRpbmdfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9iaW5kaW5nX2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBGcmVlIGEgU0FNTCBBdXRoZXJpdHkgYmluZGluZy4KICogQHBhcmFtIGF1dGhfYmluZCBTQU1MIEF1dGhlcml0eSBiaW5kaW5nIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2F1dGhfYmluZGluZ19mcmVlKHNhbWxfYXV0aF9iaW5kaW5nX3QgKmF1dGhfYmluZCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogQ3JlYXRlIGEgU0FNTCBhdXRoZXJpdHkgYmluZGluZyBmcm9tIGEgWE1MIG5vZGUuCiAqIEBwYXJhbSBhdXRoX2JpbmQgU0FNTCBBdXRoZXJpdHkgYmluZGluZyBvYmplY3QKICogQHBhcmFtIG5vZGUgWE1MIG5vZGUgY29udGFpbmluZyB0aGUgYXV0aGVyaXR5IGJpbmRpbmcgCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9iaW5kaW5nX2J1aWxkKHNhbWxfYXV0aF9iaW5kaW5nX3QgKmF1dGhfYmluZCwgCgkJCQkJCWF4aW9tX25vZGVfdCAqbm9kZSwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2VyaWFsaXplIGFuIGF1dGggYmluZGluZyB0byBheGlvbSBub2RlCiAqIEBwYXJhbSBhdXRoX2JpbmQgU0FNTCBBdXRoZXJpdHkgYmluZGluZyBvYmplY3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9iaW5kaW5nX3RvX29tKHNhbWxfYXV0aF9iaW5kaW5nX3QgKmF1dGhfYmluZGluZywgCgkJCQkJCWF4aW9tX25vZGVfdCAqcGFyZW50LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIHR5cGUgb2YgU0FNTCBwcm90b2NvbCBxdWVyaWVzIHRvIHdoaWNoIHRoZSBhdXRob3JpdHkgZGVzY3JpYmVkIAogKiBieSB0aGlzIGVsZW1lbnQgd2lsbCByZXNwb25kLgogKiBAcGFyYW0gYXV0aF9iaW5kIFNBTUwgQXV0aGVyaXR5IGJpbmRpbmcgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2JpbmRpbmdfZ2V0X2F1dGhvaXR5X2tpbmQoc2FtbF9hdXRoX2JpbmRpbmdfdCAqYXV0aF9iaW5kLCAKCQkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIHRoZSBVUkkgaWRlbnRpZnlpbmcgdGhlIFNBTUwgcHJvdG9jb2wgYmluZGluZyB0byB1c2UgaW4gCiAqIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgYXV0aG9yaXR5LgogKiBAcGFyYW0gYXV0aF9iaW5kIFNBTUwgQXV0aGVyaXR5IGJpbmRpbmcgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2JpbmRpbmdfZ2V0X2JpbmRpbmcoc2FtbF9hdXRoX2JpbmRpbmdfdCAqYXV0aF9iaW5kaW5nLCAKCQkJCQkJCSAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIGEgVVJJIGRlc2NyaWJpbmcgaG93IHRvIGxvY2F0ZSBhbmQgY29tbXVuaWNhdGUgd2l0aCB0aGUgYXV0aG9yaXR5CiAqIEBwYXJhbSBhdXRoX2JpbmQgU0FNTCBBdXRoZXJpdHkgYmluZGluZyBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBheGlzMl9jaGFyX3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfYmluZGluZ19nZXRfbG9jYXRpb24oc2FtbF9hdXRoX2JpbmRpbmdfdCAqYXV0aF9iaW5kLCAKCQkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNldCB0aGUgdHlwZSBvZiBTQU1MIHByb3RvY29sIHF1ZXJpZXMgdG8gd2hpY2ggdGhlIGF1dGhvcml0eSBkZXNjcmliZWQgCiAqIGJ5IHRoaXMgZWxlbWVudCB3aWxsIHJlc3BvbmQuCiAqIEBwYXJhbSBhdXRoX2JpbmQgU0FNTCBBdXRoZXJpdHkgYmluZGluZyBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIGF1dGhfa2luZCBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFNBTUwgcHJvdG9jb2wgcXVlcmllcyAKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2JpbmRpbmdfc2V0X2F1dGhvcml0eV9raW5kKHNhbWxfYXV0aF9iaW5kaW5nX3QgKmF1dGhfYmluZCwgCgkJCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICphdXRoX2tpbmQpOwoKLyoKICogU2V0IHRoZSBVUkkgaWRlbnRpZnlpbmcgdGhlIFNBTUwgcHJvdG9jb2wgYmluZGluZyB0byB1c2UgaW4gCiAqIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgYXV0aG9yaXR5LgogKiBAcGFyYW0gYXV0aF9iaW5kIFNBTUwgQXV0aGVyaXR5IGJpbmRpbmcgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBiaW5kaW5nIFVSSSBpZGVudGlmeWluZyB0aGUgU0FNTCBwcm90b2NvbCBiaW5kaW5nIAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfYmluZGluZ19zZXRfYmluZGluZyhzYW1sX2F1dGhfYmluZGluZ190ICphdXRoX2JpbmQsIAoJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpiaW5kaW5nKTsKCi8qCiAqIFNldCBhIFVSSSBkZXNjcmliaW5nIGhvdyB0byBsb2NhdGUgYW5kIGNvbW11bmljYXRlIHdpdGggdGhlIGF1dGhvcml0eQogKiBAcGFyYW0gYXV0aF9iaW5kIFNBTUwgQXV0aGVyaXR5IGJpbmRpbmcgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBsb2NhdGlvbiBVUkkgZGVzY3JpYmluZyBsb2NhdGlvbiBhbmQgY29tbXVuaWNhdGlvbiBwcm90b2NvbAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfYmluZGluZ19zZXRfbG9jYXRpb24oc2FtbF9hdXRoX2JpbmRpbmdfdCAqYXV0aF9iaW5kLCAKCQkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKmxvY2F0aW9uKTsKCgovKiBzdWJqZWN0IGxvY2FsaXR5ICovCgovKgogKiBDcmVhdGUgYSBTQU1MIHN1YmplY3QgbG9jYWxpdHkuCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKiBBWElTMl9DQUxMIApzYW1sX3N1YmplY3RfbG9jYWxpdHlfY3JlYXRlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEZyZWUgYSBTQU1MIHN1YmplY3QgbG9jYWxpdHkuCiAqIEBwYXJhbSBzdWJfbG9jYWxpdHkgU0FNTCBzdWJqZWN0IGxvY2FsaXR5IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIHZvaWQgQVhJUzJfQ0FMTCAKc2FtbF9zdWJqZWN0X2xvY2FsaXR5X2ZyZWUoc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKnN1Yl9sb2NhbGl0eSwgCgkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFBvcHVsYXRlIGEgU0FNTCBzdWJqZWN0IGxvY2FsaXR5IGZyb20gYSBYTUwgbm9kZSBjb250YWluaW5nIGEgU0FNTCAKICogc3ViamVjdCBsb2NhbGl0eS4KICogQHBhcmFtIHN1Yl9sb2NhbGl0eSBTQU1MIHN1YmplY3QgbG9jYWxpdHkgb2JqZWN0CiAqIEBwYXJhbSBub2RlIFhNTCBub2RlIGNvbnRhaW5pbmcgdGhlIFNBTUwgc3ViamVjdCBsb2NhbGl0eQogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N1YmplY3RfbG9jYWxpdHlfYnVpbGQoc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKnN1Yl9sb2NhbGl0eSwgCgkJCQkJCQlheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhIHN1YmplY3QgbG9jYWxpdHkgdG8gYW4gYXhpb20gbm9kZS4KICogQHBhcmFtIHN1Yl9sb2NhbGl0eSBTQU1MIHN1YmplY3QgbG9jYWxpdHkgb2JqZWN0CiAqIEBwYXJhbSBwYXJlbnQgaWYgc3BlY2lmaWVkIGNyZWF0ZWQgbm9kZSB3aWxsIGJlIGEgY2hpbGQgb2YgdGhpcyBub2RlICAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBheGlvbV9ub2RlX3QgKkFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9sb2NhbGl0eV90b19vbShzYW1sX3N1YmplY3RfbG9jYWxpdHlfdCAqc3ViX2xvY2FsaXR5LCAKCQkJCQkJCWF4aW9tX25vZGVfdCAqcGFyZW50LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBlbnRpdHkgdGhhdCB3YXMgYXV0aGVudGljYXRlZC4KICogQHBhcmFtIHN1Yl9sb2NhbGl0eSBTQU1MIHN1YmplY3QgbG9jYWxpdHkgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gSVAgYWRkcmVzcwogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9sb2NhbGl0eV9nZXRfaXAoc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKnN1Yl9sb2NhbGl0eSwgCgkJCQkJCQkgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIHRoZSBETlMgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGVudGl0eSB0aGF0IHdhcyBhdXRoZW50aWNhdGVkLgogKiBAcGFyYW0gc3ViX2xvY2FsaXR5IFNBTUwgc3ViamVjdCBsb2NhbGl0eSBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHJldHVybiBETlMgYWRkcmVzcwogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9sb2NhbGl0eV9nZXRfZG5zKHNhbWxfc3ViamVjdF9sb2NhbGl0eV90ICpzdWJfbG9jYWxpdHksIAoJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBTZXQgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBlbnRpdHkgdGhhdCB3YXMgYXV0aGVudGljYXRlZC4KICogQHBhcmFtIHN1Yl9sb2NhbGl0eSBTQU1MIHN1YmplY3QgbG9jYWxpdHkgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBpcCBJUCBhZGRyZXNzCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9sb2NhbGl0eV9zZXRfaXAoc2FtbF9zdWJqZWN0X2xvY2FsaXR5X3QgKnN1Yl9sb2NhbGl0eSwgCgkJCQkJCQkgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aXMyX2NoYXJfdCAqaXApOwoKLyoKICogU2V0IHRoZSBETlMgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGVudGl0eSB0aGF0IHdhcyBhdXRoZW50aWNhdGVkLgogKiBAcGFyYW0gc3ViX2xvY2FsaXR5IFNBTUwgc3ViamVjdCBsb2NhbGl0eSBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIGlwIEROUyBhZGRyZXNzCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9sb2NhbGl0eV9zZXRfZG5zKHNhbWxfc3ViamVjdF9sb2NhbGl0eV90ICpzdWJfbG9jYWxpdHksIAoJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpkbnMpOwoKCi8qIHN1YmplY3QgKi8KCi8qCiAqIENyZWF0ZSBhIFNBTUwgc3ViamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIHNhbWxfc3ViamVjdF90ICogQVhJUzJfQ0FMTCAKc2FtbF9zdWJqZWN0X2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBGcmVlIGEgU0FNTCBzdWJqZWN0CiAqIEBwYXJhbSBzdWJqZWN0IFNBTUwgc3ViamVjdCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiB2b2lkIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9mcmVlKHNhbWxfc3ViamVjdF90ICpzdWJqZWN0LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBQb3B1bGF0ZXMgYSBTQU1MIHN1YmplY3QgZnJvbSBhIFhNTCBub2RlIGNvbnRhaW5pbmcgYSBTQU1MIHN1YmplY3QuCiAqIEBwYXJhbSBzdWJqZWN0IFNBTUwgc3ViamVjdCBvYmplY3QKICogQHBhcmFtIG5vZGUgWE1MIG5vZGUgY29udGFpbmluZyB0aGUgU0FNTCBzdWJqZWN0IGxvY2FsaXR5CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9idWlsZChzYW1sX3N1YmplY3RfdCAqc3ViamVjdCwgCgkJCQkgICBheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhIFNBTUwgc3ViamVjdCB0byBhIGF4aW9tIG5vZGUuCiAqIEBwYXJhbSBzdWJqZWN0IFNBTUwgc3ViamVjdCBvYmplY3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF90b19vbShzYW1sX3N1YmplY3RfdCAqc3ViamVjdCwgCgkJCQkgICBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIHRoZSBuYW1lZCBpZCBvZiB0aGUgc3ViamVjdC4KICogQHBhcmFtIHN1YmplY3QgU0FNTCBzdWJqZWN0IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcmV0dXJuIG5hbWVkIGlkIG9iamVjdAogKi8KQVhJUzJfRVhURVJOIHNhbWxfbmFtZWRfaWRfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9nZXRfbmFtZWRfaWQoc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFJldHVybiB0aGUgbGlzdCBvZiBjb25maXJtYXRpb24gbWV0aG9kcy4gQXJyYXkgbGlzdCBjb250YWlucyBzdHJpbmcgdmFsdWVzLgogKiBAcGFyYW0gc3ViamVjdCBTQU1MIHN1YmplY3Qgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gbGlzdCBjb250YWluaW5nIHRoZSBzdWJqZWN0IGNvbmZpcm1hdGlvbiBtZXRob2RzCiAqLwpBWElTMl9FWFRFUk4gYXh1dGlsX2FycmF5X2xpc3RfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9nZXRfY29uZmlybWF0aW9uX21ldGhvZHMoc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QsIAoJCQkJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFJldHVybiB0aGUgbGlzdCBvZiBjb25maXJtYXRpb24gZGF0YS4gQXJyYXkgbGlzdCBjb250YWlucyBzdHJpbmcgdmFsdWVzLgogKiBAcGFyYW0gc3ViamVjdCBTQU1MIHN1YmplY3Qgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gbGlzdCBjb250YWluaW5nIHRoZSBzdWJqZWN0IGNvbmZpcm1hdGlvbiBkYXRhCiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9zdWJqZWN0X2dldF9jb25maXJtYXRpb25fZGF0YShzYW1sX3N1YmplY3RfdCAqc3ViamVjdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIGFuIGF4aW9tIG5vZGUgY29udGFpbmluZyB0aGUga2V5IGluZm8gb2YgdGhpcyBzdWJqZWN0LiBUaGUgYXhpb20gbm9kZSAKICogaXMgYSBkczprZXlpbmZvIG9mIFhNTCBzaWduYXR1cmUuIAogKiBAcGFyYW0gc3ViamVjdCBTQU1MIHN1YmplY3Qgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9zdWJqZWN0X2dldF9rZXlfaW5mbyhzYW1sX3N1YmplY3RfdCAqc3ViamVjdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2V0IHRoZSBuYW1lZCBpZCBvZiB0aGUgc3ViamVjdC4KICogQHBhcmFtIHN1YmplY3QgU0FNTCBzdWJqZWN0IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0ICAKICogQHBhcmFtIG5hbWVkX2lkIGEgbmFtZWQgaWQgdG8gYmUgc2V0CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9zZXRfbmFtZWRfaWQoc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QsIAoJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBzYW1sX25hbWVkX2lkX3QgKm5hbWVkX2lkKTsKCi8qCiAqIFNldCB0aGUgY29uZmlybWF0aW9uIGFzIGEgYXJyYXkgbGlzdC4gVGhlIGFycmF5IGxpc3Qgc2hvdWxkIGNvbnRhaW4gCiAqIHN0cmluZyB2YWx1ZXMuIElmIGNvbmZpcm1hdGlvbiBtZXRob2RzIGFyZSBhbHJlYWR5IHByZXNlbnQgdGhleSB3aWxsIAogKiBiZSBmcmVlZC4KICogQHBhcmFtIHN1YmplY3QgU0FNTCBzdWJqZWN0IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0ICAKICogQHBhcmFtIGxpc3QgbGlzdCBvZiBjb25maXJtYXRpb24gbWV0aG9kcwogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N1YmplY3Rfc2V0X2NvbmZpcm1hdGlvbl9tZXRob2RzKHNhbWxfc3ViamVjdF90ICpzdWJqZWN0LCAKCQkJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgCgkJCQkJCQkJCSAgYXh1dGlsX2FycmF5X2xpc3RfdCAqbGlzdCk7Ci8qIAogKiBBZGQgYSBzdWJqZWN0IGNvbmZpcm1hdGlvbiB0byB0aGlzIHN1YmplY3QuCiAqIEBwYXJhbSBzdWJqZWN0IFNBTUwgc3ViamVjdCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gc3ViX2NvbmZpcm1hdGlvbiBzdWJqZWN0IGNvbmZpcm1hdGlvbgogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N1YmplY3RfYWRkX2NvbmZpcm1hdGlvbihzYW1sX3N1YmplY3RfdCAqc3ViamVjdCwgCgkJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCAKCQkJCQkJCSAgYXhpczJfY2hhcl90ICpzdWJfY29uZmlybWF0aW9uKTsKCi8qIAogKiBSZW1vdmUgYSBzdWJqZWN0IGNvbmZpcm1hdGluIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAqIEBwYXJhbSBzdWJqZWN0IFNBTUwgc3ViamVjdCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHN1YmplY3QgY29uZmlybWF0aW9uCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9yZW1vdmVfc3ViamVjdF9jb25maWlybWF0aW9uKHNhbWxfc3ViamVjdF90ICpzdWJqZWN0LCAKCQkJCQkJCQkJCSAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpbmRleCk7CgovKiAKICogU2V0IGFuIFhNTCBTaWduYXR1cmUga2V5aW5mbyBlbGVtZW50IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgY3J5cHRvZ3JhcGhpYyAKICoga2V5IGhlbGQgYnkgdGhlIHN1YmplY3QKICogQHBhcmFtIHN1YmplY3QgU0FNTCBzdWJqZWN0IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBub2RlIFhNTCBzaWduYXR1cmUga2V5aW5mbyBlbGVtZW50CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9zZXRfa2V5X2luZm8oc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QsIAoJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlvbV9ub2RlX3QgKm5vZGUpOwoKLyogc3ViamVjdCBzdGF0ZW1lbnQgKi8KCi8qCiAqIEJ1aWxkcyBhIHN1YmplY3Qgc3RhdGVtZW50IGZyb20gYSBvbSBub2RlIGNvbnRhaW5pbmcgYSBzdWJqZWN0IHN0YXRlbWVudC4KICogQHBhcmFtIHN1YmplY3Rfc3RtdCBhIHN1YmplY3Qgc3RhdGVtZW50IG9iamVjdAogKiBAcGFyYW0gbm9kZSBvbSBub2RlIGNvbnRhaW5pbmcgYSBzdWJqZWN0IHN0YXRlbWVudAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLyAKQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N1YmplY3Rfc3RtdF9idWlsZChzYW1sX3N1YmplY3Rfc3RtdF90ICpzdWJqZWN0X3N0bXQsIAoJCQkJCQlheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBGcmVlIGEgc3ViamVjdCBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBzdWJqZWN0X3N0bXQgYSBzdWJqZWN0IHN0YXRlbWVudCBvYmplY3QgCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiB2b2lkIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9zdG10X2ZyZWUoc2FtbF9zdWJqZWN0X3N0bXRfdCAqc3ViamVjdF9zdG10LCAKCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogQ3JlYXRlIGEgc3ViamVjdCBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIGEgc3ViamVjdCBzdGF0ZW1lbnQgb2JqZWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9zdWJqZWN0X3N0bXRfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9zdG10X2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBTZXJpYWxpemUgYSBzdWJqZWN0IHN0YXRtZW50IHRvIGFuIGF4aW9tIG5vZGUKICogQHBhcmFtIHN1YmplY3Rfc3RtdCBhIHN1YmplY3Qgc3RhdGVtZW50IG9iamVjdCAKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfc3ViamVjdF9zdG10X3RvX29tKHNhbWxfc3ViamVjdF9zdG10X3QgKnN1YmplY3Rfc3RtdCwgCgkJCQkJCWF4aW9tX25vZGVfdCAqcGFyZW50LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogU2V0IHRoZSBzdWJqZWN0IG9mIHRoZSBzdWJqZWN0IHN0YXRlbWVudAogKiBAcGFyYW0gc3ViamVjdF9zdG10IGEgc3ViamVjdCBzdGF0ZW1lbnQgb2JqZWN0IAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcGFyYW0gc3ViamVjdCBzdWJqZWN0IHRvIGJlIHNldAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX3N1YmplY3Rfc3RtdF9zZXRfc3ViamVjdChzYW1sX3N1YmplY3Rfc3RtdF90ICpzdWJqZWN0X3N0bXQsIAoJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QpOwoKLyoKICogU2V0IHRoZSBzdWJqZWN0IG9mIHRoZSBzdWJqZWN0IHN0YXRlbWVudAogKiBAcGFyYW0gc3ViamVjdF9zdG10IGEgc3ViamVjdCBzdGF0ZW1lbnQgb2JqZWN0IAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcGFyYW0gc3ViamVjdCBzdWJqZWN0IHRvIGJlIHNldAogKi8KQVhJUzJfRVhURVJOIHNhbWxfc3ViamVjdF90ICogQVhJUzJfQ0FMTCAKc2FtbF9zdWJqZWN0X3N0bXRfZ2V0X3N1YmplY3Qoc2FtbF9zdWJqZWN0X3N0bXRfdCAqc3ViamVjdF9zdG10LCAKCQkJCQkJCSAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogYXV0aCBkZXNpY2luIHN0YXRlbWVudCAqLwovKgogKiBDcmVhdGUgYW4gYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0LgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcmV0dXJuIGFuIGF1dGhlcml6YXRpb24gZGVjaXNpb24gc3RhdGVtZW50IG9iamVjdAogKi8KQVhJUzJfRVhURVJOIHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogRnJlZSBhbiBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QuCiAqIEBwYXJhbSBhdXRoX2Rlc19zdG10IGEgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF9mcmVlKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFBvcHVsYXRlcyBhbiBzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF90IG9iamVjdCBmcm9tIGEgWE1MIG5vZGUgY29udGFpbmluZwogKiBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudC4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIG5vZGUgeG1sIG5vZGUgY29udGFpbmluZyBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIG9iamVjdC4KICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfYnVpbGQoc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfdCAqYXV0aF9kZXNfc3RtdCwgCgkJCQkJCQkgIGF4aW9tX25vZGVfdCAqbm9kZSwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2VyaWFsaXplIGFuIHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3Qgb2JqZWN0IHRvIGEgYXhpb20gbm9kZS4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3RvX29tKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJICBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IHRoZSBzdWJqZWN0IHdoaWNoIGlzIGluIHRoaXMgYXV0aGVpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudC4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBzYW1sX3N1YmplY3RfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X2dldF9zdWJqZWN0KHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci8qCiAqIFJldHVybiBhIFVSSSByZWZlcmVuY2UgaWRlbnRpZnlpbmcgdGhlIHJlc291cmNlIHRvIHdoaWNoIGFjY2VzcyAKICogYXV0aG9yaXphdGlvbiBpcyBzb3VnaHQuCiAqIEBwYXJhbSBhdXRoX2Rlc19zdG10IGEgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfZ2V0X3Jlc291cmNlKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJCQkgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIHRoZSBkZWNpc2lvbiByZW5kZXJlZCBieSB0aGUgU0FNTCBhdXRob3JpdHkgd2l0aCByZXNwZWN0IHRvIAogKiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLiAKICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBheGlzMl9jaGFyX3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF9nZXRfZGVzaWNpb24oc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfdCAqYXV0aF9kZXNfc3RtdCwgCgkJCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdGlvbnMgYXV0aG9yaXplZCB0byBiZSBwZXJmb3JtZWQgb24gdGhlIHNwZWNpZmllZCAKICogcmVzb3VyY2UuCiAqIEBwYXJhbSBhdXRoX2Rlc19zdG10IGEgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXh1dGlsX2FycmF5X2xpc3RfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X2dldF9hY3Rpb25zKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucyB0aGF0IHRoZSBTQU1MIGF1dGhvcml0eSByZWxpZWQgb24gaW4gbWFraW5nIAogKiB0aGUgZGVjaXNpb24uCiAqIEBwYXJhbSBhdXRoX2Rlc19zdG10IGEgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gc2FtbF9ldmlkZW5jZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfZ2V0X2V2aWRlbmNlKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJCQkgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2V0IGEgVVJJIHJlZmVyZW5jZSBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2UgdG8gd2hpY2ggYWNjZXNzIAogKiBhdXRob3JpemF0aW9uIGlzIHNvdWdodC4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIHJlc291cmNlIGEgVVJJIHJlZmVyZW5jaW5nIHRoZSByZXNvdXJjZQogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF9zZXRfcmVzb3VyY2Uoc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfdCAqYXV0aF9kZXNfc3RtdCwgCgkJCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpyZXNvdXJjZSk7CgovKgogKiBTZXQgdGhlIGRlY2lzaW9uIHJlbmRlcmVkIGJ5IHRoZSBTQU1MIGF1dGhvcml0eSB3aXRoIHJlc3BlY3QgdG8gCiAqIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmcgdmFsdWUuIFZhbGlkIGRlY2lzaW9ucyBhcmUgUGVybWl0LCAKICogRGVueSBhbmQgSW5kZXRlcm1pbmF0ZS4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIGRlY2lzaW9uIHNldCB0aGUgZGVjaXNpb24uCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3NldF9kZXNpY2lvbihzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF90ICphdXRoX2Rlc19zdG10LCAKCQkJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKmRlc2ljaW9uKTsKCi8qIAogKiBTZXQgdGhlIGxpc3Qgb2YgYWN0aW9ucyBhdXRob3JpemVkIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIAogKiByZXNvdXJjZS4KICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIGxpc3QgbGlzdCBjb250YWluaW5nIGFjdGlvbiBvYmplY3RzCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3NldF9hY3Rpb25zKHNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3QgKmF1dGhfZGVzX3N0bXQsIAoJCQkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXh1dGlsX2FycmF5X2xpc3RfdCAqbGlzdCk7CgovKgogKiBSZW1vdmUgYW4gYWN0aW9uIGluIHRoZSBzcGVjaWZpZWQgaW5kZXguCiAqIEBwYXJhbSBhdXRoX2Rlc19zdG10IGEgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9kZXNpY2lvbl9zdG10X3JlbW92ZV9hY3Rpb24oc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfdCAqYXV0aF9kZXNfc3RtdCwgCgkJCQkJCQkJCSAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpbmRleCk7CgovKgogKiBBZGQgYW4gYWN0aW9uLgogKiBAcGFyYW0gYXV0aF9kZXNfc3RtdCBhIGF1dGhlcml6YXRpb24gZGVjaXNpb24gc3RhdGVtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBvYmplY3QgdG8gYmUgYWRkZWQKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX2Rlc2ljaW9uX3N0bXRfYWRkX2FjdGlvbihzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF90ICphdXRoX2Rlc19zdG10LCAKCQkJCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgc2FtbF9hY3Rpb25fdCAqYWN0aW9uKTsKCi8qCiAqIFNldCB0aGUgc3ViamVjdCBvZiB0aGUgYXV0aGVyaXphdGlvbiBkZWNpc2lvbiBvYmplY3QKICogQHBhcmFtIGF1dGhfZGVzX3N0bXQgYSBhdXRoZXJpemF0aW9uIGRlY2lzaW9uIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIHN1YmplY3Qgc3ViamVjdCB0byBiZSBhZGRlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF9zZXRfc3ViamVjdChzYW1sX2F1dGhfZGVzaWNpb25fc3RtdF90ICphdXRoX2Rlc19zdG10LCAKCQkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIHNhbWxfc3ViamVjdF90ICpzdWJqZWN0KTsKCi8qIGF1dGggc3RhdGVtZW50ICovCgovKgogKiBDcmVhdGUgYW4gYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQuCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQgb2JqZWN0CiAqLyAKQVhJUzJfRVhURVJOIHNhbWxfYXV0aF9zdG10X3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogRnJlZSBhIGF1dGhlcml6YXRpb24gc3RhdGVtZW50LgogKiBAcGFyYW0gYXV0aF9zdG10IGF1dGhlcml6YXRpb24gc3RhdG1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9mcmVlKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUG9wdWxhdGVzIGFuIGF1dGhfc3RtdCBmcm9tIGEgb20gbm9kZSBjb250YWluaW5nIGEgYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQKICogQHBhcmFtIGF1dGhfc3RtdCBhdXRoZXJpemF0aW9uIHN0YXRtZW50IG9iamVjdAogKiBAcGFyYW0gbm9kZSBhbiBvbSBub2RlIGNvbnRhaW5pbmcgYW4gYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX3N0bXRfYnVpbGQoc2FtbF9hdXRoX3N0bXRfdCAqYXV0aF9zdG10LCAKCQkJCQkgYXhpb21fbm9kZV90ICpub2RlLCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBTZXJpYWxpemUgYW4gYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQgdG8gYW4gb20gbm9kZQogKiBAcGFyYW0gYXV0aF9zdG10IGF1dGhlcml6YXRpb24gc3RhdG1lbnQgb2JqZWN0CiAqIEBwYXJhbSBwYXJlbnQgaWYgc3BlY2lmaWVkIGNyZWF0ZWQgbm9kZSB3aWxsIGJlIGEgY2hpbGQgb2YgdGhpcyBub2RlICAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBheGlvbV9ub2RlX3QgKkFYSVMyX0NBTEwgCnNhbWxfYXV0aF9zdG10X3RvX29tKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJIGF4aW9tX25vZGVfdCAqcGFyZW50LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gYSBVUkkgcmVmZXJlbmNlIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIHRoYXQgCiAqIHRvb2sgcGxhY2UuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIFVSSSByZWZlcmVuY2UgCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX3N0bXRfZ2V0X2F1dGhfbWV0aG9kKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGF1dGhlbnRpY2F0aW9uIHRvb2sgcGxhY2UuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIHRpbWUgYXQgd2hpY2ggYXV0aGVudGljYXRpb24gdG9vayBwbGFjZSAKICovCkFYSVMyX0VYVEVSTiBheHV0aWxfZGF0ZV90aW1lX3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9nZXRfYXV0aF9pbnN0YW50KHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUmV0dXJuIGEgbGlzdCBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJqZWN0IG9mIAogKiB0aGUgc3RhdGVtZW50IHRoYXQgbWF5IGJlIGF2YWlsYWJsZS4KICogQHBhcmFtIGF1dGhfc3RtdCBhdXRoZXJpemF0aW9uIHN0YXRtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gYSBsaXN0IG9mIGF1dGhlcml6YXRpb24gYmluaW5ncwogKi8KQVhJUzJfRVhURVJOIGF4dXRpbF9hcnJheV9saXN0X3QgKiBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9nZXRfYXV0aF9iaW5kaW5ncyhzYW1sX2F1dGhfc3RtdF90ICphdXRoX3N0bXQsIAoJCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBlbnRpdHkgdGhhdCB3YXMgYXV0aGVudGljYXRlZC4KICogQHBhcmFtIGF1dGhfc3RtdCBhdXRoZXJpemF0aW9uIHN0YXRtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gYW4gSVAgYWRkcmVzcwogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9zdG10X2dldF9zdWJqZWN0X2lwKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLyoKICogUmV0dXJuIHRoZSBETlMgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGVudGl0eSB0aGF0IHdhcyBhdXRoZW50aWNhdGVkLgogKiBAcGFyYW0gYXV0aF9zdG10IGF1dGhlcml6YXRpb24gc3RhdG1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHJldHVybiBhbiBETlMgYWRkcmVzcwogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXV0aF9zdG10X2dldF9zdWJqZWN0X2RucyhzYW1sX2F1dGhfc3RtdF90ICphdXRoX3N0bXQsIAoJCQkJCQkJICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFNldCB0aGUgc3ViamVjdCBvZiB0aGUgYXV0aGVyaXphdGlvbiBzdGF0ZW1lbnQKICogQHBhcmFtIGF1dGhfc3RtdCBhdXRoZXJpemF0aW9uIHN0YXRtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBzdWJqZWN0IGEgc3ViamVjdCB0byBiZSBhZGRlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9zZXRfc3ViamVjdChzYW1sX2F1dGhfc3RtdF90ICphdXRoX3N0bXQsIAoJCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgc2FtbF9zdWJqZWN0X3QgKnN1YmplY3QpOwoKLyoKICogU2V0IGEgVVJJIHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0aGF0IAogKiB0b29rIHBsYWNlLgogKiBAcGFyYW0gYXV0aF9zdG10IGF1dGhlcml6YXRpb24gc3RhdG1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIG1ldGhvZCBVUkkgcmVmZXJlbmNlIAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9zZXRfYXV0aF9tZXRob2Qoc2FtbF9hdXRoX3N0bXRfdCAqYXV0aF9zdG10LCAKCQkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKm1ldGhvZCk7CgovKgogKiBTZXQgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGF1dGhlbnRpY2F0aW9uIHRvb2sgcGxhY2UuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gZHQgdGltZSBhdCB3aGljaCBhdXRoZW50aWNhdGlvbiB0b29rIHBsYWNlIAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9zZXRfYXV0aF9pbnN0YW50KHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4dXRpbF9kYXRlX3RpbWVfdCAqZHQpOwoKLyoKICogU2V0IGEgbGlzdCBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJqZWN0IG9mIAogKiB0aGUgc3RhdGVtZW50IHRoYXQgbWF5IGJlIGF2YWlsYWJsZSBhcyBhdXRoX2JpbmRpbmdzLgogKiBAcGFyYW0gYXV0aF9zdG10IGF1dGhlcml6YXRpb24gc3RhdG1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGxpc3QgYSBsaXN0IG9mIGF1dGhlcml6YXRpb24gYmluaW5ncwogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9zZXRfYXV0aF9iaW5kaW5ncyhzYW1sX2F1dGhfc3RtdF90ICphdXRoX3N0bXQsIAoJCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXh1dGlsX2FycmF5X2xpc3RfdCAqbGlzdCk7CgovKgogKiBBZGQgYSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJqZWN0IG9mIAogKiB0aGUgc3RhdGVtZW50IHRoYXQgbWF5IGJlIGF2YWlsYWJsZSBhcyBhbiBhdXRoX2JpbmRpbmcuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gYmluZCBhbiBhdXRob3JpdHkgYmluZGluZwogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9hZGRfYXV0aF9iaW5kaW5nKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIHNhbWxfYXV0aF9iaW5kaW5nX3QgKmJpbmQpOwoKLyoKICogUmVtb3ZlIGFuIGF1dGhvcml0eSBiaW5kaW5nIGZyb20gYSBhdXRoX3N0YXRlbWVudC4KICogQHBhcmFtIGF1dGhfc3RtdCBhdXRoZXJpemF0aW9uIHN0YXRtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgYXV0aG9yaXR5IGJpbmRpbmcgdG8gYmUgcmVtb3ZlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9yZW1vdmVfYXV0aF9iaW5kaW5nKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkJICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpbmRleCk7CgovKgogKiBTZXQgdGhlIEROUyBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gZW50aXR5IHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gZG5zIGEgRE5TIGFkZHJlc3MKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdXRoX3N0bXRfc2V0X3N1YmplY3RfZG5zKHNhbWxfYXV0aF9zdG10X3QgKmF1dGhfc3RtdCwgCgkJCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpkbnMpOwoKLyoKICogU2V0IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gZW50aXR5IHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQuCiAqIEBwYXJhbSBhdXRoX3N0bXQgYXV0aGVyaXphdGlvbiBzdGF0bWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gaXAgYW4gSVAgYWRkcmVzcwogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1dGhfc3RtdF9zZXRfc3ViamVjdF9pcChzYW1sX2F1dGhfc3RtdF90ICphdXRoX3N0bXQsIAoJCQkJCQkJICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICppcCk7CgovKiBhdHRyaWJ1dGUgc3RhdGVtZW50ICovCgovKgogKiBDcmVhdGUgYSBhdHRyaWJ1dGUgc3RhdGVtZW50LgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gc2FtbCBhdHRyaWJ1dGUgb2JqZWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9hdHRyX3N0bXRfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9zdG10X2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBGcmVlIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQuCiAqIEBwYXJhbSBhdHRyX3N0bXQgcG9pbnRlciB0byBhbiBhdHRyaWJ1dGUgc3RhdGVtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2F0dHJfc3RtdF9mcmVlKHNhbWxfYXR0cl9zdG10X3QgKmF0dHJfc3RtdCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFBvcHVsYXRlcyBhIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0IGZyb20gYSBheGlvbSBub2RlIGNvbnRhaW5pbmcgYSAKICogYXR0cmlidXRlIHN0YXRlbWVudC4KICogQHBhcmFtIGF0dHJfc3RtdCBwb2ludGVyIHRvIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBub2RlIG9tIG5vZGUgY29udGFpbmluZyBhIGF0dHJpYnV0ZSBzdGF0ZW1lbnQKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F0dHJfc3RtdF9idWlsZChzYW1sX2F0dHJfc3RtdF90ICphdHRyX3N0bXQsIAoJCQkJCSBheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhbiBzYW1sX2F0dHJfc3RtdCB0byBhbiBvbSBub2RlCiAqIEBwYXJhbSBhdHRyX3N0bXQgcG9pbnRlciB0byBhbiBhdHRyaWJ1dGUgc3RhdGVtZW50IG9iamVjdAogKiBAcGFyYW0gcGFyZW50IGlmIHNwZWNpZmllZCBjcmVhdGVkIG5vZGUgd2lsbCBiZSBhIGNoaWxkIG9mIHRoaXMgbm9kZSAgCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBheGlvbV9ub2RlX3QgKiBBWElTMl9DQUxMIApzYW1sX2F0dHJfc3RtdF90b19vbShzYW1sX2F0dHJfc3RtdF90ICphdHRyX3N0bXQsIAoJCQkJCSBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IHRoZSBzYW1sIHN1YmplY3QgaW4gdGhpcyBhdHRyaWJ1dGUgc3RhdGVtZW50LgogKiBAcGFyYW0gYXR0cl9zdG10IHBvaW50ZXIgdG8gYW4gYXR0cmlidXRlIHN0YXRlbWVudCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIHNhbWwgc3ViamVjdAogKi8KQVhJUzJfRVhURVJOIHNhbWxfc3ViamVjdF90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX3N0bXRfZ2V0X3N1YmplY3Qoc2FtbF9hdHRyX3N0bXRfdCAqYXR0cl9zdG10LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBHZXQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBpbiB0aGlzIGF0dHJpYnV0ZSBzdGF0ZW1lbnQuCiAqIEBwYXJhbSBhdHRyX3N0bXQgcG9pbnRlciB0byBhbiBhdHRyaWJ1dGUgc3RhdGVtZW50IG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gYXJyYXkgbGlzdCBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUgb2JqZWN0cwogKi8KQVhJUzJfRVhURVJOIGF4dXRpbF9hcnJheV9saXN0X3QgKiBBWElTMl9DQUxMIApzYW1sX2F0dHJfc3RtdF9nZXRfYXR0cmlidXRlcyhzYW1sX2F0dHJfc3RtdF90ICphdHRyX3N0bXQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNldCB0aGUgc3ViamVjdCBvZiB0aGlzIGF0dHJpYnV0ZSBzdGF0ZW1lbnQKICogQHBhcmFtIGF0dHJfc3RtdCBwb2ludGVyIHRvIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIHN1YmplY3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9zdG10X3NldF9zdWJqZWN0KHNhbWxfYXR0cl9zdG10X3QgKmF0dHJfc3RtdCwgCgkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBzYW1sX3N1YmplY3RfdCAqc3ViamVjdCk7CgovKgogKiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgYXMgYSBsaXN0LiBJZiB0aGUgYXR0cmlidXRlIAogKiBzdGF0ZW1lbnQgYWxyZWFkeSBjb250YWlucyBhdHRyaWJ1dGVzIHRoZXkgd2lsbCBiZSByZXBsYWNlZC4KICogQHBhcmFtIGF0dHJfc3RtdCBwb2ludGVyIHRvIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGxpc3QgYXR0cmlidXRlIGxpc3QKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX3N0bXRfc2V0X2F0dHJpYnV0ZXMoc2FtbF9hdHRyX3N0bXRfdCAqYXR0cl9zdG10LCAKCQkJCQkJCSAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4dXRpbF9hcnJheV9saXN0X3QgKmxpc3QpOwoKLyoKICogQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHN0YXRlbWVudCAgICAgICAKICogQHBhcmFtIGF0dHJfc3RtdCBwb2ludGVyIHRvIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGF0dHJpYnV0ZSBhbiBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX3N0bXRfYWRkX2F0dHJpYnV0ZShzYW1sX2F0dHJfc3RtdF90ICphdHRyX3N0bXQsIAoJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBzYW1sX2F0dHJfdCAqYXR0cmlidXRlKTsKCi8qIAogKiBSZW1vdmUgYW4gYXR0cmlidXRlIGF0IHRoZSBnaXZlbiBpbmRleC4KICogQHBhcmFtIGF0dHJfc3RtdCBwb2ludGVyIHRvIGFuIGF0dHJpYnV0ZSBzdGF0ZW1lbnQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBhdHRyaWJ1dGUKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX3N0bXRfcmVtb3ZlX2F0dHJpYnV0ZShzYW1sX2F0dHJfc3RtdF90ICphdHRyX3N0bXQsIAoJCQkJCQkJCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaW5kZXgpOwoKLyogY29uZGl0aW9uICovCgovKgogKiBDcmVhdGUgYSBnZW5lcmljIGNvbmRpdGlvbi4gQ29uZGl0aW9uIG9iamVjdHMgaG9sZHMgbW9yZSBzcGVjaWZpYyAKICogY29uZGl0aW9ucy4gVGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgY29uZGl0aW9uIGRldGVybWluZXMgdGhlIHNwZWNpZmljIAogKiBjb25kaXRpb24uCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBzYW1sX2NvbmRpdGlvbl90ICogQVhJUzJfQ0FMTCAKc2FtbF9jb25kaXRpb25fY3JlYXRlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEZyZWUgYSBjb25kaXRpb24gb2JqZWN0LiBUaGUgc3BlY2lmaWMgY29uZGl0aW9uIHdoaWNoIGlzIGluIHRoaXMgY29uZGl0aW9ucyAKICogd2lsbCBhbHNvIGJlIGZyZWVkLgogKiBAcGFyYW0gY29uZCBwb2ludGVyIHRvIGEgY29uZGl0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2NvbmRpdGlvbl9mcmVlKHNhbWxfY29uZGl0aW9uX3QgKmNvbmQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFBvcHVsYXRlcyBhIGNvbmRpdGlvbiBmcm9tIGEgb20gbm9kZSBjb250YWluaW5nIGEgY29uZGl0aW9uLiBBZnRlciB0aGlzIGEgCiAqIHNwZWNpZmljIGNvbmRpdGlvbiB3aWxsIGJlIGJ1aWx0IGFuZCBzZXQgdG8gdGhpcyBjb25kaXRpb24uIAogKiBAcGFyYW0gY29uZCBwb2ludGVyIHRvIGEgY29uZGl0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBub2RlIG9tIG5vZGUgY29udGFpbmluZyBhIGNvbmRpdGlvbgogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2NvbmRpdGlvbl9idWlsZChzYW1sX2NvbmRpdGlvbl90ICpjb25kLCAKCQkJCQkgYXhpb21fbm9kZV90ICpub2RlLCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogU2VyaWFsaXplIGEgY29uZGl0aW9uIHRvIGEgb20gbm9kZS4gCiAqIEBwYXJhbSBjb25kIHBvaW50ZXIgdG8gYSBjb25kaXRpb24gb2JqZWN0CiAqIEBwYXJhbSBwYXJlbnQgaWYgc3BlY2lmaWVkIGNyZWF0ZWQgbm9kZSB3aWxsIGJlIGEgY2hpbGQgb2YgdGhpcyBub2RlICAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfY29uZGl0aW9uX3RvX29tKHNhbWxfY29uZGl0aW9uX3QgKmNvbmQsIAoJCQkJCSBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2V0IHRoZSBzcGVjaWZpYyBjb25kaXRpb24gZm9yIHRoaXMgY29uZGl0aW9uLgogKiBAcGFyYW0gY29uZCBwb2ludGVyIHRvIGEgY29uZGl0aW9uIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBjb25kaXRpb24gdGhlIHNwZWNpZmljIGNvbmRpdGlvbgogKiBAcGFyYW0gdHlwZSBjb25kaXRpb24gdHlwZQogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2NvbmRpdGlvbl9zZXRfY29uZGl0aW9uKHNhbWxfY29uZGl0aW9uX3QgKmNvbmQsIAoJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCB2b2lkICogY29uZGl0aW9uLCAKCQkJCQkJCSBzYW1sX2NvbmRfdHlwZV90IHR5cGUpOwoKLyoKICogU2V0IHRoZSB0eXBlIG9mIHRoZSBjb25pdGlvbi4gCiAqIEBwYXJhbSBjb25kIHBvaW50ZXIgdG8gYSBjb25kaXRpb24gb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIHR5cGUgc3BlY2lmaWMgdHlwZSBvZiB0aGUgY29uZGl0aW9uCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfY29uZGl0aW9uX3NldF90eXBlKHNhbWxfY29uZGl0aW9uX3QgKmNvbmQsIAoJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudiwgc2FtbF9jb25kX3R5cGVfdCB0eXBlKTsKCi8qCiAqIEdldCB0aGUgc3BlY2lmaWMgY29uZHRpb24gaW4gdGhpcyBnZW5lcmljIGNvbmRpdGlvbi4KICogQHBhcmFtIGNvbmQgcG9pbnRlciB0byBhIGNvbmRpdGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIHZvaWQgKiBBWElTMl9DQUxMIApzYW1sX2NvbmRpdGlvbl9nZXRfY29uZGl0aW9uKHNhbWxfY29uZGl0aW9uX3QgKmNvbmQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEdldCB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWMgY29uZHRpb24gaW4gdGhpcyBnZW5lcmljIGNvbmRpdGlvbi4KICogQHBhcmFtIGNvbmQgcG9pbnRlciB0byBhIGNvbmRpdGlvbiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIHNhbWxfY29uZF90eXBlX3QgQVhJUzJfQ0FMTCAKc2FtbF9jb25kaXRpb25fZ2V0X3R5cGUoc2FtbF9jb25kaXRpb25fdCAqY29uZCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogYXVkaW8gcmVzdHJpY3Rpb24gKi8KCi8qCiAqIFBvcHVsYXRlcyBhbiBhdWRpIHJlc3RyaWN0aW9uIGNvbmRpdGlvbiBmcm9tIGFuIG9tIG5vZGUuCiAqIEBwYXJhbSBhcmMgYSBwb250ZXIgdG8gc2FtbF9hdWRfcmVzdHJpY3Rpb25fY29uZiBvYmplY3QKICogQHBhcmFtIG5vZGUgb20gbm9kZSBjb250YWluaW5nIGFuIGF1ZGllbmNlIHJlc3RyaWN0aW9uIGNvbmRpdGlvbgogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX2J1aWxkKHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3QgKmFyYywgCgkJCQkJCQkJIGF4aW9tX25vZGVfdCAqbm9kZSwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2VyaWFsaXplIGFuIHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3Qgb2JqZWN0IGluIHRvIGFuIG9tIG5vZGUuCiAqIEBwYXJhbSBhcmMgYSBwb250ZXIgdG8gc2FtbF9hdWRfcmVzdHJpY3Rpb25fY29uZiBvYmplY3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICpBWElTMl9DQUxMIApzYW1sX2F1ZGlfcmVzdHJpY3Rpb25fY29uZF90b19vbShzYW1sX2F1ZGlfcmVzdHJpY3Rpb25fY29uZF90ICphcmMsIAoJCQkJCQkJCSBheGlvbV9ub2RlX3QgKnBhcmVudCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogRnJlZSBhIHNhbWxfYXVkX3Jlc3RyaWN0aW9uX2NvbmYgb2JqZWN0LgogKiBAcGFyYW0gYXJjIGEgcG9udGVyIHRvIHNhbWxfYXVkX3Jlc3RyaWN0aW9uX2NvbmYgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiB2b2lkIEFYSVMyX0NBTEwgCnNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX2ZyZWUoc2FtbF9hdWRpX3Jlc3RyaWN0aW9uX2NvbmRfdCAqYXJjLCAKCQkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBDcmVhdGUgYSBzYW1sX2F1ZF9yZXN0cmljdGlvbl9jb25mIG9iamVjdC4KICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIGEgcG9udGVyIHRvIHNhbWxfYXVkX3Jlc3RyaWN0aW9uX2NvbmYgb2JqZWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9hdWRpX3Jlc3RyaWN0aW9uX2NvbmRfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBSZXR1cm4gYSBsaXN0IG9mIFVSSSByZWZlcmVuY2VzIHRoYXQgaWRlbnRpZmllcyBhIGxpc3Qgb2YgaW50ZW5kZWQgYXVkaWVuY2VzLgogKiBAcGFyYW0gYXJjIGEgcG9udGVyIHRvIHNhbWxfYXVkX3Jlc3RyaWN0aW9uX2NvbmYgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBheHV0aWxfYXJyYXlfbGlzdF90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdWRpX3Jlc3RyaWN0aW9uX2NvbmRfZ2V0X2F1ZGllbmNlcyhzYW1sX2F1ZGlfcmVzdHJpY3Rpb25fY29uZF90ICphcmMsIAoJCQkJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNldCBhIGxpc3Qgb2YgVVJJIHJlZmVyZW5jZXMgdGhhdCBpZGVudGlmaWVzIGEgbGlzdCBvZiBpbnRlbmRlZCBhdWRpZW5jZXMuCiAqIEBwYXJhbSBhcmMgYSBwb250ZXIgdG8gc2FtbF9hdWRfcmVzdHJpY3Rpb25fY29uZiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1ZGlfcmVzdHJpY3Rpb25fY29uZF9zZXRfYXVkaWVuY2VzKHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3QgKmNvbmQsIAoJCQkJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheHV0aWxfYXJyYXlfbGlzdF90ICpsaXN0KTsKCi8qCiAqIFJlbW92ZSBhIFVSSSByZWZlcmVuY2UgdGhhdCBpZGVudGlmaWVzIGFuIGludGVuZGVkIGF1ZGllbmNlcy4KICogQHBhcmFtIGFyYyBhIHBvbnRlciB0byBzYW1sX2F1ZF9yZXN0cmljdGlvbl9jb25mIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBpbmRleCB0aGUgbnVtYmVyIG9mIHRoZSBhdWRpZW5jZSBpbiB0aGUgbGlzdCwgdG8gYmUgcmVtb3ZlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F1ZGlfcmVzdHJpY3Rpb25fY29uZF9yZW1vdmVfYXVkaWVuY2VzKHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3QgKmNvbmQsIAoJCQkJCQkJCQkJCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaW5kZXgpOwoKLyoKICogQWQgYSBVUkkgcmVmZXJlbmNlIHRoYXQgaWRlbnRpZmllcyBhbiBpbnRlbmRlZCBhdWRpZW5jZXMuCiAqIEBwYXJhbSBhcmMgYSBwb250ZXIgdG8gc2FtbF9hdWRfcmVzdHJpY3Rpb25fY29uZiBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gYXVkaWVuY2UgYSBuZXcgYXVkaWVuY2UgdG8gYmUgYWRkZWQKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdWRpX3Jlc3RyaWN0aW9uX2NvbmRfYWRkX2F1ZGllbmNlKHNhbWxfYXVkaV9yZXN0cmljdGlvbl9jb25kX3QgKmNvbmQsIAoJCQkJCQkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aXMyX2NoYXJfdCAqYXVkaWVuY2UpOwoKCi8qIGFjdGlvbiAqLwoKLyoKICogQ3JlYXRlIGEgc2FtbF9hY3Rpb25fdC4KICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIHBvaW50ZXIgdG8gc2FtbF9hY3Rpb25fdCAKICovCkFYSVMyX0VYVEVSTiBzYW1sX2FjdGlvbl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hY3Rpb25fY3JlYXRlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEZyZWUgYSBzYW1sX2FjdGlvbl90LgogKiBAcGFyYW0gYWN0aW9uIHBvaW50ZXIgdG8gc2FtbF9hY3Rpb25fdCAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIHZvaWQgQVhJUzJfQ0FMTCAKc2FtbF9hY3Rpb25fZnJlZShzYW1sX2FjdGlvbl90ICphY3Rpb24sIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFBvcHVsYXRlcyBhIHNhbWwgYWN0aW9uIGZyb20gYSBvbSBub2RlIGNvbnRhaW5pbmcgYSBzYW1sIGFjdGlvbi4KICogQHBhcmFtIGFjdGlvbiBwb2ludGVyIHRvIHNhbWxfYWN0aW9uX3QgCiAqIEBwYXJhbSBub2RlIG9tIG5vZGUgY29uYXRpbmluZyBhIHNhbWwgYWN0aW9uCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hY3Rpb25fYnVpbGQoc2FtbF9hY3Rpb25fdCAqYWN0aW9uLCBheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhIGFjdGlvbl90IG9iamVjdCB0byBhbiBvbSBub2RlLgogKiBAcGFyYW0gYWN0aW9uIHBvaW50ZXIgdG8gc2FtbF9hY3Rpb25fdCAKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9hY3Rpb25fdG9fb20oc2FtbF9hY3Rpb25fdCAqYWN0aW9uLCAKCQkJCSAgYXhpb21fbm9kZV90ICpwYXJlbnQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEdldCBhbiBhY3Rpb24gc291Z2h0IHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgogKiBAcGFyYW0gYWN0aW9uIHBvaW50ZXIgdG8gc2FtbF9hY3Rpb25fdCAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYWN0aW9uX2dldF9kYXRhKHNhbWxfYWN0aW9uX3QgKmFjdGlvbiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IGEgVVJJIHJlZmVyZW5jZSByZXByZXNlbnRpbmcgdGhlIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgbmFtZSBvZiB0aGUgCiAqIHNwZWNpZmllZCBhY3Rpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuCiAqIEBwYXJhbSBhY3Rpb24gcG9pbnRlciB0byBzYW1sX2FjdGlvbl90IAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hY3Rpb25fZ2V0X25hbWVzcGFjZShzYW1sX2FjdGlvbl90ICphY3Rpb24sIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNldCBhbiBhY3Rpb24gc291Z2h0IHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgogKiBAcGFyYW0gYWN0aW9uIHBvaW50ZXIgdG8gc2FtbF9hY3Rpb25fdCAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gZGF0YSBhbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYWN0aW9uX3NldF9kYXRhKHNhbWxfYWN0aW9uX3QgKmFjdGlvbiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJCQkJCSBheGlzMl9jaGFyX3QgKmRhdGEpOwoKLyoKICogU2V0IGEgVVJJIHJlZmVyZW5jZSByZXByZXNlbnRpbmcgdGhlIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgbmFtZSBvZiB0aGUgCiAqIHNwZWNpZmllZCBhY3Rpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuCiAqIEBwYXJhbSBhY3Rpb24gcG9pbnRlciB0byBzYW1sX2FjdGlvbl90IAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBuYW1lX3NwYWNlIGEgVVJJIHJlZmVyZW5jZQogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2FjdGlvbl9zZXRfbmFtZXNwYWNlKHNhbWxfYWN0aW9uX3QgKmFjdGlvbiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIAoJCQkJCQkgIGF4aXMyX2NoYXJfdCAqbmFtZV9zcGFjZSk7CgovKiBldmlkZW5jZSAqLwpBWElTMl9FWFRFUk4gc2FtbF9ldmlkZW5jZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9ldmlkZW5jZV9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKQVhJUzJfRVhURVJOIHZvaWQgQVhJUzJfQ0FMTCAKc2FtbF9ldmlkZW5jZV9mcmVlKHNhbWxfZXZpZGVuY2VfdCAqZXZpZGVuY2UsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9ldmlkZW5jZV9idWlsZChzYW1sX2V2aWRlbmNlX3QgKmV2aWRlbmNlLCAKCQkJCQlheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCkFYSVMyX0VYVEVSTiBheGlvbV9ub2RlX3QgKiBBWElTMl9DQUxMIApzYW1sX2V2aWRlbmNlX3RvX29tKHNhbWxfZXZpZGVuY2VfdCAqZXZpZGVuY2UsIGF4aW9tX25vZGVfdCAqcGFyZW50LCAKCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudik7CgpBWElTMl9FWFRFUk4gYXh1dGlsX2FycmF5X2xpc3RfdCAqIEFYSVMyX0NBTEwgCnNhbWxfZXZpZGVuY2VfZ2V0X2Fzc2VydGlvbnMoc2FtbF9ldmlkZW5jZV90ICpldmlkZW5jZSwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKQVhJUzJfRVhURVJOIGF4dXRpbF9hcnJheV9saXN0X3QgKiBBWElTMl9DQUxMIApzYW1sX2V2aWRlbmNlX2dldF9hc3NlcnRpb25faWRzKHNhbWxfZXZpZGVuY2VfdCAqZXZpZGVuY2UsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9ldmlkZW5jZV9zZXRfYXNzZXJ0aW9ucyhzYW1sX2V2aWRlbmNlX3QgKmV2aWRlbmNlLCAKCQkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXh1dGlsX2FycmF5X2xpc3RfdCAqbGlzdCk7CgpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfZXZpZGVuY2VfcmVtb3ZlX2Fzc2VydGlvbihzYW1sX2V2aWRlbmNlX3QgKmV2aWRlbmNlLCAKCQkJCQkJCSAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaW5kZXgpOwoKQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2V2aWRlbmNlX2FkZF9hc3NlcnRpb24oc2FtbF9ldmlkZW5jZV90ICpldmlkZW5jZSwgCgkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudiwgc2FtbF9hc3NlcnRpb25fdCAqYXNzZXJ0aW9uKTsKCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9ldmlkZW5jZV9zZXRfYXNzZXJ0aW9uX2lkcyhzYW1sX2V2aWRlbmNlX3QgKmV2aWRlbmNlLCAKCQkJCQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXh1dGlsX2FycmF5X2xpc3RfdCAqbGlzdCk7CgpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfZXZpZGVuY2VfcmVtb3ZlX2Fzc2VydGlvbl9pZChzYW1sX2V2aWRlbmNlX3QgKmV2aWRlbmNlLCAKCQkJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaW5kZXgpOwoKQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2V2aWRlbmNlX2FkZF9hc3NlcnRpb25faWQoc2FtbF9ldmlkZW5jZV90ICpldmlkZW5jZSwgCgkJCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICphc3NlcnRpb25faWQpOwoKLyogYXRycmlidXRlIGRlc2lnbmF0dXJlICovCgovKiAKICogQ3JlYXRlIGEgc2FtbF9hdHRyX2Rlc2lnX3QuIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gcG9pbnRlciB0byBzYW1sX2F0dHJfZGVzaWdfdAogKi8KQVhJUzJfRVhURVJOIHNhbWxfYXR0cl9kZXNpZ190ICogQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2Rlc2lnX2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogRnJlZSBhIHNhbWxfYXR0cl9kZXNpZ190LiAKICogQHBhcmFtIGF0dHJfZGVzaWcgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl9kZXNpZ190CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX2F0dHJfZGVzaWdfZnJlZShzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogUG9wdWxhdGVzIGEgc2FtbF9hdHRyX2Rlc2lnX3QgZnJvbSBhIG9tIG5vZGUgY29udGFpbGluZyBhIHNhbWwgYXR0cmlpYnV0ZSBkZXNnbmF0b3IKICogQHBhcmFtIGF0dHJfZGVzaWcgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl9kZXNpZ190CiAqIEBwYXJhbSBub2RlIG9tIG5vZGUgY29udGFpbmluZyBzYW1sIGF0dHJpaWJ1dGUgZGVzZ25hdG9yCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9kZXNpZ19idWlsZChzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgCgkJCQkJICBheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhIHNhbWxfYXR0cl9kZXNpZ190IHRvIGFuIG9tIG5vZGUuCiAqIEBwYXJhbSBhdHRyX2Rlc2lnIGEgcG9pbnRlciB0byBzYW1sX2F0dHJfZGVzaWdfdAogKiBAcGFyYW0gcGFyZW50IGlmIHNwZWNpZmllZCBjcmVhdGVkIG5vZGUgd2lsbCBiZSBhIGNoaWxkIG9mIHRoaXMgbm9kZSAgCiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqLwpBWElTMl9FWFRFUk4gYXhpb21fbm9kZV90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2Rlc2lnX3RvX29tKHNhbWxfYXR0cl9kZXNpZ190ICphdHRyX2Rlc2lnLCAKCQkJCQkgIGF4aW9tX25vZGVfdCAqcGFyZW50LCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKiAKICogR2V0IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSBhdHRyX2Rlc2lnIGEgcG9pbnRlciB0byBzYW1sX2F0dHJfZGVzaWdfdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcmV0dXJuIGEgc3RyaW5nIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9kZXNpZ19nZXRfbmFtZShzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogR2V0IHRoZSBuYW1lc3BhY2UgaW4gd2hpY2ggdGhlIEF0dHJpYnV0ZU5hbWUgZWxlbWVudHMgYXJlIGludGVycHJldGVkLgogKiBAcGFyYW0gYXR0cl9kZXNpZyBhIHBvaW50ZXIgdG8gc2FtbF9hdHRyX2Rlc2lnX3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lc3BhY2UKICovCkFYSVMyX0VYVEVSTiBheGlzMl9jaGFyX3QgKiBBWElTMl9DQUxMIApzYW1sX2F0dHJfZGVzaWdfZ2V0X25hbWVzcGFjZShzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFNldCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgogKiBAcGFyYW0gYXR0cl9kZXNpZyBhIHBvaW50ZXIgdG8gc2FtbF9hdHRyX2Rlc2lnX3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIG5hbWUgYSBzdHJpbmcgbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9kZXNpZ19zZXRfbmFtZShzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgCgkJCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpuYW1lKTsKCi8qCiAqIFNldCB0aGUgbmFtZXNwYWNlIGluIHdoaWNoIHRoZSBBdHRyaWJ1dGVOYW1lIGVsZW1lbnRzIGFyZSBpbnRlcnByZXRlZC4KICogQHBhcmFtIGF0dHJfZGVzaWcgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl9kZXNpZ190CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBuYW1lX3NwYWNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWVzcGFjZQogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F0dHJfZGVzaWdfc2V0X25hbWVzcGFjZShzYW1sX2F0dHJfZGVzaWdfdCAqYXR0cl9kZXNpZywgCgkJCQkJCQkgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKm5hbWVfc3BhY2UpOwoKLyogYXR0cmlidXRlICovCgovKgogKiBDcmVhdGUgYSBzYW1sX2F0dHJfdC4KICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHJldHVybiBwb2ludGVyIHRvIHNhbWxfYXR0cl90CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9hdHRyX3QgKiBBWElTMl9DQUxMIApzYW1sX2F0dHJfY3JlYXRlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEZyZWUgYSBzYW1sX2F0dHJfdC4KICogQHBhcmFtIGF0dHIgcG9pbnRlciB0byBzYW1sX2F0dHJfdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIHZvaWQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2ZyZWUoc2FtbF9hdHRyX3QgKmF0dHIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFBvcHVsYXRlcyBhIHNhbWxfYXR0cl90IGZyb20gYW4gb20gbm9kZSBjb250YWluaW5nIGEgc2FtbCBhdHRyaWJ1dGUuCiAqIEBwYXJhbSBhdHRyIHBvaW50ZXIgdG8gc2FtbF9hdHRyX3QKICogQG5vZGUgYW4gb20gbm9kZSBjb250YWluaW5nIGEgc2FtbCBhdHRyaWJ1dGUKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2J1aWxkKHNhbWxfYXR0cl90ICphdHRyLCBheGlvbV9ub2RlX3QgKm5vZGUsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIFNlcmlhbGl6ZSBhIHNhbWxfYXR0cl90IGluIHRvIGFuIG9tIG5vZGUuCiAqIEBwYXJhbSBhdHRyIHBvaW50ZXIgdG8gc2FtbF9hdHRyX3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgY3JlYXRlZCBub2RlIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGlzIG5vZGUgIAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXR0cl90b19vbShzYW1sX2F0dHJfdCAqYXR0ciwgYXhpb21fbm9kZV90ICpwYXJlbnQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIGF0dHIgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl90CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEByZXR1cm4gYSBzdHJpbmcgbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2dldF9uYW1lKHNhbWxfYXR0cl90ICphdHRyLCBjb25zdCBheHV0aWxfZW52X3QgKmVudik7CgovKgogKiBHZXQgdGhlIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgQXR0cmlidXRlTmFtZSBlbGVtZW50cyBhcmUgaW50ZXJwcmV0ZWQuCiAqIEBwYXJhbSBhdHRyIGEgcG9pbnRlciB0byBzYW1sX2F0dHJfdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0IAogKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWVzcGFjZQogKi8KQVhJUzJfRVhURVJOIGF4aXMyX2NoYXJfdCAqIEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9nZXRfbmFtZXNwYWNlKHNhbWxfYXR0cl90ICphdHRyX3N0bXQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIGF0dHIgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl90CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBuYW1lIGEgc3RyaW5nIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F0dHJfc2V0X25hbWUoc2FtbF9hdHRyX3QgKmF0dHIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKm5hbWUpOwoKLyoKICogU2V0IHRoZSBuYW1lc3BhY2UgaW4gd2hpY2ggdGhlIEF0dHJpYnV0ZU5hbWUgZWxlbWVudHMgYXJlIGludGVycHJldGVkLgogKiBAcGFyYW0gYXR0ciBhIHBvaW50ZXIgdG8gc2FtbF9hdHRyX3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIG5hbWVfc3BhY2UgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZXNwYWNlCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9zZXRfbmFtZXNwYWNlKHNhbWxfYXR0cl90ICphdHRyLCBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgCgkJCQkJCWF4aXMyX2NoYXJfdCAqbmFtZV9zcGFjZSk7CgovKgogKiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlIGFzIGEgbGlzdCBvZiBvbSBub2Rlcy4KICogQHBhcmFtIGF0dHIgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl90CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBsaXN0IGEgb20gbm9kZSBsaXN0CiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfYXR0cl9zZXRfdmFsdWVzKHNhbWxfYXR0cl90ICphdHRyLCBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgCgkJCQkJIGF4dXRpbF9hcnJheV9saXN0X3QgKmxpc3QpOwoKLyoKICogUmVtb3ZlIG9tIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICogQHBhcmFtIGF0dHIgYSBwb2ludGVyIHRvIHNhbWxfYXR0cl90CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QgCiAqIEBwYXJhbSBpbmRleCBpbmRleCBudW1iZXIgb2YgdGhlIG9tIG5vZGUgdG8gYmUgcmVtb3ZlZAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX2F0dHJfcmVtb3ZlX3ZhbHVlKHNhbWxfYXR0cl90ICphdHRyLCBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGluZGV4KTsKCi8qCiAqIEFkZCBhIG9tIG5vZGUgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBsaXN0LgogKiBAcGFyYW0gYXR0ciBhIHBvaW50ZXIgdG8gc2FtbF9hdHRyX3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdCAKICogQHBhcmFtIHZhbHVlIGFuIG9tIG5vZGUKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9hdHRyX2FkZF92YWx1ZShzYW1sX2F0dHJfdCAqYXR0ciwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aW9tX25vZGVfdCAqdmFsdWUpOwoKCi8qbmFtZWQgaWQqLwoKLyoKICogQ3JlYXRlIGEgU0FNTCBuYW1lZCBpZCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIHNhbWwgbmFtZWQgaWQgb2JqZWN0CiAqLwpBWElTMl9FWFRFUk4gc2FtbF9uYW1lZF9pZF90ICogQVhJUzJfQ0FMTCAKc2FtbF9uYW1lZF9pZF9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogRnJlZSBhIHNhbWwgbmFtZWQgaWQgb2JqZWN0CiAqIEBwYXJhbSBuYW1lZF9pZCBuYW1lZF9pZCB0byBiZSBmcmVlZAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqLwpBWElTMl9FWFRFUk4gdm9pZCBBWElTMl9DQUxMIApzYW1sX25hbWVkX2lkX2ZyZWUoc2FtbF9uYW1lZF9pZF90ICpuYW1lZF9pZCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogQnVpbGQgYSBzYW1sIG5hbWVkIGlkIGZyb20gYW4gb20gbm9kZSBjb250YWluaW5nIGEgc2FtbCBuYW1lZCBpZGVudGlmaWVyCiAqIEBwYXJhbSBuYW1lZF9pZCBuYW1lZCBpZCBvYmplY3QKICogQHBhcmFtIG5vZGUgb20gbm9kZSBjb250YWluaW5nIHRoZSBzYW1sIG5hbWVkIGlkZW50aWZpZXIKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIApzYW1sX25hbWVkX2lkX2J1aWxkKHNhbWxfbmFtZWRfaWRfdCAqbmFtZWRfaWQsIGF4aW9tX25vZGVfdCAqbm9kZSwgCgkJCQkJY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyoKICogU2VyaWFsaXplIGEgbmFtZWQgaWQgb2JqZWN0IGluIHRvIGFuIG9tIG5vZGUuCiAqIEBwYXJhbSBuYW1lZF9pZCBuYW1lZCBpZCBvYmplY3QKICogQHBhcmFtIHBhcmVudCBpZiBzcGVjaWZpZWQgdGhpcyB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ld2VseSBjcmVhdGVkIG5vZGUKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKi8KQVhJUzJfRVhURVJOIGF4aW9tX25vZGVfdCAqIEFYSVMyX0NBTEwgCnNhbWxfbmFtZWRfaWRfdG9fb20oc2FtbF9uYW1lZF9pZF90ICppZCwgYXhpb21fbm9kZV90ICpwYXJlbnQsIAoJCQkJCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qIAogKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGlkZW50aWZpZXIuCiAqIEBwYXJhbSBuYW1lZF9pZCBuYW1lZCBpZCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcmV0dXJuIG5hbWUgYXMgYSBzdHJpbmcKICovCkFYSVMyX0VYVEVSTiBheGlzMl9jaGFyX3QgKiBBWElTMl9DQUxMIApzYW1sX25hbWVkX2lkX2dldF9uYW1lKHNhbWxfbmFtZWRfaWRfdCAqaWQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEdldCBhIFVSSSByZWZlcmVuY2UgcmVwcmVzZW50aW5nIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIDxOYW1lSWRlbnRpZmllcj4gCiAqIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgogKiBAcGFyYW0gbmFtZWRfaWQgbmFtZWQgaWQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHJldHVybiBmb3JtYXQgYXMgYSBVUkkgc3RyaW5nCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9uYW1lZF9pZF9nZXRfZm9ybWF0KHNhbWxfbmFtZWRfaWRfdCAqaWQsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKCi8qCiAqIEdldCB0aGUgc2VjdXJpdHkgb3IgYWRtaW5pc3RyYXRpdmUgZG9tYWluIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lIG9mIHRoZSAKICogc3ViamVjdC4KICogQHBhcmFtIG5hbWVkX2lkIG5hbWVkIGlkIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZG9tYWluCiAqLwpBWElTMl9FWFRFUk4gYXhpczJfY2hhcl90ICogQVhJUzJfQ0FMTCAKc2FtbF9uYW1lZF9pZF9nZXRfbmFtZV9xdWFsaWZpZXIoc2FtbF9uYW1lZF9pZF90ICppZCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwoKLyogCiAqIFNldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgaWRlbnRpZmllci4KICogQHBhcmFtIG5hbWVkX2lkIG5hbWVkIGlkIG9iamVjdAogKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0CiAqIEBwYXJhbSBuYW1lIG5hbWUgYXMgYSBzdHJpbmcKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9uYW1lZF9pZF9zZXRfbmFtZShzYW1sX25hbWVkX2lkX3QgKmlkLCAKCQkJCQkgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpczJfY2hhcl90ICpuYW1lKTsKCi8qCiAqIFNldCBhIFVSSSByZWZlcmVuY2UgcmVwcmVzZW50aW5nIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIDxOYW1lSWRlbnRpZmllcj4gCiAqIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgogKiBAcGFyYW0gbmFtZWRfaWQgbmFtZWQgaWQgb2JqZWN0CiAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKICogQHBhcmFtIGZvcm1hdCBmb3JtYXQgb2YgdGhlIG5hbWVpZGVudGlmaWVyCiAqLwpBWElTMl9FWFRFUk4gaW50IEFYSVMyX0NBTEwgCnNhbWxfbmFtZWRfaWRfc2V0X2Zvcm1hdChzYW1sX25hbWVkX2lkX3QgKmlkLCAKCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKmZvcm1hdCk7CgovKgogKiBTZXQgdGhlIHNlY3VyaXR5IG9yIGFkbWluaXN0cmF0aXZlIGRvbWFpbiB0aGF0IHF1YWxpZmllcyB0aGUgbmFtZSBvZiB0aGUgCiAqIHN1YmplY3QuCiAqIEBwYXJhbSBuYW1lZF9pZCBuYW1lZCBpZCBvYmplY3QKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gcXVhbGlmaWVyIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRvbWFpbiAKICovCkFYSVMyX0VYVEVSTiBpbnQgQVhJUzJfQ0FMTCAKc2FtbF9uYW1lZF9pZF9zZXRfbmFtZV9xdWFsaWZpZXIoc2FtbF9uYW1lZF9pZF90ICppZCwgCgkJCQkJCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlzMl9jaGFyX3QgKnF1YWxpZmllcik7CgoKLyogcHJpdmF0ZSBtZXRob2QgKi8KQVhJUzJfRVhURVJOIGludCBBWElTMl9DQUxMIHNhbWxfdXRpbF9zZXRfc2lnX2N0eF9kZWZhdWx0cyhveHNfc2lnbl9jdHhfdCAqc2lnX2N0eCwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aXMyX2NoYXJfdCAqaWQpOwoKLyogR2V0IHRoZSBzZXNzaW9uIGtleSBmcm9tIGEgYXNzZXJ0aW9uLiBTZXNzaW9uIGtleSBpcyBpbnNpZGUgdGhlIFNBTUwgCiAqIHRva2VuIGFzIGFuIEVuY3J5cHRlZEtleSAKICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAogKiBAcGFyYW0gYXNzZXJ0aW9uIGFuIHNhbWwgYXNzZXJ0aW9uIG5vZGUKICogQHBhcmFtIHB2dF9rZXkgcHJpdmF0ZSBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBzZXNzaW9uIGtleQogKi8KQVhJUzJfRVhURVJOIG94c19rZXlfdCAqIEFYSVMyX0NBTEwNCnNhbWxfYXNzZXJ0aW9uX2dldF9zZXNzaW9uX2tleShjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpb21fbm9kZV90ICphc3NlcnRpb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV90ICpwdnRfa2V5KTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKCiNlbmRpZiAK