LyogdjNfcGNpLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KLyogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0CiAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKICovCi8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAiY3J5cHRsaWIuaCIKI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgojaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KCnN0YXRpYyBpbnQgaTJyX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpleHQsCglCSU8gKm91dCwgaW50IGluZGVudCk7CnN0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCglYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cgpjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wY2kgPQoJeyBOSURfcHJveHlDZXJ0SW5mbywgMCwgQVNOMV9JVEVNX3JlZihQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKSwKCSAgMCwwLDAsMCwKCSAgMCwwLAoJICBOVUxMLCBOVUxMLAoJICAoWDUwOVYzX0VYVF9JMlIpaTJyX3BjaSwKCSAgKFg1MDlWM19FWFRfUjJJKXIyaV9wY2ksCgkgIE5VTEwsCgl9OwoKc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSwKCUJJTyAqb3V0LCBpbnQgaW5kZW50KQoJewoJQklPX3ByaW50ZihvdXQsICIlKnNQYXRoIExlbmd0aCBDb25zdHJhaW50OiAiLCBpbmRlbnQsICIiKTsKCWlmIChwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpCgkgIGkyYV9BU04xX0lOVEVHRVIob3V0LCBwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpOwoJZWxzZQoJICBCSU9fcHJpbnRmKG91dCwgImluZmluaXRlIik7CglCSU9fcHV0cyhvdXQsICJcbiIpOwoJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgTGFuZ3VhZ2U6ICIsIGluZGVudCwgIiIpOwoJaTJhX0FTTjFfT0JKRUNUKG91dCwgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpOwoJQklPX3B1dHMob3V0LCAiXG4iKTsKCWlmIChwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgJiYgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKQoJICBCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeSBUZXh0OiAlc1xuIiwgaW5kZW50LCAiIiwKCQkgICAgIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeS0+ZGF0YSk7CglyZXR1cm4gMTsKCX0KCnN0YXRpYyBpbnQgcHJvY2Vzc19wY2lfdmFsdWUoQ09ORl9WQUxVRSAqdmFsLAoJQVNOMV9PQkpFQ1QgKipsYW5ndWFnZSwgQVNOMV9JTlRFR0VSICoqcGF0aGxlbiwKCUFTTjFfT0NURVRfU1RSSU5HICoqcG9saWN5KQoJewoJaW50IGZyZWVfcG9saWN5ID0gMDsKCglpZiAoc3RyY21wKHZhbC0+bmFtZSwgImxhbmd1YWdlIikgPT0gMCkKCQl7CgkJaWYgKCpsYW5ndWFnZSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFRZX0RFRklORUQpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQlpZiAoISgqbGFuZ3VhZ2UgPSBPQkpfdHh0Mm9iaih2YWwtPnZhbHVlLCAwKSkpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQl9CgllbHNlIGlmIChzdHJjbXAodmFsLT5uYW1lLCAicGF0aGxlbiIpID09IDApCgkJewoJCWlmICgqcGF0aGxlbikKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFRZX0RFRklORUQpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQlpZiAoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgcGF0aGxlbikpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSCk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCWVsc2UgaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJwb2xpY3kiKSA9PSAwKQoJCXsKCQl1bnNpZ25lZCBjaGFyICp0bXBfZGF0YSA9IE5VTEw7CgkJbG9uZyB2YWxfbGVuOwoJCWlmICghKnBvbGljeSkKCQkJewoJCQkqcG9saWN5ID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CgkJCWlmICghKnBvbGljeSkKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCXJldHVybiAwOwoJCQkJfQoJCQlmcmVlX3BvbGljeSA9IDE7CgkJCX0KCQlpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiaGV4OiIsIDQpID09IDApCgkJCXsKCQkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEyID0KCQkJCXN0cmluZ190b19oZXgodmFsLT52YWx1ZSArIDQsICZ2YWxfbGVuKTsKCgkJCWlmICghdG1wX2RhdGEyKSBnb3RvIGVycjsKCgkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOwoJCQlpZiAodG1wX2RhdGEpCgkJCQl7CgkJCQkoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKCQkJCW1lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwKCQkJCQl0bXBfZGF0YTIsIHZhbF9sZW4pOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKCQkJCSgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwoJCQkJfQoJCQl9CgkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiZmlsZToiLCA1KSA9PSAwKQoJCQl7CgkJCXVuc2lnbmVkIGNoYXIgYnVmWzIwNDhdOwoJCQlpbnQgbjsKCQkJQklPICpiID0gQklPX25ld19maWxlKHZhbC0+dmFsdWUgKyA1LCAiciIpOwoJCQlpZiAoIWIpCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfQklPX0xJQik7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQl3aGlsZSgobiA9IEJJT19yZWFkKGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDAKCQkJCXx8IChuID09IDAgJiYgQklPX3Nob3VsZF9yZXRyeShiKSkpCgkJCQl7CgkJCQlpZiAoIW4pIGNvbnRpbnVlOwoKCQkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKCQkJCQkoKnBvbGljeSktPmxlbmd0aCArIG4gKyAxKTsKCgkJCQlpZiAoIXRtcF9kYXRhKQoJCQkJCWJyZWFrOwoKCQkJCSgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwoJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAoJCQkJCWJ1Ziwgbik7CgkJCQkoKnBvbGljeSktPmxlbmd0aCArPSBuOwoJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CgkJCQl9CgoJCQlpZiAobiA8IDApCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfQklPX0xJQik7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQl9CgkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAidGV4dDoiLCA1KSA9PSAwKQoJCQl7CgkJCXZhbF9sZW4gPSBzdHJsZW4odmFsLT52YWx1ZSArIDUpOwoJCQl0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCgkJCQkoKnBvbGljeSktPmxlbmd0aCArIHZhbF9sZW4gKyAxKTsKCQkJaWYgKHRtcF9kYXRhKQoJCQkJewoJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CgkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCgkJCQkJdmFsLT52YWx1ZSArIDUsIHZhbF9sZW4pOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKCQkJCSgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwoJCQkJfQoJCQl9CgkJZWxzZQoJCQl7CgkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJZ290byBlcnI7CgkJCX0KCQlpZiAoIXRtcF9kYXRhKQoJCQl7CgkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlnb3RvIGVycjsKCQkJfQoJCX0KCXJldHVybiAxOwplcnI6CglpZiAoZnJlZV9wb2xpY3kpCgkJewoJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUoKnBvbGljeSk7CgkJKnBvbGljeSA9IE5VTEw7CgkJfQoJcmV0dXJuIDA7Cgl9CgpzdGF0aWMgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcjJpX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAoJWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKCXsKCVBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSA9IE5VTEw7CglTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsczsKCUFTTjFfT0JKRUNUICpsYW5ndWFnZSA9IE5VTEw7CglBU04xX0lOVEVHRVIgKnBhdGhsZW4gPSBOVUxMOwoJQVNOMV9PQ1RFVF9TVFJJTkcgKnBvbGljeSA9IE5VTEw7CglpbnQgaSwgajsKCgl2YWxzID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOwoJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHMpOyBpKyspCgkJewoJCUNPTkZfVkFMVUUgKmNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFscywgaSk7CgkJaWYgKCFjbmYtPm5hbWUgfHwgKCpjbmYtPm5hbWUgIT0gJ0AnICYmICFjbmYtPnZhbHVlKSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCWdvdG8gZXJyOwoJCQl9CgkJaWYgKCpjbmYtPm5hbWUgPT0gJ0AnKQoJCQl7CgkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0OwoJCQlpbnQgc3VjY2Vzc19wID0gMTsKCgkJCXNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPm5hbWUgKyAxKTsKCQkJaWYgKCFzZWN0KQoJCQkJewoJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKCQkJCVg1MDlWM19jb25mX2VycihjbmYpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCWZvciAoaiA9IDA7IHN1Y2Nlc3NfcCAmJiBqIDwgc2tfQ09ORl9WQUxVRV9udW0oc2VjdCk7IGorKykKCQkJCXsKCQkJCXN1Y2Nlc3NfcCA9CgkJCQkJcHJvY2Vzc19wY2lfdmFsdWUoc2tfQ09ORl9WQUxVRV92YWx1ZShzZWN0LCBqKSwKCQkJCQkJJmxhbmd1YWdlLCAmcGF0aGxlbiwgJnBvbGljeSk7CgkJCQl9CgkJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBzZWN0KTsKCQkJaWYgKCFzdWNjZXNzX3ApCgkJCQlnb3RvIGVycjsKCQkJfQoJCWVsc2UKCQkJewoJCQlpZiAoIXByb2Nlc3NfcGNpX3ZhbHVlKGNuZiwKCQkJCQkmbGFuZ3VhZ2UsICZwYXRobGVuLCAmcG9saWN5KSkKCQkJCXsKCQkJCVg1MDlWM19jb25mX2VycihjbmYpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCX0KCQl9CgoJLyogTGFuZ3VhZ2UgaXMgbWFuZGF0b3J5ICovCglpZiAoIWxhbmd1YWdlKQoJCXsKCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxYNTA5VjNfUl9OT19QUk9YWV9DRVJUX1BPTElDWV9MQU5HVUFHRV9ERUZJTkVEKTsKCQlnb3RvIGVycjsKCQl9CglpID0gT0JKX29iajJuaWQobGFuZ3VhZ2UpOwoJaWYgKChpID09IE5JRF9JbmRlcGVuZGVudCB8fCBpID09IE5JRF9pZF9wcGxfaW5oZXJpdEFsbCkgJiYgcG9saWN5KQoJCXsKCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kpOwoJCWdvdG8gZXJyOwoJCX0KCglwY2kgPSBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX25ldygpOwoJaWYgKCFwY2kpCgkJewoJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQlnb3RvIGVycjsKCQl9CgoJcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UgPSBsYW5ndWFnZTsgbGFuZ3VhZ2UgPSBOVUxMOwoJcGNpLT5wcm94eVBvbGljeS0+cG9saWN5ID0gcG9saWN5OyBwb2xpY3kgPSBOVUxMOwoJcGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50ID0gcGF0aGxlbjsgcGF0aGxlbiA9IE5VTEw7Cglnb3RvIGVuZDsKZXJyOgoJaWYgKGxhbmd1YWdlKSB7IEFTTjFfT0JKRUNUX2ZyZWUobGFuZ3VhZ2UpOyBsYW5ndWFnZSA9IE5VTEw7IH0KCWlmIChwYXRobGVuKSB7IEFTTjFfSU5URUdFUl9mcmVlKHBhdGhsZW4pOyBwYXRobGVuID0gTlVMTDsgfQoJaWYgKHBvbGljeSkgeyBBU04xX09DVEVUX1NUUklOR19mcmVlKHBvbGljeSk7IHBvbGljeSA9IE5VTEw7IH0KCWlmIChwY2kpIHsgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9mcmVlKHBjaSk7IHBjaSA9IE5VTEw7IH0KZW5kOgoJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZSh2YWxzLCBYNTA5VjNfY29uZl9mcmVlKTsKCXJldHVybiBwY2k7Cgl9Cg==