LyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAxMyBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMTQgRGFuaWVsIFN0ZW5iZXJnCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWZuZGVmIENVUkxfRElTQUJMRV9GVFAKI2lmZGVmIEhBVkVfR1NTQVBJCgojaWZkZWYgSEFWRV9PTERfR1NTTUlUCiNkZWZpbmUgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgZ3NzX250X3NlcnZpY2VfbmFtZQojZGVmaW5lIE5DT01QQVQgMQojZW5kaWYKCiNpZmRlZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInVybGRhdGEuaCIKI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiNpbmNsdWRlICJmdHAuaCIKI2luY2x1ZGUgImN1cmxfZ3NzYXBpLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiY3VybF9zZWMuaCIKI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiNpbmNsdWRlICJ3YXJubGVzcy5oIgoKI2RlZmluZSBfTVBSSU5URl9SRVBMQUNFIC8qIHVzZSBvdXIgZnVuY3Rpb25zIG9ubHkgKi8KI2luY2x1ZGUgPGN1cmwvbXByaW50Zi5oPgoKLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZSBzaG91bGQgYmU6ICovCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgoKI2RlZmluZSBMT0NBTF9BRERSICgmY29ubi0+bG9jYWxfYWRkcikKI2RlZmluZSBSRU1PVEVfQUREUiBjb25uLT5pcF9hZGRyLT5haV9hZGRyCgpzdGF0aWMgaW50CmtyYjVfaW5pdCh2b2lkICphcHBfZGF0YSkKewogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIC8qIE1ha2Ugc3VyZSBvdXIgY29udGV4dCBpcyBpbml0aWFsaXplZCBmb3Iga3JiNV9lbmQuICovCiAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfY2hlY2tfcHJvdCh2b2lkICphcHBfZGF0YSwgaW50IGxldmVsKQp7CiAgKHZvaWQpYXBwX2RhdGE7IC8qIHVudXNlZCAqLwogIGlmKGxldmVsID09IFBST1RfQ09ORklERU5USUFMKQogICAgcmV0dXJuIC0xOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfZGVjb2RlKHZvaWQgKmFwcF9kYXRhLCB2b2lkICpidWYsIGludCBsZW4sCiAgICAgICAgICAgIGludCBsZXZlbCBVTlVTRURfUEFSQU0sCiAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiBVTlVTRURfUEFSQU0pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX2J1ZmZlcl9kZXNjIGVuYywgZGVjOwoKICAodm9pZClsZXZlbDsKICAodm9pZCljb25uOwoKICBlbmMudmFsdWUgPSBidWY7CiAgZW5jLmxlbmd0aCA9IGxlbjsKICBtYWogPSBnc3NfdW5zZWFsKCZtaW4sICpjb250ZXh0LCAmZW5jLCAmZGVjLCBOVUxMLCBOVUxMKTsKICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKICAgIGlmKGxlbiA+PSA0KQogICAgICBzdHJjcHkoYnVmLCAiNTk5ICIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgbWVtY3B5KGJ1ZiwgZGVjLnZhbHVlLCBkZWMubGVuZ3RoKTsKICBsZW4gPSBjdXJseF91enRvc2koZGVjLmxlbmd0aCk7CiAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZkZWMpOwoKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50CmtyYjVfb3ZlcmhlYWQodm9pZCAqYXBwX2RhdGEsIGludCBsZXZlbCwgaW50IGxlbikKewogIC8qIG5vIGFyZ3VtZW50cyBhcmUgdXNlZCAqLwogICh2b2lkKWFwcF9kYXRhOwogICh2b2lkKWxldmVsOwogICh2b2lkKWxlbjsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAprcmI1X2VuY29kZSh2b2lkICphcHBfZGF0YSwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IGxldmVsLCB2b2lkICoqdG8pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBnc3NfYnVmZmVyX2Rlc2MgZGVjLCBlbmM7CiAgT01fdWludDMyIG1haiwgbWluOwogIGludCBzdGF0ZTsKICBpbnQgbGVuOwoKICAvKiBOT1RFIHRoYXQgdGhlIGNhc3QgaXMgc2FmZSwgbmVpdGhlciBvZiB0aGUga3JiNSwgZ251IGdzcyBhbmQgaGVpbWRhbAogICAqIGxpYnJhcmllcyBtb2RpZnkgdGhlIGlucHV0IGJ1ZmZlciBpbiBnc3Nfc2VhbCgpCiAgICovCiAgZGVjLnZhbHVlID0gKHZvaWQqKWZyb207CiAgZGVjLmxlbmd0aCA9IGxlbmd0aDsKICBtYWogPSBnc3Nfc2VhbCgmbWluLCAqY29udGV4dCwKICAgICAgICAgICAgICAgICBsZXZlbCA9PSBQUk9UX1BSSVZBVEUsCiAgICAgICAgICAgICAgICAgR1NTX0NfUU9QX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgJmRlYywgJnN0YXRlLCAmZW5jKTsKCiAgaWYobWFqICE9IEdTU19TX0NPTVBMRVRFKQogICAgcmV0dXJuIC0xOwoKICAvKiBtYWxsb2MgYSBuZXcgYnVmZmVyLCBpbiBjYXNlIGdzc19yZWxlYXNlX2J1ZmZlciBkb2Vzbid0IHdvcmsgYXMKICAgICBleHBlY3RlZCAqLwogICp0byA9IG1hbGxvYyhlbmMubGVuZ3RoKTsKICBpZighKnRvKQogICAgcmV0dXJuIC0xOwogIG1lbWNweSgqdG8sIGVuYy52YWx1ZSwgZW5jLmxlbmd0aCk7CiAgbGVuID0gY3VybHhfdXp0b3NpKGVuYy5sZW5ndGgpOwogIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluLCAmZW5jKTsKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50CmtyYjVfYXV0aCh2b2lkICphcHBfZGF0YSwgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaW50IHJldCA9IEFVVEhfT0s7CiAgY2hhciAqcDsKICBjb25zdCBjaGFyICpob3N0ID0gY29ubi0+aG9zdC5uYW1lOwogIHNzaXplX3QgbnJlYWQ7CiAgY3VybF9zb2NrbGVuX3QgbCA9IHNpemVvZihjb25uLT5sb2NhbF9hZGRyKTsKICBzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgQ1VSTGNvZGUgcmVzdWx0OwogIGNvbnN0IGNoYXIgKnNlcnZpY2UgPSAiZnRwIiwgKnNydl9ob3N0ID0gImhvc3QiOwogIGdzc19idWZmZXJfZGVzYyBpbnB1dF9idWZmZXIsIG91dHB1dF9idWZmZXIsIF9nc3NyZXNwLCAqZ3NzcmVzcDsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX25hbWVfdCBnc3NuYW1lOwogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIHN0cnVjdCBnc3NfY2hhbm5lbF9iaW5kaW5nc19zdHJ1Y3QgY2hhbjsKICBzaXplX3QgYmFzZTY0X3N6ID0gMDsKCiAgaWYoZ2V0c29ja25hbWUoY29ubi0+c29ja1tGSVJTVFNPQ0tFVF0sCiAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKUxPQ0FMX0FERFIsICZsKSA8IDApCiAgICBwZXJyb3IoImdldHNvY2tuYW1lKCkiKTsKCiAgY2hhbi5pbml0aWF0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOwogIGNoYW4uaW5pdGlhdG9yX2FkZHJlc3MubGVuZ3RoID0gbCAtIDQ7CiAgY2hhbi5pbml0aWF0b3JfYWRkcmVzcy52YWx1ZSA9CiAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilMT0NBTF9BRERSKS0+c2luX2FkZHIuc19hZGRyOwogIGNoYW4uYWNjZXB0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOwogIGNoYW4uYWNjZXB0b3JfYWRkcmVzcy5sZW5ndGggPSBsIC0gNDsKICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MudmFsdWUgPQogICAgJigoc3RydWN0IHNvY2thZGRyX2luICopUkVNT1RFX0FERFIpLT5zaW5fYWRkci5zX2FkZHI7CiAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLmxlbmd0aCA9IDA7CiAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLnZhbHVlID0gTlVMTDsKCiAgLyogdGhpcyBsb29wIHdpbGwgZXhlY3V0ZSB0d2ljZSAob25jZSBmb3Igc2VydmljZSwgb25jZSBmb3IgaG9zdCkgKi8KICBmb3IoOzspIHsKICAgIC8qIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBiZSByZXBlYXRlZCBoZXJlLCBidXQgY2FuJ3QgaGVscCBpdCAqLwogICAgaWYoc2VydmljZSA9PSBzcnZfaG9zdCkgewogICAgICByZXN1bHQgPSBDdXJsX2Z0cHNlbmRmKGNvbm4sICJBVVRIIEdTU0FQSSIpOwoKICAgICAgaWYocmVzdWx0KQogICAgICAgIHJldHVybiAtMjsKICAgICAgaWYoQ3VybF9HZXRGVFBSZXNwb25zZSgmbnJlYWQsIGNvbm4sIE5VTEwpKQogICAgICAgIHJldHVybiAtMTsKCiAgICAgIGlmKGRhdGEtPnN0YXRlLmJ1ZmZlclswXSAhPSAnMycpCiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlucHV0X2J1ZmZlci52YWx1ZSA9IGRhdGEtPnN0YXRlLmJ1ZmZlcjsKICAgIGlucHV0X2J1ZmZlci5sZW5ndGggPSBzbnByaW50ZihpbnB1dF9idWZmZXIudmFsdWUsIEJVRlNJWkUsICIlc0AlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSwgaG9zdCk7CiAgICBtYWogPSBnc3NfaW1wb3J0X25hbWUoJm1pbiwgJmlucHV0X2J1ZmZlciwgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc25hbWUpOwogICAgaWYobWFqICE9IEdTU19TX0NPTVBMRVRFKSB7CiAgICAgIGdzc19yZWxlYXNlX25hbWUoJm1pbiwgJmdzc25hbWUpOwogICAgICBpZihzZXJ2aWNlID09IHNydl9ob3N0KSB7CiAgICAgICAgQ3VybF9mYWlsZihkYXRhLCAiRXJyb3IgaW1wb3J0aW5nIHNlcnZpY2UgbmFtZSAlcyIsCiAgICAgICAgICAgICAgICAgICBpbnB1dF9idWZmZXIudmFsdWUpOwogICAgICAgIHJldHVybiBBVVRIX0VSUk9SOwogICAgICB9CiAgICAgIHNlcnZpY2UgPSBzcnZfaG9zdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICAvKiBXZSBwYXNzIE5VTEwgYXMgfG91dHB1dF9uYW1lX3R5cGV8IHRvIGF2b2lkIGEgbGVhay4gKi8KICAgIGdzc19kaXNwbGF5X25hbWUoJm1pbiwgZ3NzbmFtZSwgJm91dHB1dF9idWZmZXIsIE5VTEwpOwogICAgQ3VybF9pbmZvZihkYXRhLCAiVHJ5aW5nIGFnYWluc3QgJXNcbiIsIG91dHB1dF9idWZmZXIudmFsdWUpOwogICAgZ3NzcmVzcCA9IEdTU19DX05PX0JVRkZFUjsKICAgICpjb250ZXh0ID0gR1NTX0NfTk9fQ09OVEVYVDsKCiAgICBkbyB7CiAgICAgIC8qIFJlbGVhc2UgdGhlIGJ1ZmZlciBhdCBlYWNoIGl0ZXJhdGlvbiB0byBhdm9pZCBsZWFraW5nOiB0aGUgZmlyc3QgdGltZQogICAgICAgICB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBtZW1vcnkgZnJvbSBnc3NfZGlzcGxheV9uYW1lLiBUaGUgbGFzdCBpdGVtIGlzCiAgICAgICAgIHRha2VuIGNhcmUgYnkgYSBmaW5hbCBnc3NfcmVsZWFzZV9idWZmZXIuICovCiAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluLCAmb3V0cHV0X2J1ZmZlcik7CiAgICAgIHJldCA9IEFVVEhfT0s7CiAgICAgIG1haiA9IEN1cmxfZ3NzX2luaXRfc2VjX2NvbnRleHQoZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ3VybF9rcmI1X21lY2hfb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc3Jlc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKCiAgICAgIGlmKGdzc3Jlc3ApIHsKICAgICAgICBmcmVlKF9nc3NyZXNwLnZhbHVlKTsKICAgICAgICBnc3NyZXNwID0gTlVMTDsKICAgICAgfQoKICAgICAgaWYoR1NTX0VSUk9SKG1haikpIHsKICAgICAgICBDdXJsX2luZm9mKGRhdGEsICJFcnJvciBjcmVhdGluZyBzZWN1cml0eSBjb250ZXh0XG4iKTsKICAgICAgICByZXQgPSBBVVRIX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZihvdXRwdXRfYnVmZmVyLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgcmVzdWx0ID0gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopb3V0cHV0X2J1ZmZlci52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlci5sZW5ndGgsICZwLCAmYmFzZTY0X3N6KTsKICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgIEN1cmxfaW5mb2YoZGF0YSwiYmFzZTY0LWVuY29kaW5nOiAlc1xuIiwgY3VybF9lYXN5X3N0cmVycm9yKHJlc3VsdCkpOwogICAgICAgICAgcmV0ID0gQVVUSF9DT05USU5VRTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcmVzdWx0ID0gQ3VybF9mdHBzZW5kZihjb25uLCAiQURBVCAlcyIsIHApOwoKICAgICAgICBmcmVlKHApOwoKICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgIHJldCA9IC0yOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpIHsKICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzInICYmIGRhdGEtPnN0YXRlLmJ1ZmZlclswXSAhPSAnMycpIHsKICAgICAgICAgIEN1cmxfaW5mb2YoZGF0YSwgIlNlcnZlciBkaWRuJ3QgYWNjZXB0IGF1dGggZGF0YVxuIik7CiAgICAgICAgICByZXQgPSBBVVRIX0VSUk9SOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBwID0gZGF0YS0+c3RhdGUuYnVmZmVyICsgNDsKICAgICAgICBwID0gc3Ryc3RyKHAsICJBREFUPSIpOwogICAgICAgIGlmKHApIHsKICAgICAgICAgIHJlc3VsdCA9IEN1cmxfYmFzZTY0X2RlY29kZShwICsgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKikmX2dzc3Jlc3AudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9nc3NyZXNwLmxlbmd0aCk7CiAgICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgICAgQ3VybF9mYWlsZihkYXRhLCJiYXNlNjQtZGVjb2Rpbmc6ICVzIiwgY3VybF9lYXN5X3N0cmVycm9yKHJlc3VsdCkpOwogICAgICAgICAgICByZXQgPSBBVVRIX0NPTlRJTlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGdzc3Jlc3AgPSAmX2dzc3Jlc3A7CiAgICAgIH0KICAgIH0gd2hpbGUobWFqID09IEdTU19TX0NPTlRJTlVFX05FRURFRCk7CgogICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluLCAmZ3NzbmFtZSk7CiAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJm91dHB1dF9idWZmZXIpOwoKICAgIGlmKGdzc3Jlc3ApCiAgICAgIGZyZWUoX2dzc3Jlc3AudmFsdWUpOwoKICAgIGlmKHJldCA9PSBBVVRIX09LIHx8IHNlcnZpY2UgPT0gc3J2X2hvc3QpCiAgICAgIHJldHVybiByZXQ7CgogICAgc2VydmljZSA9IHNydl9ob3N0OwogIH0KICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBrcmI1X2VuZCh2b2lkICphcHBfZGF0YSkKewogICAgT01fdWludDMyIG1pbjsKICAgIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogICAgaWYoKmNvbnRleHQgIT0gR1NTX0NfTk9fQ09OVEVYVCkgewojaWZkZWYgREVCVUdCVUlMRAogICAgICBPTV91aW50MzIgbWFqID0KI2VuZGlmCiAgICAgIGdzc19kZWxldGVfc2VjX2NvbnRleHQoJm1pbiwgY29udGV4dCwgR1NTX0NfTk9fQlVGRkVSKTsKICAgICAgREVCVUdBU1NFUlQobWFqID09IEdTU19TX0NPTVBMRVRFKTsKICAgIH0KfQoKc3RydWN0IEN1cmxfc2VjX2NsaWVudF9tZWNoIEN1cmxfa3JiNV9jbGllbnRfbWVjaCA9IHsKICAgICJHU1NBUEkiLAogICAgc2l6ZW9mKGdzc19jdHhfaWRfdCksCiAgICBrcmI1X2luaXQsCiAgICBrcmI1X2F1dGgsCiAgICBrcmI1X2VuZCwKICAgIGtyYjVfY2hlY2tfcHJvdCwKICAgIGtyYjVfb3ZlcmhlYWQsCiAgICBrcmI1X2VuY29kZSwKICAgIGtyYjVfZGVjb2RlCn07CgojZW5kaWYgLyogSEFWRV9HU1NBUEkgKi8KI2VuZGlmIC8qIENVUkxfRElTQUJMRV9GVFAgKi8K