LyogVGhpcyBzb3VyY2UgY29kZSB3YXMgbW9kaWZpZWQgYnkgTWFydGluIEhlZGVuZmFsayA8bWhlQHN0YWNrZW4ua3RoLnNlPiBmb3IKICogdXNlIGluIEN1cmwuIEhpcyBsYXRlc3QgY2hhbmdlcyB3ZXJlIGRvbmUgMjAwMC0wOS0xOC4KICoKICogSXQgaGFzIHNpbmNlIGJlZW4gcGF0Y2hlZCBhbmQgbW9kaWZpZWQgYSBsb3QgYnkgRGFuaWVsIFN0ZW5iZXJnCiAqIDxkYW5pZWxAaGF4eC5zZT4gdG8gbWFrZSBpdCBiZXR0ZXIgYXBwbGllZCB0byBjdXJsIGNvbmRpdGlvbnMsIGFuZCB0byBtYWtlCiAqIGl0IG5vdCB1c2UgZ2xvYmFscywgcG9sbHV0ZSBuYW1lIHNwYWNlIGFuZCBtb3JlLiBUaGlzIHNvdXJjZSBjb2RlIGF3YWl0cyBhCiAqIHJld3JpdGUgdG8gd29yayBhcm91bmQgdGhlIHBhcmFncmFwaCAyIGluIHRoZSBCU0QgbGljZW5zZXMgYXMgZXhwbGFpbmVkCiAqIGJlbG93LgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmbmRlZiBDVVJMX0RJU0FCTEVfRlRQCiNpZmRlZiBLUkI0CgojZGVmaW5lIF9NUFJJTlRGX1JFUExBQ0UgLyogd2Ugd2FudCBjdXJsLWZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG5hdGl2ZSBvbmVzICovCiNpbmNsdWRlIDxjdXJsL21wcmludGYuaD4KCiNpbmNsdWRlICJzZWN1cml0eS5oIgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG5ldGRiLmg+CgojaWZkZWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2luY2x1ZGUgImJhc2U2NC5oIgojaW5jbHVkZSAic2VuZGYuaCIKI2luY2x1ZGUgImZ0cC5oIgoKLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZSBzaG91bGQgYmU6ICovCiNpZmRlZiBDVVJMREVCVUcKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiNlbmRpZgoKI2RlZmluZSBtaW4oYSwgYikgICAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQoKc3RhdGljIHN0cnVjdCB7CiAgICBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgbGV2ZWw7CiAgICBjb25zdCBjaGFyICpuYW1lOwp9IGxldmVsX25hbWVzW10gPSB7CiAgICB7IHByb3RfY2xlYXIsICJjbGVhciIgfSwKICAgIHsgcHJvdF9zYWZlLCAic2FmZSIgfSwKICAgIHsgcHJvdF9jb25maWRlbnRpYWwsICJjb25maWRlbnRpYWwiIH0sCiAgICB7IHByb3RfcHJpdmF0ZSwgInByaXZhdGUiIH0KfTsKCnN0YXRpYyBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgCm5hbWVfdG9fbGV2ZWwoY29uc3QgY2hhciAqbmFtZSkKewogIGludCBpOwogIGZvcihpID0gMDsgaSA8IChpbnQpc2l6ZW9mKGxldmVsX25hbWVzKS8oaW50KXNpemVvZihsZXZlbF9uYW1lc1swXSk7IGkrKykKICAgIGlmKCFzdHJuY2FzZWNtcChsZXZlbF9uYW1lc1tpXS5uYW1lLCBuYW1lLCBzdHJsZW4obmFtZSkpKQogICAgICByZXR1cm4gbGV2ZWxfbmFtZXNbaV0ubGV2ZWw7CiAgcmV0dXJuIChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpLTE7Cn0KCnN0YXRpYyBzdHJ1Y3QgQ3VybF9zZWNfY2xpZW50X21lY2ggKm1lY2hzW10gPSB7CiNpZmRlZiBLUkI1CiAgLyogbm90IHN1cHBvcnRlZCAqLwojZW5kaWYKI2lmZGVmIEtSQjQKICAgICZDdXJsX2tyYjRfY2xpZW50X21lY2gsCiNlbmRpZgogICAgTlVMTAp9OwoKaW50CkN1cmxfc2VjX2dldGMoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBGSUxFICpGKQp7CiAgaWYoY29ubi0+c2VjX2NvbXBsZXRlICYmIGNvbm4tPmRhdGFfcHJvdCkgewogICAgY2hhciBjOwogICAgaWYoQ3VybF9zZWNfcmVhZChjb25uLCBmaWxlbm8oRiksICZjLCAxKSA8PSAwKQogICAgICByZXR1cm4gRU9GOwogICAgcmV0dXJuIGM7CiAgfQogIGVsc2UKICAgIHJldHVybiBnZXRjKEYpOwp9CgpzdGF0aWMgaW50CmJsb2NrX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICB1bnNpZ25lZCBjaGFyICpwID0gYnVmOwogIGludCBiOwogIHdoaWxlKGxlbikgewogICAgYiA9IHJlYWQoZmQsIHAsIGxlbik7CiAgICBpZiAoYiA9PSAwKQogICAgICByZXR1cm4gMDsKICAgIGVsc2UgaWYgKGIgPCAwKQogICAgICByZXR1cm4gLTE7CiAgICBsZW4gLT0gYjsKICAgIHAgKz0gYjsKICB9CiAgcmV0dXJuIHAgLSAodW5zaWduZWQgY2hhciopYnVmOwp9CgpzdGF0aWMgaW50CmJsb2NrX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQp7CiAgdW5zaWduZWQgY2hhciAqcCA9IGJ1ZjsKICBpbnQgYjsKICB3aGlsZShsZW4pIHsKICAgIGIgPSB3cml0ZShmZCwgcCwgbGVuKTsKICAgIGlmKGIgPCAwKQogICAgICByZXR1cm4gLTE7CiAgICBsZW4gLT0gYjsKICAgIHAgKz0gYjsKICB9CiAgcmV0dXJuIHAgLSAodW5zaWduZWQgY2hhciopYnVmOwp9CgpzdGF0aWMgaW50CnNlY19nZXRfZGF0YShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICBpbnQgZmQsIHN0cnVjdCBrcmI0YnVmZmVyICpidWYpCnsKICBpbnQgbGVuOwogIGludCBiOwogIAogIGIgPSBibG9ja19yZWFkKGZkLCAmbGVuLCBzaXplb2YobGVuKSk7CiAgaWYgKGIgPT0gMCkKICAgIHJldHVybiAwOwogIGVsc2UgaWYgKGIgPCAwKQogICAgcmV0dXJuIC0xOwogIGxlbiA9IG50b2hsKGxlbik7CiAgYnVmLT5kYXRhID0gcmVhbGxvYyhidWYtPmRhdGEsIGxlbik7CiAgYiA9IGJsb2NrX3JlYWQoZmQsIGJ1Zi0+ZGF0YSwgbGVuKTsKICBpZiAoYiA9PSAwKQogICAgcmV0dXJuIDA7CiAgZWxzZSBpZiAoYiA8IDApCiAgICByZXR1cm4gLTE7CiAgYnVmLT5zaXplID0gKGNvbm4tPm1lY2gtPmRlY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Zi0+ZGF0YSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmRhdGFfcHJvdCwgY29ubik7CiAgYnVmLT5pbmRleCA9IDA7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBzaXplX3QKYnVmZmVyX3JlYWQoc3RydWN0IGtyYjRidWZmZXIgKmJ1Ziwgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKewogICAgbGVuID0gbWluKGxlbiwgYnVmLT5zaXplIC0gYnVmLT5pbmRleCk7CiAgICBtZW1jcHkoZGF0YSwgKGNoYXIqKWJ1Zi0+ZGF0YSArIGJ1Zi0+aW5kZXgsIGxlbik7CiAgICBidWYtPmluZGV4ICs9IGxlbjsKICAgIHJldHVybiBsZW47Cn0KCnN0YXRpYyBzaXplX3QKYnVmZmVyX3dyaXRlKHN0cnVjdCBrcmI0YnVmZmVyICpidWYsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCnsKICAgIGlmKGJ1Zi0+aW5kZXggKyBsZW4gPiBidWYtPnNpemUpIHsKCXZvaWQgKnRtcDsKCWlmKGJ1Zi0+ZGF0YSA9PSBOVUxMKQoJICAgIHRtcCA9IG1hbGxvYygxMDI0KTsKCWVsc2UKCSAgICB0bXAgPSByZWFsbG9jKGJ1Zi0+ZGF0YSwgYnVmLT5pbmRleCArIGxlbik7CglpZih0bXAgPT0gTlVMTCkKCSAgICByZXR1cm4gLTE7CglidWYtPmRhdGEgPSB0bXA7CglidWYtPnNpemUgPSBidWYtPmluZGV4ICsgbGVuOwogICAgfQogICAgbWVtY3B5KChjaGFyKilidWYtPmRhdGEgKyBidWYtPmluZGV4LCBkYXRhLCBsZW4pOwogICAgYnVmLT5pbmRleCArPSBsZW47CiAgICByZXR1cm4gbGVuOwp9CgppbnQKQ3VybF9zZWNfcmVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoKQp7CiAgICBzaXplX3QgbGVuOwogICAgaW50IHJ4ID0gMDsKCiAgICBpZihjb25uLT5zZWNfY29tcGxldGUgPT0gMCB8fCBjb25uLT5kYXRhX3Byb3QgPT0gMCkKICAgICAgcmV0dXJuIHJlYWQoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgICBpZihjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcpewogICAgICBjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcgPSAwOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIAogICAgbGVuID0gYnVmZmVyX3JlYWQoJmNvbm4tPmluX2J1ZmZlciwgYnVmZmVyLCBsZW5ndGgpOwogICAgbGVuZ3RoIC09IGxlbjsKICAgIHJ4ICs9IGxlbjsKICAgIGJ1ZmZlciA9IChjaGFyKilidWZmZXIgKyBsZW47CiAgICAKICAgIHdoaWxlKGxlbmd0aCkgewogICAgICBpZihzZWNfZ2V0X2RhdGEoY29ubiwgZmQsICZjb25uLT5pbl9idWZmZXIpIDwgMCkKICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmKGNvbm4tPmluX2J1ZmZlci5zaXplID09IDApIHsKICAgICAgICBpZihyeCkKICAgICAgICAgIGNvbm4tPmluX2J1ZmZlci5lb2ZfZmxhZyA9IDE7CiAgICAgICAgcmV0dXJuIHJ4OwogICAgICB9CiAgICAgIGxlbiA9IGJ1ZmZlcl9yZWFkKCZjb25uLT5pbl9idWZmZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICAgbGVuZ3RoIC09IGxlbjsKICAgICAgcnggKz0gbGVuOwogICAgICBidWZmZXIgPSAoY2hhciopYnVmZmVyICsgbGVuOwogICAgfQogICAgcmV0dXJuIHJ4Owp9CgpzdGF0aWMgaW50CnNlY19zZW5kKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCBjaGFyICpmcm9tLCBpbnQgbGVuZ3RoKQp7CiAgaW50IGJ5dGVzOwogIHZvaWQgKmJ1ZjsKICBieXRlcyA9IChjb25uLT5tZWNoLT5lbmNvZGUpKGNvbm4tPmFwcF9kYXRhLCBmcm9tLCBsZW5ndGgsIGNvbm4tPmRhdGFfcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsIGNvbm4pOwogIGJ5dGVzID0gaHRvbmwoYnl0ZXMpOwogIGJsb2NrX3dyaXRlKGZkLCAmYnl0ZXMsIHNpemVvZihieXRlcykpOwogIGJsb2NrX3dyaXRlKGZkLCBidWYsIG50b2hsKGJ5dGVzKSk7CiAgZnJlZShidWYpOwogIHJldHVybiBsZW5ndGg7Cn0KCmludApDdXJsX3NlY19mZmx1c2hfZmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgZmQpCnsKICBpZihjb25uLT5kYXRhX3Byb3QgIT0gcHJvdF9jbGVhcikgewogICAgaWYoY29ubi0+b3V0X2J1ZmZlci5pbmRleCA+IDApewogICAgICBDdXJsX3NlY193cml0ZShjb25uLCBmZCwKICAgICAgICAgICAgICAgIGNvbm4tPm91dF9idWZmZXIuZGF0YSwgY29ubi0+b3V0X2J1ZmZlci5pbmRleCk7CiAgICAgIGNvbm4tPm91dF9idWZmZXIuaW5kZXggPSAwOwogICAgfQogICAgc2VjX3NlbmQoY29ubiwgZmQsIE5VTEwsIDApOwogIH0KICByZXR1cm4gMDsKfQoKaW50CkN1cmxfc2VjX3dyaXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCnsKICBpbnQgbGVuID0gY29ubi0+YnVmZmVyX3NpemU7CiAgaW50IHR4ID0gMDsKICAgICAgCiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gd3JpdGUoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgbGVuIC09IChjb25uLT5tZWNoLT5vdmVyaGVhZCkoY29ubi0+YXBwX2RhdGEsIGNvbm4tPmRhdGFfcHJvdCwgbGVuKTsKICB3aGlsZShsZW5ndGgpewogICAgaWYobGVuZ3RoIDwgbGVuKQogICAgICBsZW4gPSBsZW5ndGg7CiAgICBzZWNfc2VuZChjb25uLCBmZCwgYnVmZmVyLCBsZW4pOwogICAgbGVuZ3RoIC09IGxlbjsKICAgIGJ1ZmZlciArPSBsZW47CiAgICB0eCArPSBsZW47CiAgfQogIHJldHVybiB0eDsKfQoKaW50CkN1cmxfc2VjX3B1dGMoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgYywgRklMRSAqRikKewogIGNoYXIgY2ggPSBjOwogIGlmKGNvbm4tPmRhdGFfcHJvdCA9PSBwcm90X2NsZWFyKQogICAgcmV0dXJuIHB1dGMoYywgRik7CiAgICAKICBidWZmZXJfd3JpdGUoJmNvbm4tPm91dF9idWZmZXIsICZjaCwgMSk7CiAgaWYoYyA9PSAnXG4nIHx8IGNvbm4tPm91dF9idWZmZXIuaW5kZXggPj0gMTAyNCAvKiBYWFggKi8pIHsKICAgIEN1cmxfc2VjX3dyaXRlKGNvbm4sIGZpbGVubyhGKSwgY29ubi0+b3V0X2J1ZmZlci5kYXRhLAogICAgICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCk7CiAgICBjb25uLT5vdXRfYnVmZmVyLmluZGV4ID0gMDsKICB9CiAgcmV0dXJuIGM7Cn0KCmludApDdXJsX3NlY19yZWFkX21zZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNoYXIgKnMsIGludCBsZXZlbCkKewogICAgaW50IGxlbjsKICAgIGNoYXIgKmJ1ZjsKICAgIGludCBjb2RlOwogICAgCiAgICBidWYgPSBtYWxsb2Moc3RybGVuKHMpKTsKICAgIGxlbiA9IEN1cmxfYmFzZTY0X2RlY29kZShzICsgNCwgYnVmKTsgLyogWFhYICovCiAgICAKICAgIGxlbiA9IChjb25uLT5tZWNoLT5kZWNvZGUpKGNvbm4tPmFwcF9kYXRhLCBidWYsIGxlbiwgbGV2ZWwsIGNvbm4pOwogICAgaWYobGVuIDwgMCkKCXJldHVybiAtMTsKICAgIAogICAgYnVmW2xlbl0gPSAnXDAnOwoKICAgIGlmKGJ1ZlszXSA9PSAnLScpCgljb2RlID0gMDsKICAgIGVsc2UKCXNzY2FuZihidWYsICIlZCIsICZjb2RlKTsKICAgIGlmKGJ1ZltsZW4tMV0gPT0gJ1xuJykKCWJ1ZltsZW4tMV0gPSAnXDAnOwogICAgc3RyY3B5KHMsIGJ1Zik7CiAgICBmcmVlKGJ1Zik7CiAgICByZXR1cm4gY29kZTsKfQoKZW51bSBwcm90ZWN0aW9uX2xldmVsCkN1cmxfc2V0X2NvbW1hbmRfcHJvdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGVudW0gcHJvdGVjdGlvbl9sZXZlbCBsZXZlbCkKewogICAgZW51bSBwcm90ZWN0aW9uX2xldmVsIG9sZCA9IGNvbm4tPmNvbW1hbmRfcHJvdDsKICAgIGNvbm4tPmNvbW1hbmRfcHJvdCA9IGxldmVsOwogICAgcmV0dXJuIG9sZDsKfQoKc3RhdGljIGludApzZWNfcHJvdF9pbnRlcm5hbChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBsZXZlbCkKewogIGNoYXIgKnA7CiAgdW5zaWduZWQgaW50IHMgPSAxMDQ4NTc2OwogIHNzaXplX3QgbnJlYWQ7CgogIGlmKCFjb25uLT5zZWNfY29tcGxldGUpewogICAgaW5mb2YoY29ubi0+ZGF0YSwgIk5vIHNlY3VyaXR5IGRhdGEgZXhjaGFuZ2UgaGFzIHRha2VuIHBsYWNlLlxuIik7CiAgICByZXR1cm4gLTE7CiAgfQoKICBpZihsZXZlbCl7CiAgICBpbnQgY29kZTsKICAgIGlmKEN1cmxfZnRwc2VuZGYoY29ubiwgIlBCU1ogJXUiLCBzKSkKICAgICAgcmV0dXJuIC0xOwoKICAgIGlmKEN1cmxfR2V0RlRQUmVzcG9uc2UoJm5yZWFkLCBjb25uLCAmY29kZSkpCiAgICAgIHJldHVybiAtMTsKCiAgICBpZihjb2RlLzEwMCAhPSAnMicpewogICAgICBmYWlsZihjb25uLT5kYXRhLCAiRmFpbGVkIHRvIHNldCBwcm90ZWN0aW9uIGJ1ZmZlciBzaXplLiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBjb25uLT5idWZmZXJfc2l6ZSA9IHM7CgogICAgcCA9IHN0cnN0cihjb25uLT5kYXRhLT5zdGF0ZS5idWZmZXIsICJQQlNaPSIpOwogICAgaWYocCkKICAgICAgc3NjYW5mKHAsICJQQlNaPSV1IiwgJnMpOwogICAgaWYocyA8IGNvbm4tPmJ1ZmZlcl9zaXplKQogICAgICBjb25uLT5idWZmZXJfc2l6ZSA9IHM7CiAgfQoKICBpZihDdXJsX2Z0cHNlbmRmKGNvbm4sICJQUk9UICVjIiwgbGV2ZWxbIkNTRVAiXSkpCiAgICByZXR1cm4gLTE7CgogIGlmKEN1cmxfR2V0RlRQUmVzcG9uc2UoJm5yZWFkLCBjb25uLCBOVUxMKSkKICAgIHJldHVybiAtMTsKCiAgaWYoY29ubi0+ZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICcyJyl7CiAgICBmYWlsZihjb25uLT5kYXRhLCAiRmFpbGVkIHRvIHNldCBwcm90ZWN0aW9uIGxldmVsLiIpOwogICAgcmV0dXJuIC0xOwogIH0KICAgIAogIGNvbm4tPmRhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpbGV2ZWw7CiAgcmV0dXJuIDA7Cn0KCnZvaWQKQ3VybF9zZWNfc2V0X3Byb3RlY3Rpb25fbGV2ZWwoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaWYoY29ubi0+c2VjX2NvbXBsZXRlICYmIGNvbm4tPmRhdGFfcHJvdCAhPSBjb25uLT5yZXF1ZXN0X2RhdGFfcHJvdCkKICAgIHNlY19wcm90X2ludGVybmFsKGNvbm4sIGNvbm4tPnJlcXVlc3RfZGF0YV9wcm90KTsKfQoKCmludApDdXJsX3NlY19yZXF1ZXN0X3Byb3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBjb25zdCBjaGFyICpsZXZlbCkKewogIGludCBsID0gbmFtZV90b19sZXZlbChsZXZlbCk7CiAgaWYobCA9PSAtMSkKICAgIHJldHVybiAtMTsKICBjb25uLT5yZXF1ZXN0X2RhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpbDsKICByZXR1cm4gMDsKfQoKaW50CkN1cmxfc2VjX2xvZ2luKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogIGludCByZXQ7CiAgc3RydWN0IEN1cmxfc2VjX2NsaWVudF9tZWNoICoqbTsKICBzc2l6ZV90IG5yZWFkOwogIHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhPWNvbm4tPmRhdGE7CiAgaW50IGZ0cGNvZGU7CgogIGZvcihtID0gbWVjaHM7ICptICYmICgqbSktPm5hbWU7IG0rKykgewogICAgdm9pZCAqdG1wOwoKICAgIHRtcCA9IHJlYWxsb2MoY29ubi0+YXBwX2RhdGEsICgqbSktPnNpemUpOwogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgIGZhaWxmIChkYXRhLCAicmVhbGxvYyAldSBmYWlsZWQiLCAoKm0pLT5zaXplKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY29ubi0+YXBwX2RhdGEgPSB0bXA7CgkgICAgCiAgICBpZigoKm0pLT5pbml0ICYmICgqKCptKS0+aW5pdCkoY29ubi0+YXBwX2RhdGEpICE9IDApIHsKICAgICAgaW5mb2YoZGF0YSwgIlNraXBwaW5nICVzLi4uXG4iLCAoKm0pLT5uYW1lKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpbmZvZihkYXRhLCAiVHJ5aW5nICVzLi4uXG4iLCAoKm0pLT5uYW1lKTsKCiAgICBpZihDdXJsX2Z0cHNlbmRmKGNvbm4sICJBVVRIICVzIiwgKCptKS0+bmFtZSkpCiAgICAgIHJldHVybiAtMTsKCiAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgJmZ0cGNvZGUpKQogICAgICByZXR1cm4gLTE7CgogICAgaWYoY29ubi0+ZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICczJyl7CiAgICAgIHN3aXRjaChmdHBjb2RlKSB7CiAgICAgIGNhc2UgNTA0OgogICAgICAgIGluZm9mKGRhdGEsCiAgICAgICAgICAgICAgIiVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci5cbiIsICgqbSktPm5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDUzNDoKICAgICAgICBpbmZvZihkYXRhLCAiJXMgcmVqZWN0ZWQgYXMgc2VjdXJpdHkgbWVjaGFuaXNtLlxuIiwgKCptKS0+bmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYoY29ubi0+ZGF0YS0+c3RhdGUuYnVmZmVyWzBdID09ICc1JykgewogICAgICAgICAgaW5mb2YoZGF0YSwgIlRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBGVFAgIgogICAgICAgICAgICAgICAgInNlY3VyaXR5IGV4dGVuc2lvbnMuXG4iKTsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgcmV0ID0gKCooKm0pLT5hdXRoKShjb25uLT5hcHBfZGF0YSwgY29ubik7CgkKICAgIGlmKHJldCA9PSBBVVRIX0NPTlRJTlVFKQogICAgICBjb250aW51ZTsKICAgIGVsc2UgaWYocmV0ICE9IEFVVEhfT0spewogICAgICAvKiBtZWNoYW5pc20gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IGVycm9yIHN0cmluZyAqLwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBjb25uLT5tZWNoID0gKm07CiAgICBjb25uLT5zZWNfY29tcGxldGUgPSAxOwogICAgY29ubi0+Y29tbWFuZF9wcm90ID0gcHJvdF9zYWZlOwogICAgYnJlYWs7CiAgfQogICAgCiAgcmV0dXJuICptID09IE5VTEw7Cn0KCnZvaWQKQ3VybF9zZWNfZW5kKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogIGlmIChjb25uLT5tZWNoICE9IE5VTEwpIHsKICAgIGlmKGNvbm4tPm1lY2gtPmVuZCkKICAgICAgKGNvbm4tPm1lY2gtPmVuZCkoY29ubi0+YXBwX2RhdGEpOwogICAgbWVtc2V0KGNvbm4tPmFwcF9kYXRhLCAwLCBjb25uLT5tZWNoLT5zaXplKTsKICAgIGZyZWUoY29ubi0+YXBwX2RhdGEpOwogICAgY29ubi0+YXBwX2RhdGEgPSBOVUxMOwogIH0KICBjb25uLT5zZWNfY29tcGxldGUgPSAwOwogIGNvbm4tPmRhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpMDsKICBjb25uLT5tZWNoPU5VTEw7Cn0KCiNlbmRpZiAvKiBLUkI0ICovCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfRlRQICovCg==