LyoKICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCgplbnVtIGZvcm1hdF9mbGFncyB7CiAgICBtaW51c19mbGFnICAgICA9ICAxLAogICAgcGx1c19mbGFnICAgICAgPSAgMiwKICAgIHNwYWNlX2ZsYWcgICAgID0gIDQsCiAgICBhbHRlcm5hdGVfZmxhZyA9ICA4LAogICAgemVyb19mbGFnICAgICAgPSAxNgp9OwoKLyoKICogQ29tbW9uIHN0YXRlCiAqLwoKc3RydWN0IHN0YXRlIHsKICB1bnNpZ25lZCBjaGFyICpzdHI7CiAgdW5zaWduZWQgY2hhciAqczsKICB1bnNpZ25lZCBjaGFyICp0aGVlbmQ7CiAgc2l6ZV90IHN6OwogIHNpemVfdCBtYXhfc3o7CiAgaW50ICgqYXBwZW5kX2NoYXIpKHN0cnVjdCBzdGF0ZSAqLCB1bnNpZ25lZCBjaGFyKTsKICBpbnQgKCpyZXNlcnZlKShzdHJ1Y3Qgc3RhdGUgKiwgc2l6ZV90KTsKICAvKiBYWFggLSBtZXRob2RzICovCn07CgojaWYgMApzdGF0aWMgaW50CmFzX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQp7CiAgaWYgKHN0YXRlLT5zICsgbiA+IHN0YXRlLT50aGVlbmQpIHsKICAgIGludCBvZmYgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7CiAgICB1bnNpZ25lZCBjaGFyICp0bXA7CgogICAgaWYgKHN0YXRlLT5tYXhfc3ogJiYgc3RhdGUtPnN6ID49IHN0YXRlLT5tYXhfc3opCiAgICAgIHJldHVybiAxOwoKICAgIHN0YXRlLT5zeiA9IG1heChzdGF0ZS0+c3ogKiAyLCBzdGF0ZS0+c3ogKyBuKTsKICAgIGlmIChzdGF0ZS0+bWF4X3N6KQogICAgICBzdGF0ZS0+c3ogPSBtaW4oc3RhdGUtPnN6LCBzdGF0ZS0+bWF4X3N6KTsKICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLT5zdHIsIHN0YXRlLT5zeik7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIHJldHVybiAxOwogICAgc3RhdGUtPnN0ciA9IHRtcDsKICAgIHN0YXRlLT5zID0gc3RhdGUtPnN0ciArIG9mZjsKICAgIHN0YXRlLT50aGVlbmQgPSBzdGF0ZS0+c3RyICsgc3RhdGUtPnN6IC0gMTsKICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXNfYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKewogIGlmKGFzX3Jlc2VydmUgKHN0YXRlLCAxKSkKICAgIHJldHVybiAxOwogIGVsc2UgewogICAgKnN0YXRlLT5zKysgPSBjOwogICAgcmV0dXJuIDA7CiAgfQp9CiNlbmRpZgoKc3RhdGljIGludAphcHBlbmRfbnVtYmVyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCgkgICAgICB1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgYmFzZSwgY2hhciAqcmVwLAoJICAgICAgaW50IHdpZHRoLCBpbnQgcHJlYywgaW50IGZsYWdzLCBpbnQgbWludXNwKQp7CiAgaW50IGxlbiA9IDA7CiAgaW50IGk7CgogIC8qIGdpdmVuIHByZWNpc2lvbiwgaWdub3JlIHplcm8gZmxhZyAqLwogIGlmKHByZWMgIT0gLTEpCiAgICBmbGFncyAmPSB+emVyb19mbGFnOwogIGVsc2UKICAgIHByZWMgPSAxOwogIC8qIHplcm8gdmFsdWUgd2l0aCB6ZXJvIHByZWNpc2lvbiAtPiAiIiAqLwogIGlmKHByZWMgPT0gMCAmJiBudW0gPT0gMCkKICAgIHJldHVybiAwOwogIGRvewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCByZXBbbnVtICUgYmFzZV0pKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogICAgbnVtIC89IGJhc2U7CiAgfXdoaWxlKG51bSk7CiAgcHJlYyAtPSBsZW47CiAgLyogcGFkIHdpdGggcHJlYyB6ZXJvcyAqLwogIHdoaWxlKHByZWMtLSA+IDApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0KICAvKiBhZGQgbGVuZ3RoIG9mIGFsdGVybmF0ZSBwcmVmaXggKGFkZGVkIGxhdGVyKSB0byBsZW4gKi8KICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpCiAgICBsZW4gKz0gYmFzZSAvIDg7CiAgLyogcGFkIHdpdGggemVyb3MgKi8KICBpZihmbGFncyAmIHplcm9fZmxhZyl7CiAgICB3aWR0aCAtPSBsZW47CiAgICBpZihtaW51c3AgfHwgKGZsYWdzICYgc3BhY2VfZmxhZykgfHwgKGZsYWdzICYgcGx1c19mbGFnKSkKICAgICAgd2lkdGgtLTsKICAgIHdoaWxlKHdpZHRoLS0gPiAwKXsKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQoJcmV0dXJuIDE7CiAgICAgIGxlbisrOwogICAgfQogIH0KICAvKiBhZGQgYWx0ZXJuYXRlIHByZWZpeCAqLwogIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSl7CiAgICBpZihiYXNlID09IDE2KQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIHJlcFsxMF0gKyAyMykpIC8qIFhYWCAqLwoJcmV0dXJuIDE7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcwJykpCiAgICAgIHJldHVybiAxOwogIH0KICAvKiBhZGQgc2lnbiAqLwogIGlmKG1pbnVzcCl7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICctJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfSBlbHNlIGlmKGZsYWdzICYgcGx1c19mbGFnKSB7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcrJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfSBlbHNlIGlmKGZsYWdzICYgc3BhY2VfZmxhZykgewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnICcpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0KICBpZihmbGFncyAmIG1pbnVzX2ZsYWcpCiAgICAvKiBzd2FwIGJlZm9yZSBwYWRkaW5nIHdpdGggc3BhY2VzICovCiAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspewogICAgICBjaGFyIGMgPSBzdGF0ZS0+c1staS0xXTsKICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOwogICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKICAgIH0KICB3aWR0aCAtPSBsZW47CiAgd2hpbGUod2lkdGgtLSA+IDApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAgJyAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQogICAgLyogc3dhcCBhZnRlciBwYWRkaW5nIHdpdGggc3BhY2VzICovCiAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspewogICAgICBjaGFyIGMgPSBzdGF0ZS0+c1staS0xXTsKICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOwogICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXBwZW5kX3N0cmluZyAoc3RydWN0IHN0YXRlICpzdGF0ZSwKCSAgICAgICB1bnNpZ25lZCBjaGFyICphcmcsCgkgICAgICAgaW50IHdpZHRoLAoJICAgICAgIGludCBwcmVjLAoJICAgICAgIGludCBmbGFncykKewogIGlmKHByZWMgIT0gLTEpCiAgICB3aWR0aCAtPSBwcmVjOwogIGVsc2UKICAgIHdpZHRoIC09IHN0cmxlbigoY2hhciAqKWFyZyk7CiAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQogICAgd2hpbGUod2lkdGgtLSA+IDApCiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCglyZXR1cm4gMTsKICBpZiAocHJlYyAhPSAtMSkgewogICAgd2hpbGUgKCphcmcgJiYgcHJlYy0tKQogICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgKmFyZysrKSkKCXJldHVybiAxOwogIH0gZWxzZSB7CiAgICB3aGlsZSAoKmFyZykKICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICphcmcrKykpCglyZXR1cm4gMTsKICB9CiAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQogICAgd2hpbGUod2lkdGgtLSA+IDApCiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCglyZXR1cm4gMTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAphcHBlbmRfY2hhcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAoJICAgIHVuc2lnbmVkIGNoYXIgYXJnLAoJICAgIGludCB3aWR0aCwKCSAgICBpbnQgZmxhZ3MpCnsKICB3aGlsZSghKGZsYWdzICYgbWludXNfZmxhZykgJiYgLS13aWR0aCA+IDApCiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQogICAgICByZXR1cm4gMTsKCiAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgYXJnKSkKICAgIHJldHVybiAxOwogIHdoaWxlKChmbGFncyAmIG1pbnVzX2ZsYWcpICYmIC0td2lkdGggPiAwKQogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CgogIHJldHVybiAwOwp9CgovKgogKiBUaGlzIGNhbid0IGJlIG1hZGUgaW50byBhIGZ1bmN0aW9uLi4uCiAqLwoKI2RlZmluZSBQQVJTRV9JTlRfRk9STUFUKHJlcywgYXJnLCB1bnNpZykgXAppZiAobG9uZ19mbGFnKSBcCiAgICAgcmVzID0gKHVuc2lnIGxvbmcpdmFfYXJnKGFyZywgdW5zaWcgbG9uZyk7IFwKZWxzZSBpZiAoc2hvcnRfZmxhZykgXAogICAgIHJlcyA9ICh1bnNpZyBzaG9ydCl2YV9hcmcoYXJnLCB1bnNpZyBpbnQpOyBcCmVsc2UgXAogICAgIHJlcyA9ICh1bnNpZyBpbnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KQoKLyoKICogenl4cHJpbnRmIC0gcmV0dXJuIDAgb3IgLTEKICovCgpzdGF0aWMgaW50Cnh5enByaW50ZiAoc3RydWN0IHN0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqY2hhcl9mb3JtYXQsIHZhX2xpc3QgYXApCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpmb3JtYXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWNoYXJfZm9ybWF0OwogIHVuc2lnbmVkIGNoYXIgYzsKCiAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKSB7CiAgICBpZiAoYyA9PSAnJScpIHsKICAgICAgaW50IGZsYWdzICAgICAgPSAwOwogICAgICBpbnQgd2lkdGggICAgICA9IDA7CiAgICAgIGludCBwcmVjICAgICAgID0gLTE7CiAgICAgIGludCBsb25nX2ZsYWcgID0gMDsKICAgICAgaW50IHNob3J0X2ZsYWcgPSAwOwoKICAgICAgLyogZmxhZ3MgKi8KICAgICAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKXsKCWlmKGMgPT0gJy0nKQoJICBmbGFncyB8PSBtaW51c19mbGFnOwoJZWxzZSBpZihjID09ICcrJykKCSAgZmxhZ3MgfD0gcGx1c19mbGFnOwoJZWxzZSBpZihjID09ICcgJykKCSAgZmxhZ3MgfD0gc3BhY2VfZmxhZzsKCWVsc2UgaWYoYyA9PSAnIycpCgkgIGZsYWdzIHw9IGFsdGVybmF0ZV9mbGFnOwoJZWxzZSBpZihjID09ICcwJykKCSAgZmxhZ3MgfD0gemVyb19mbGFnOwoJZWxzZQoJICBicmVhazsKICAgICAgfQoKICAgICAgaWYoKGZsYWdzICYgc3BhY2VfZmxhZykgJiYgKGZsYWdzICYgcGx1c19mbGFnKSkKCWZsYWdzIF49IHNwYWNlX2ZsYWc7CgogICAgICBpZigoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAoZmxhZ3MgJiB6ZXJvX2ZsYWcpKQoJZmxhZ3MgXj0gemVyb19mbGFnOwoKICAgICAgLyogd2lkdGggKi8KICAgICAgaWYgKGlzZGlnaXQoYykpCglkbyB7CgkgIHdpZHRoID0gd2lkdGggKiAxMCArIGMgLSAnMCc7CgkgIGMgPSAqZm9ybWF0Kys7Cgl9IHdoaWxlKGlzZGlnaXQoYykpOwogICAgICBlbHNlIGlmKGMgPT0gJyonKSB7Cgl3aWR0aCA9IHZhX2FyZyhhcCwgaW50KTsKCWMgPSAqZm9ybWF0Kys7CiAgICAgIH0KCiAgICAgIC8qIHByZWNpc2lvbiAqLwogICAgICBpZiAoYyA9PSAnLicpIHsKCXByZWMgPSAwOwoJYyA9ICpmb3JtYXQrKzsKCWlmIChpc2RpZ2l0KGMpKQoJICBkbyB7CgkgICAgcHJlYyA9IHByZWMgKiAxMCArIGMgLSAnMCc7CgkgICAgYyA9ICpmb3JtYXQrKzsKCSAgfSB3aGlsZShpc2RpZ2l0KGMpKTsKCWVsc2UgaWYgKGMgPT0gJyonKSB7CgkgIHByZWMgPSB2YV9hcmcoYXAsIGludCk7CgkgIGMgPSAqZm9ybWF0Kys7Cgl9CiAgICAgIH0KCiAgICAgIC8qIHNpemUgKi8KCiAgICAgIGlmIChjID09ICdoJykgewoJc2hvcnRfZmxhZyA9IDE7CgljID0gKmZvcm1hdCsrOwogICAgICB9IGVsc2UgaWYgKGMgPT0gJ2wnKSB7Cglsb25nX2ZsYWcgPSAxOwoJYyA9ICpmb3JtYXQrKzsKICAgICAgfQoKICAgICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJ2MnIDoKCWlmKGFwcGVuZF9jaGFyKHN0YXRlLCB2YV9hcmcoYXAsIGludCksIHdpZHRoLCBmbGFncykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBjYXNlICdzJyA6CglpZiAoYXBwZW5kX3N0cmluZyhzdGF0ZSwKCQkJICB2YV9hcmcoYXAsIHVuc2lnbmVkIGNoYXIqKSwKCQkJICB3aWR0aCwKCQkJICBwcmVjLAoJCQkgIGZsYWdzKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIGNhc2UgJ2QnIDoKICAgICAgY2FzZSAnaScgOiB7Cglsb25nIGFyZzsKCXVuc2lnbmVkIGxvbmcgbnVtOwoJaW50IG1pbnVzcCA9IDA7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCBzaWduZWQpOwoKCWlmIChhcmcgPCAwKSB7CgkgIG1pbnVzcCA9IDE7CgkgIG51bSA9IC1hcmc7Cgl9IGVsc2UKCSAgbnVtID0gYXJnOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgbnVtLCAxMCwgIjAxMjM0NTY3ODkiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIG1pbnVzcCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3UnIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDEwLCAiMDEyMzQ1Njc4OSIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ28nIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDAxMCwgIjAxMjM0NTY3IiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAneCcgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZzsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlhYmNkZWYiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdYJyA6ewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5QUJDREVGIiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAncCcgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZyA9ICh1bnNpZ25lZCBsb25nKXZhX2FyZyhhcCwgdm9pZCopOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ24nIDogewoJaW50ICphcmcgPSB2YV9hcmcoYXAsIGludCAqKTsKCSphcmcgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdcMCcgOgoJICAtLWZvcm1hdDsKCSAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAnJScgOgoJaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgYykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBkZWZhdWx0IDoKCWlmICggICAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICclJykKCSAgICB8fCAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgfSBlbHNlCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBjKSkKCXJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0KCiNpZiAwCiNpZm5kZWYgSEFWRV9BU1BSSU5URgppbnQKYXNwcmludGYgKGNoYXIgKipyZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIGludCB2YWw7CgogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgdmFsID0gdmFzcHJpbnRmIChyZXQsIGZvcm1hdCwgYXJncyk7CgojaWZkZWYgUEFSQU5PSUEKICB7CiAgICBpbnQgcmV0MjsKICAgIGNoYXIgKnRtcDsKICAgIHRtcCA9IG1hbGxvYyAodmFsICsgMSk7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIGFib3J0ICgpOwoKICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQogICAgICBhYm9ydCAoKTsKICAgIGZyZWUgKHRtcCk7CiAgfQojZW5kaWYKCiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiB2YWw7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfVkFTTlBSSU5URgppbnQKbmRfdmFzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCnsKICBpbnQgc3Q7CiAgc2l6ZV90IGxlbjsKICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CgogIHN0YXRlLm1heF9zeiA9IG1heF9zejsKICBzdGF0ZS5zeiAgICAgPSAxOwogIHN0YXRlLnN0ciAgICA9IG1hbGxvYyhzdGF0ZS5zeik7CiAgaWYgKHN0YXRlLnN0ciA9PSBOVUxMKSB7CiAgICAqcmV0ID0gTlVMTDsKICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGUucyA9IHN0YXRlLnN0cjsKICBzdGF0ZS50aGVlbmQgPSBzdGF0ZS5zICsgc3RhdGUuc3ogLSAxOwogIHN0YXRlLmFwcGVuZF9jaGFyID0gYXNfYXBwZW5kX2NoYXI7CiAgc3RhdGUucmVzZXJ2ZSAgICAgPSBhc19yZXNlcnZlOwoKICBzdCA9IHh5enByaW50ZiAoJnN0YXRlLCBmb3JtYXQsIGFyZ3MpOwogIGlmIChzdCkgewogICAgZnJlZSAoc3RhdGUuc3RyKTsKICAgICpyZXQgPSBOVUxMOwogICAgcmV0dXJuIC0xOwogIH0gZWxzZSB7CiAgICBjaGFyICp0bXA7CgogICAgKnN0YXRlLnMgPSAnXDAnOwogICAgbGVuID0gc3RhdGUucyAtIHN0YXRlLnN0cjsKICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLnN0ciwgbGVuKzEpOwogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgIGZyZWUgKHN0YXRlLnN0cik7CiAgICAgICpyZXQgPSBOVUxMOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAqcmV0ID0gdG1wOwogICAgcmV0dXJuIGxlbjsKICB9Cn0KI2VuZGlmCiNlbmRpZgo=