LyoKICAgIDw6Y29weXJpZ2h0LUJSQ006MjAxMzpEVUFML0dQTDpzdGFuZGFyZAogICAgCiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAgIAogICAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQogICAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAogICAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCiAgICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKICAgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CiAgICAKICAgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKICAgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAogICAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgogICAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAogICAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCiAgICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCiAgICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucwogICAgICAgb2YgdGhlIHNvZnR3YXJlLgogICAgCiAgICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKICAgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAogICAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKICAgIHdyaXR0ZW4gY29uc2VudC4KICAgIAogICAgOj4gCgoqLwoKI2luY2x1ZGUgImJic2kuaCIKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwojZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKCiNkZWZpbmUgTU9DQV9SRCh4KSAgICAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdWludDMyX3QgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpa2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5kZXZJZCwgKHVpbnQzMl90KSh4KSkpKQoKI2RlZmluZSBNT0NBX1JEOCh4LCB5KSAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgKCooeSkgPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBsb25nKSh4KSkpKSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgKGtlclN5c0JjbVNwaVNsYXZlUmVhZCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksIHksIDEpKSkKCiNkZWZpbmUgTU9DQV9XUih4LHkpICAgZG8geyAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh2b2xhdGlsZSB1aW50MzJfdCAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgPSAoeSkgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJTeXNCY21TcGlTbGF2ZVdyaXRlUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5kZXZJZCwgKHVpbnQzMl90KSh4KSwgKHkpKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUjgoeCx5KSAgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIGNoYXIpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksICh5KSwgMSkpOyB9IHdoaWxlKDApCgojZGVmaW5lIE1PQ0FfV1IxNih4LHkpICAgZG8geyAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgPSAodW5zaWduZWQgc2hvcnQpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksICh5KSwgMikpOyB9IHdoaWxlKDApCgojZGVmaW5lIE1PQ0FfV1JfQkxPQ0soYWRkciwgc3JjLCBsZW4pIGRvIHsga2VyU3lzQmNtU3BpU2xhdmVXcml0ZUJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCBhZGRyLCBzcmMsIGxlbiwgNCk7IH0gd2hpbGUoMCkKI2RlZmluZSBNT0NBX1JEX0JMT0NLKGFkZHIsIGRzdCwgbGVuKSBkbyB7IGtlclN5c0JjbVNwaVNsYXZlUmVhZEJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCBhZGRyLCBkc3QsIGxlbiwgNCk7IH0gd2hpbGUoMCkKCgojZGVmaW5lIEkyQ19SRCh4KQkJTU9DQV9SRCh4KQojZGVmaW5lIEkyQ19XUih4LCB5KQkJTU9DQV9XUih4LCB5KQoKI2RlZmluZSBNT0NBX0JQQ01fTlVNICAgICAgICAgNQojZGVmaW5lIE1PQ0FfQlBDTV9aT05FU19OVU0gICA4CgojZGVmaW5lIE1PQ0FfQ1BVX0NMT0NLX05VTSAgMQojZGVmaW5lIE1PQ0FfUEhZX0NMT0NLX05VTSAgMgoKdHlwZWRlZiBlbnVtIF9QTUJfQ09NTUFORF9FXwp7CiAgIFBNQl9DT01NQU5EX1BIWTFfT049MCwKICAgUE1CX0NPTU1BTkRfUEFSVElBTF9PTiwKICAgUE1CX0NPTU1BTkRfUEhZMV9PRkYsCiAgIFBNQl9DT01NQU5EX0FMTF9PRkYsCgogICBQTUJfQ09NTUFORF9MQVNUCn0gUE1CX0NPTU1BTkRfRTsKCnR5cGVkZWYgZW51bSBfUE1CX0dJVkVfT1dORVJTSElQX0VfCnsKICAgUE1CX0dJVkVfT1dORVJTSElQXzJfSE9TVCA9IDAsCiAgIFBNQl9HSVZFX09XTkVSU0hJUF8yX0ZXLAoKICAgUE1CX0dFVF9PV05FUlNISVBfTEFTVAp9IFBNQl9HSVZFX09XTkVSU0hJUF9FOwoKc3RydWN0IG1vY2FfNjgweF9jbGsKewoJc3RydWN0IGRldmljZSAqZGV2OwoJdWludDMyX3QgICAgICAgY2xvY2tfbnVtOwp9OwoKc3RhdGljIHVpbnQzMl90IHpvbmVfYWxsX29mZl9iaXRtYXNrW01PQ0FfQlBDTV9OVU1dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CnN0YXRpYyB1aW50MzJfdCB6b25lX3BhcnRpYWxfb25fYml0bWFza1tNT0NBX0JQQ01fTlVNXSAgPSB7IDB4NDEsIDB4RkMsIDB4RkYsIDB4RkYsIDB4MDAgfTsKc3RhdGljIHVpbnQzMl90IHpvbmVfcGh5MV9iaXRtYXNrW01PQ0FfQlBDTV9OVU1dICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiB9OwoKCnN0YXRpYyB2b2lkIGJvZ3VzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQp7Cn0KCnN0YXRpYyBzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhIG1vY2FfbGFuX2RhdGEgPSB7CgkubWFjYWRkcl9oaSA9CQkweDAwMDAwMTAyLAoJLm1hY2FkZHJfbG8gPQkJMHgwMzA0MDAwMCwKCgkuYmNtMzQ1MF9pMmNfYmFzZSA9ICAweDEwNDA2MjAwLAoJLmJjbTM0NTBfaTJjX2FkZHIgPSAgMHg3MCwKCS5od19yZXYgID0gICAgIEhXUkVWX01PQ0FfMjBfR0VOMjIsCgkucmZfYmFuZCA9ICAgICBNT0NBX0JBTkRfRVhUX0QsCgkuY2hpcF9pZCA9ICAgICAwLAoJLnVzZV9kbWEgICAgICAgICAgID0gMCwKCS51c2Vfc3BpICAgICAgICAgICA9IDEsCgkuZGV2SWQgICAgICAgICAgICA9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCwgLy8gRmlsbGVkIGluIGR5bmFtaWNhbGx5CiNpZmRlZiBDT05GSUdfU01QCgkuc21wX3Byb2Nlc3Nvcl9pZCA9IDEsCiNlbmRpZgp9OwoKc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtb2NhX2xhbl9yZXNvdXJjZXNbXSA9IHsKCVswXSA9IHsKCQkuc3RhcnQgPSAweDEwNjAwMDAwLAoJCS5lbmQgPSAgIDB4MTA3ZmZkOTcsCgkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCgl9LAoJWzFdID0geyAvKiBOb3QgdXNlZCBmb3IgNjgwMiwgZGVmaW5lIGZvciBibW9jYSAqLwoJCS5zdGFydCA9IDAsCgkJLmVuZCA9IDAsCgkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCgl9Cn07CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtb2NhX2xhbl9wbGF0X2RldiA9IHsKCS5uYW1lID0gImJtb2NhIiwKCS5pZCA9IDAsCgkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobW9jYV9sYW5fcmVzb3VyY2VzKSwKCS5yZXNvdXJjZSA9IG1vY2FfbGFuX3Jlc291cmNlcywKCS5kZXYgPSB7CgkJLnBsYXRmb3JtX2RhdGEgPSAmbW9jYV9sYW5fZGF0YSwKCQkucmVsZWFzZSA9IGJvZ3VzX3JlbGVhc2UsCgl9LAp9OwoKc3RhdGljIHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgbW9jYV93YW5fZGF0YSA9IHsKCS5tYWNhZGRyX2hpICAgICAgID0gMHgwMDAwMDEwMiwKCS5tYWNhZGRyX2xvICAgICAgID0gMHgwMzA0MDAwMCwKCgkuYmNtMzQ1MF9pMmNfYmFzZSA9ICAweDEwNDA2MjAwLAoJLmJjbTM0NTBfaTJjX2FkZHIgPSAgMHg3MCwKCS5od19yZXYgID0gSFdSRVZfTU9DQV8yMF9HRU4yMiwKCS5jaGlwX2lkID0gMCwKCQoJLnJmX2JhbmQgPSBNT0NBX0JBTkRfRVhUX0QsCgoJLnVzZV9kbWEgICAgICAgICAgID0gMCwKCS51c2Vfc3BpICAgICAgICAgICA9IDEsCgkuZGV2SWQgICAgICAgICAgICA9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCwgLy8gRmlsbGVkIGluIGR5bmFtaWNhbGx5CgojaWZkZWYgQ09ORklHX1NNUAoJLnNtcF9wcm9jZXNzb3JfaWQgPSAxLAojZW5kaWYKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW9jYV93YW5fcmVzb3VyY2VzW10gPSB7CglbMF0gPSB7CgkJLnN0YXJ0ID0gMHgxMDYwMDAwMCwKCQkuZW5kID0gICAweDEwN2ZmZDk3LAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAoJfSwKCVsxXSA9IHsgLyogTm90IHVzZWQgZm9yIDY4MDIsIGRlZmluZSBmb3IgYm1vY2EgKi8KCQkuc3RhcnQgPSAwLAoJCS5lbmQgPSAwLAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAoJfQp9OwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW9jYV93YW5fcGxhdF9kZXYgPSB7CgkubmFtZSAgICAgICAgICA9ICJibW9jYSIsCgkuaWQgICAgICAgICAgICA9IDEsCgkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobW9jYV93YW5fcmVzb3VyY2VzKSwKCS5yZXNvdXJjZSAgICAgID0gbW9jYV93YW5fcmVzb3VyY2VzLAoJLmRldiAgICAgICAgICAgPSB7CgkJLnBsYXRmb3JtX2RhdGEgPSAmbW9jYV93YW5fZGF0YSwKCQkucmVsZWFzZSAgICAgICA9IGJvZ3VzX3JlbGVhc2UsCgl9LAp9OwoKCi8qIE1vQ0EgQ2xvY2sgRnVuY3Rpb25zICovCnN0cnVjdCBjbGsgKm1vY2FfY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQp7CgkvLyBXZSdyZSBub3QgYWN0dWFsbHkgdXNpbmcgdGhlICJzdHJ1Y3QgY2xrIiBmb3IgYW55dGhpbmcKCS8vIFdlJ2xsIHVzZSBvdXIgb3duIHN0cnVjdHVyZQoJc3RydWN0IG1vY2FfNjgweF9jbGsgKiBwY2xrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vY2FfNjgweF9jbGspLCBHRlBfS0VSTkVMKTsKCglwY2xrLT5kZXYgPSBkZXY7CgoJaWYgKCFzdHJjbXAoaWQsICJtb2NhLWNwdSIpKQoJCXBjbGstPmNsb2NrX251bSA9IE1PQ0FfQ1BVX0NMT0NLX05VTTsKCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJtb2NhLXBoeSIpKQoJCXBjbGstPmNsb2NrX251bSA9IE1PQ0FfUEhZX0NMT0NLX05VTTsKCWVsc2UKCXsKCQlrZnJlZShwY2xrKTsKCQlyZXR1cm4oTlVMTCk7Cgl9CgoJcmV0dXJuKChzdHJ1Y3QgY2xrICopcGNsayk7Cn0KCmludCBtb2NhX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQp7CglyZXR1cm4gMDsKfQoKdm9pZCBtb2NhX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKewp9Cgp2b2lkIG1vY2FfY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCnsKCWtmcmVlKChzdHJ1Y3QgbW9jYV82ODB4X2NsayAqKWNsayk7Cn0KCnN0cnVjdCBtb2NhXzY4MDJjMF9jbG9ja19wYXJhbXMKewoJdWludDMyX3QgICAgICAgIGNwdV9oejsKCXVpbnQzMl90ICAgICAgICBwZGl2OwoJdWludDMyX3QgICAgICAgIG5kaXY7Cgl1aW50MzJfdCAgICAgICAgcGxsX21kaXZzWzZdOwp9OwoKI2RlZmluZSBOVU1fNjgwMkMwX0NMT0NLX09QVElPTlMgMgpzdHJ1Y3QgbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zIG1vY2FfNjgwMmMwX2Nsb2NrX3BhcmFtc1tOVU1fNjgwMkMwX0NMT0NLX09QVElPTlNdID0KewoJeyAgLy8gVkNPIG9mIDIyMDAsIGRlZmF1bHQKCQk0NDAwMDAwMDAsICAgICAgICAgICAgIC8vIGNwdV9oegoJCTEsICAgICAgICAgICAgICAgICAgICAgLy8gcGRpdgoJCTQ0LCAgICAgICAgICAgICAgICAgICAgLy8gbmRpdgoJCXs1LCAyMiwgNywgNywgNDQsIDQ0fSAgLy8gcGxsX21kaXZzWzZdCgl9LAoJeyAgLy8gVkNPIG9mIDI0MDAKCQk0MDAwMDAwMDAsICAgICAgICAgICAgIC8vIGNwdV9oegoJCTEsICAgICAgICAgICAgICAgICAgICAgLy8gcGRpdgoJCTQ4LCAgICAgICAgICAgICAgICAgICAgLy8gbmRpdgoJCXs2LCAyNCwgOCwgOCwgNDgsIDQ4fSAgLy8gcGxsX21kaXZzWzZdCgl9LAp9OwoKaW50IG1vY2FfY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQp7CgkvLyBUaGUgTU9DQV9SRC9NT0NBX1dSIG1hY3JvcyBuZWVkIGEgdmFsaWQgJ3ByaXYtPnBkZXYtPmRldicKCXN0YXRpYyBzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgZHVtbXlfcHJpdjsgCglzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkdW1teV9wZDsKCXN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiA9ICZkdW1teV9wcml2OwoJc3RydWN0IG1vY2FfNjgweF9jbGsgKiBwY2xrID0gKHN0cnVjdCBtb2NhXzY4MHhfY2xrICopIGNsazsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKiBwTW9jYURhdGEgPSAoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXBjbGstPmRldi0+cGxhdGZvcm1fZGF0YTsKCXN0cnVjdCBtb2NhXzY4MDJjMF9jbG9ja19wYXJhbXMgKiBwX2Nsb2NrX2RhdGEgPSAmbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zWzBdOwoJdWludDMyX3QgaTsKCXVpbnQzMl90IGFkZHI7Cgl1aW50MzJfdCBkYXRhOwoJaW50IHJldCA9IC0xOwoKCXByaXYtPnBkZXYgPSAmZHVtbXlfcGQ7Cglwcml2LT5wZGV2LT5kZXYgPSAqcGNsay0+ZGV2OwoKCWlmIChwY2xrLT5jbG9ja19udW0gPT0gTU9DQV9DUFVfQ0xPQ0tfTlVNKQoJewoJCWlmICgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZGRkZGMCkgPT0gMHg2ODAyMDBDMCkKCQl7CgkJCWlmIChyYXRlID09IDApCgkJCXsKCQkJCXJhdGUgPSA0NDAwMDAwMDA7CgkJCX0KCQkJCgkJCWZvciAoaSA9IDA7IGkgPCBOVU1fNjgwMkMwX0NMT0NLX09QVElPTlM7IGkrKykKCQkJewoJCQkJaWYgKG1vY2FfNjgwMmMwX2Nsb2NrX3BhcmFtc1tpXS5jcHVfaHogPT0gcmF0ZSkKCQkJCXsKCQkJCQlwX2Nsb2NrX2RhdGEgPSAmbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zW2ldOwoJCQkJCXJldCA9IDA7CgkJCQl9CgkJCX0KCgkJCS8vIDEuIFNldCBQT1NUX0RJVklERVJfSE9MRF9DSHggKGJpdCBbMTJdIGluIGVhY2ggUExMX0NIQU5ORUxfQ1RSTF9DSF94IAoJCQkvLyAgICByZWdpc3RlcikgIC8vIHRoaXMgd2lsbCB6ZXJvIHRoZSBvdXRwdXQgY2hhbm5lbHMKCQkJZm9yIChhZGRyID0gMHgxMDEwMDAzYzsgYWRkciA8PSAweDEwMTAwMDUwOyBhZGRyICs9IDQpCgkJCXsKCQkJCU1PQ0FfU0VUKGFkZHIsICgxIDw8IDEyKSk7CgkJCX0KCgkJCS8vMi4gUHJvZ3JhbSBuZXcgUERJVi9ORElWIHZhbHVlLCB0aGlzIHdpbGwgbG9zZSBsb2NrIGFuZCAKCQkJLy8gICB0cmlnZ2VyIGEgbmV3IFBMTCBsb2NrIHByb2Nlc3MgZm9yIGEgbmV3IFZDTyBmcmVxdWVuY3kKCQkJTU9DQV9XUigweDEwMTAwMDU4LCAoKHBfY2xvY2tfZGF0YS0+cGRpdiA8PCAxMCkgfCBwX2Nsb2NrX2RhdGEtPm5kaXYpKTsKCgkJCS8vMy4gV2FpdCA+MTAgdXNlYyBmb3IgbG9jayB0aW1lIC8vIG1heCBsb2NrIHRpbWUgcGVyIGRhdGEgc2hlZXQgaXMgNDYwL0ZyZWYsIAoJCQkvLyAgIE9yIGFsdGVybmF0aXZlbHkgbW9uaXRvciBDTEtHRU5fUExMX1NZUypfUExMX0xPQ0tfU1RBVFVTIHRvIGNoZWNrIGlmIFBMTCBoYXMgbG9ja2VkCgkJCWRhdGEgPSAwOwoJCQlpID0gMDsKCQkJd2hpbGUgKChkYXRhICYgMHgxKSA9PSAwKQoJCQl7CgkJCQkvKiBUaGlzIHR5cGljYWxseSBpcyBvbmx5IHJlYWQgb25jZSAqLwoJCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA2MCk7IC8vIENMS0dFTl9QTExfU1lTMV9QTExfTE9DS19TVEFUVVMKCgkJCQlpZiAoaSsrID4gMTApCgkJCQl7CgkJCQkJcHJpbnRrKCJNb0NBIFNZUzEgUExMIE5PVCBMT0NLRUQhXG4iKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJLy80LiBDb25maWd1cmUgbmV3IE1ESVYgdmFsdWUgYWxvbmcgd2l0aCBzZXQgUE9TVF9ESVZJREVSX0xPQURfRU5fQ0h4IAoJCQkvLyAgIChiaXQgWzEzXT0xLCB3aGlsZSBrZWVwIGJpdFsxMl09MSkgaW4gZWFjaCBQTExfQ0hBTk5FTF9DVFJMX0NIX3ggcmVnaXN0ZXIKCQkJaSA9IDA7CgkJCWZvciAoYWRkciA9IDB4MTAxMDAwM2M7IGFkZHIgPD0gMHgxMDEwMDA1MDsgYWRkciArPSA0KQoJCQl7CgkJCQlkYXRhID0gTU9DQV9SRChhZGRyKTsKCQkJCWRhdGEgfD0gKDEgPDwgMTMpOwoJCQkJZGF0YSAmPSB+KDB4RkYgPDwgMSk7CgkJCQlkYXRhIHw9IChwX2Nsb2NrX2RhdGEtPnBsbF9tZGl2c1tpXSA8PCAxKTsKCQkJCU1PQ0FfV1IoYWRkciwgZGF0YSk7CgkJCQlpKys7CgkJCX0KCgkJCS8vNS4gQ2xlYXIgYml0cyBbMTJdIGFuZCBiaXQgWzEzXSBpbiBlYWNoIFBMTF9DSEFOTkVMX0NUUkxfQ0hfeAoJCQlmb3IgKGFkZHIgPSAweDEwMTAwMDNjOyBhZGRyIDw9IDB4MTAxMDAwNTA7IGFkZHIgKz0gNCkKCQkJewoJCQkJTU9DQV9VTlNFVChhZGRyLCAoKDEgPDwgMTMpIHwgKDEgPDwgMTIpKSk7CgkJCX0KCgkJfQoJfQoKCXJldHVybihyZXQpOwp9CgoKc3RhdGljIHZvaWQgbW9jYV9lbmFibGVfaXJxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJa2VyU3lzTW9jYUhvc3RJbnRyRW5hYmxlKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+ZGV2SWQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX2Rpc2FibGVfaXJxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJa2VyU3lzTW9jYUhvc3RJbnRyRGlzYWJsZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9wbWJfYnVzeV93YWl0KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJI2lmIDAKCXVpbnQzMl90IGRhdGE7CgoJLyogUG9zc2libGUgdGltZSBzYXZlcjogVGhlIHJlZ2lzdGVyIGFjY2VzcyB0aW1lIG92ZXIgU1BJIG1heSAKCSAgIGFsd2F5cyBiZSBlbm91Z2ggdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHdyaXRlIHdpbGwgY29tcGxldGUgCgkgICBpbiB0aW1lIHdpdGhvdXQgaGF2aW5nIHRvIGNoZWNrIHRoZSBzdGF0dXMuICovCglkbwoJewoJCWRhdGEgPSBNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3N0YXR1cyk7Cgl9IHdoaWxlIChkYXRhICYgMHgxKTsKCSNlbmRpZgp9Cgp2b2lkIG1vY2FfcG1iX2RlbGF5KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJdW5zaWduZWQgaW50IGRhdGE7CglpbnQgaSwgajsKCQoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4RkY0NDQwMDApOwoJCglmb3IgKGkgPSAwOyBpIDwgTU9DQV9CUENNX05VTTsgaSsrKQoJewoJCWZvciAoaiA9IDA7IGogPCBNT0NBX0JQQ01fWk9ORVNfTlVNOyBqKyspCgkJewoJCQlkYXRhID0gMHgxMDAwMTIgKyBqKjQgKyBpKjB4MTAwMDsgOwoJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX2NtZF9vZmZzZXQsIGRhdGEpOwoJCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBtb2NhX3BtYl9jb250cm9sKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgUE1CX0NPTU1BTkRfRSBjbWQpCnsKCWludCBpLCBqOwoJdWludDMyX3QgKiBwX3pvbmVfY29udHJvbDsKCXVpbnQzMl90IGRhdGE7CgoJc3dpdGNoIChjbWQpCgl7CgkJY2FzZSBQTUJfQ09NTUFORF9BTExfT0ZGOgoJCQkvLyBUdXJuIG9mZiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QTAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9hbGxfb2ZmX2JpdG1hc2tbMF07CgkJCWJyZWFrOwoKCQljYXNlIFBNQl9DT01NQU5EX1BIWTFfT0ZGOgoJCQkvLyBUdXJuIG9mZiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QTAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9waHkxX2JpdG1hc2tbMF07CgkJCWJyZWFrOwoJCSAKCSBjYXNlIFBNQl9DT01NQU5EX1BIWTFfT046CgkJCS8vIFR1cm4gb24gem9uZSBjb21tYW5kCgkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfd2RhdGFfb2Zmc2V0LCAweEMwMCk7CgkJCXBfem9uZV9jb250cm9sID0gJnpvbmVfcGh5MV9iaXRtYXNrWzBdOwoJCQlicmVhazsKCQkgCgkgY2FzZSBQTUJfQ09NTUFORF9QQVJUSUFMX09OOgoJCQkvLyBUdXJuIG9uIHpvbmUgY29tbWFuZAoJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgMHhDMDApOwoJCQlwX3pvbmVfY29udHJvbCA9ICZ6b25lX3BhcnRpYWxfb25fYml0bWFza1swXTsKCQkJYnJlYWs7CgkJIAoJCSAKCQlkZWZhdWx0OgoJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaWxsZWdhbCBjbWQ6ICUwOHhcbiIsCgkJCQlfX0ZVTkNUSU9OX18sIGNtZCk7CgkJCXJldHVybjsKCX0KCglmb3IgKGkgPSAwOyBpIDwgTU9DQV9CUENNX05VTTsgaSsrKQoJewoJCWZvciAoaiA9IDA7IGogPCBNT0NBX0JQQ01fWk9ORVNfTlVNOyBqKyspCgkJewoJCQlpZiAoKnBfem9uZV9jb250cm9sICYgKDEgPDwgaikpCgkJCXsKCQkJCS8vIHpvbmUgYWRkcmVzcyBpbiBicGNtcwoJCQkJZGF0YSA9ICgweDEgPDwgMjApICsgMTYgKyAoaSAqIDQwOTYpICsgKGogKiA0KTsKCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfY21kX29mZnNldCwgZGF0YSk7CgkJCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7CgkJCX0KCQl9CgkJcF96b25lX2NvbnRyb2wrKzsKCX0KCn0KCnN0YXRpYyB2b2lkIG1vY2FfcG1iX2dpdmVfY250cmwoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBQTUJfR0lWRV9PV05FUlNISVBfRSBjbWQpCnsKCWludCBpOwoJdWludDMyX3QgZGF0YTsKCgkvKiBQYXNzIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3JpZXMgdG8gdGhlIEZXICovCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgY21kKTsKCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCgl7CgkJZGF0YSA9IDB4MTAwMDAyICsgaSoweDEwMDA7CgkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl9jbWRfb2Zmc2V0LCBkYXRhKTsgICAKCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7Cgl9Cgltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7Cn0KCnN0YXRpYyB2b2lkIG1vY2FfaHdfcmVzZXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7Ci8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci8vICAgdWludDMyX3QgY2hpcGlkOwogIAoKCS8qIGRpc2FibGUgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9tYXNrX3NldF9vZmZzZXQsIDB4ZmZmZmZmZmYpOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19zZXRfb2Zmc2V0KTsKCgkvKiBhc3NlcnQgcmVzZXRzICovCgoJLyogcmVzZXQgQ1BVIGZpcnN0LCBib3RoIENQVXMgZm9yIE1vQ0EgMjAgSFcgKi8KCWlmIChwcml2LT5od19yZXYgPT0gSFdSRVZfTU9DQV8yMF9HRU4yMikKCQlNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCA1KTsKCWVsc2UKCQlNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAxKTsKCglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCXVkZWxheSgyMCk7CgoJLyogcmVzZXQgZXZlcnl0aGluZyBlbHNlIGV4Y2VwdCBjbG9ja3MgKi8KCU1PQ0FfU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIAoJCX4oKDEgPDwgMykgfCAoMSA8PCA3KSB8ICgxIDw8IDE1KSB8ICgxIDw8IDE2KSkpOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0KTsKCgl1ZGVsYXkoMjApOwoKCS8qIGRpc2FibGUgY2xvY2tzICovCglNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAKCQl+KCgxIDw8IDMpIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTYpKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX2NsZWFyX29mZnNldCwgMHhmZmZmZmZmZik7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9jbGVhcl9vZmZzZXQpOwoKCS8qIFBvd2VyIGRvd24gYWxsIHpvbmVzICovCgkvLyAgVGhlIGhvc3QgY2FuJ3QgZ2l2ZSB0byBpdHNlbGYgcGVybWlzc2lvbi4KCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09GRik7CgoJLyogUG93ZXIgZG93biBhbGwgU1lTX0NUUkwgbWVtb3JpZXMgKi8KCU1PQ0FfV1IoMHgxMDEwMDA2OCwgMSk7ICAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9QV1JETgoJTU9DQV9TRVQoMHgxMDEwMDAwYywgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzBfUExMX0NIQU5ORUxfQ1RSTF9DSF8zCgp9CgpzdGF0aWMgdW5zaWduZWQgaW50IG1vY2FfZ2V0X3BoeV9mcmVxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJdW5zaWduZWQgaW50IHggPSBNT0NBX1JEKDB4MTAxMDAwNDQpOyAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8yCgoJeCA9ICh4ID4+IDEpICYgMHhGRjsgLy8gR2V0IHRoZSBNRElWX0NIMiBmaWVsZAoKCWlmICgheCkKCQlyZXR1cm4gMDsKCglyZXR1cm4oMjQwMCAvIHgpOyAKfQoKCnN0YXRpYyB2b2lkIG1vY2FfcHNfUG93ZXJDdHJsUEhZMShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsICBQTUJfQ09NTUFORF9FIGNtZCkKewoJdWludDMyX3QgcGxsX2N0cmxfMywgcGxsX2N0cmxfNSwgc3dfcmVzZXQ7IAoJcGxsX2N0cmxfMyA9IE1PQ0FfUkQgKDB4MTAxMDAwNDgpOwoJcGxsX2N0cmxfNSA9IE1PQ0FfUkQgKDB4MTAxMDAwNTApOwoJc3dfcmVzZXQgPSBNT0NBX1JEIChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0KTsKCgkvLyBlbmFibGUgUExMIAoJTU9DQV9VTlNFVCgweDEwMTAwMDQ4LCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzMgCglNT0NBX1VOU0VUKDB4MTAxMDAwNTAsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfNSAKCgl1ZGVsYXkoMSk7CgoJLy8gZGUgYXNzZXJ0IG1vY2FfcGh5MV9kaXNhYmxlX2NsawoJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAoMSA8PCA5KSk7CgoJbW9jYV9wbWJfY29udHJvbChwcml2LCBjbWQpOwoKCU1PQ0FfV1IgKDB4MTAxMDAwNDgsIHBsbF9jdHJsXzMpOwoJTU9DQV9XUiAoMHgxMDEwMDA1MCwgcGxsX2N0cmxfNSk7CgoJdWRlbGF5KDEpOwoJCglNT0NBX1dSIChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCBzd19yZXNldCk7CQp9CgoKc3RhdGljIHZvaWQgbW9jYV9ncGh5X2luaXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICogcE1vY2FEYXRhID0gKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCXUzMiBwb3J0X21vZGU7Cgl1MzIgcmdtaWkwX29uOwoJdTMyIHJnbWlpMV9vbjsKCXUzMiBncGh5X2VuYWJsZWQgPSAwOwoKCXBvcnRfbW9kZSA9IE1PQ0FfUkQoMHgxMDgwMDAwMCkgJiAweDM7CglyZ21paTBfb24gPSBNT0NBX1JEKDB4MTA4MDAwMGMpICYgMHgxOwoJcmdtaWkxX29uID0gTU9DQV9SRCgweDEwODAwMDE4KSAmIDB4MTsKCglpZiAoKHBNb2NhRGF0YS0+Y2hpcF9pZCAmIDB4RkZGRUZGRjApID09IDB4NjgwMjAwQzApCgl7CgkJaWYgKChwb3J0X21vZGUgPT0gMCkgfHwKCQkgICAgKChwb3J0X21vZGUgPT0gMSkgJiYgcmdtaWkwX29uKSB8fAoJCSAgICAoKHBvcnRfbW9kZSA9PSAyKSAmJiByZ21paTFfb24pKQoJCXsKCQkJZ3BoeV9lbmFibGVkID0gMTsKCQl9Cgl9CgllbHNlCgl7CgkJaWYgKChwb3J0X21vZGUgPT0gMCkgfHwKCQkgICAgKChwb3J0X21vZGUgIT0gMykgJiYgcmdtaWkxX29uKSkKCQl7CgkJCWdwaHlfZW5hYmxlZCA9IDE7CgkJfQoJfQoKCWlmIChncGh5X2VuYWJsZWQpCgl7CgkJTU9DQV9VTlNFVCgweDEwODAwMDA0LCAweEYpOwoJCW1zbGVlcCgxMCk7CgkJTU9DQV9XUigweDEwNDA0MzFjLCAweEZGRkZGRkZGKTsKCX0KfQoKLyogY2FsbGVkIGFueSB0aW1lIHdlIHN0YXJ0L3Jlc3RhcnQvc3RvcCBNb0NBICovCnN0YXRpYyB2b2lkIG1vY2FfaHdfaW5pdChzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIGludCBhY3Rpb24pCnsKCXUzMiBtYXNrOwoJdTMyIHRlbXA7Cgl1MzIgZGF0YTsKCXUzMiBjb3VudCA9IDA7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICogcE1vY2FEYXRhID0gKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglpZiAoYWN0aW9uID09IE1PQ0FfRU5BQkxFICYmICFwcml2LT5lbmFibGVkKSB7CgkJbW9jYV9jbGtfZW5hYmxlKHByaXYtPmNsayk7CgoJCU1PQ0FfV1IoMHgxMDQwNDMxYywgfigxIDw8IDI2KSk7IC8vIFNVTl9UT1BfQ1RSTF9TV19JTklUXzBfQ0xFQVIgLS0+IERvIHRoaXMgYXQgc3RhcnQgb2Ygc2VxdWVuY2UsIGRvbid0IHRvdWNoIGdwaHlfc3dfaW5pdAoJCXVkZWxheSgyMCk7CgkJbW9jYV9ncGh5X2luaXQocHJpdik7CiAgIAoJCXByaXYtPmVuYWJsZWQgPSAxOwoJfQoKCS8qIGNsb2NrIG5vdCBlbmFibGVkLCByZWdpc3RlciBhY2Nlc3NlcyB3aWxsIGZhaWwgd2l0aCBidXMgZXJyb3IgKi8KCWlmICghcHJpdi0+ZW5hYmxlZCkKCQlyZXR1cm47CgoJbW9jYV9od19yZXNldChwcml2KTsKCXVkZWxheSgxKTsKCglpZiAoYWN0aW9uID09IE1PQ0FfRU5BQkxFKSB7CgoJCS8qIFBvd2VyIHVwIGFsbCB6b25lcyAqLwoJCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfUEFSVElBTF9PTik7CgoJCU1PQ0FfVU5TRVQoMHgxMDEwMDAwYywgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzBfUExMX0NIQU5ORUxfQ1RSTF9DSF8zIAoKCQlNT0NBX1dSKDB4MTAxMDAwNkMsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9SRVNFVCAKCQlNT0NBX1dSKDB4MTAxMDAwNjgsIDApOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9QV1JETiAKCQlkYXRhID0gMDsKCQl3aGlsZSAoKGRhdGEgJiAweDEpID09IDApCgkJewoJCQkvKiBUaGlzIHR5cGljYWxseSBpcyBvbmx5IHJlYWQgb25jZSAqLwoJCQlkYXRhID0gTU9DQV9SRCgweDEwMTAwMDYwKTsgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9MT0NLX1NUQVRVUwoKCQkJaWYgKGNvdW50KysgPiAxMCkKCQkJCWJyZWFrOwoJCX0KCQlNT0NBX1dSKDB4MTAxMDAwNkMsIDApOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9SRVNFVCAKCgkJaWYgKHByaXYtPmJvbmRlZF9tb2RlKSB7CgkJCU1PQ0FfVU5TRVQoMHgxMDEwMDA0OCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8zIAoJCQlNT0NBX1VOU0VUKDB4MTAxMDAwNTAsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfNSAKCQl9IGVsc2UgewoJCQlNT0NBX1NFVCgweDEwMTAwMDQ4LCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzMgCgkJCU1PQ0FfU0VUKDB4MTAxMDAwNTAsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfNSAKCQl9CgkJdWRlbGF5KDEpOwoKCQkvKiBkZWFzc2VydCBtb2NhX3N5c19yZXNldCwgc3lzdGVtIGNsb2NrLCBwaHkwLCBwaHkwIGNsb2NrICovCgkJbWFzayA9ICgxIDw8IDEpIHwgKDEgPDwgNykgfCAoMSA8PCA0KSB8ICgxIDw8IDgpOwoKCQkvKiBkZWFzc2VydCBwaHkxIGFuZCBwaHkxIGNsb2NrIGluIGJvbmRlZCBtb2RlICovCgkJaWYgKHByaXYtPmJvbmRlZF9tb2RlKQoJCQltYXNrIHw9ICgxIDw8IDUpIHwgKDEgPDwgOSk7CgoJCU1PQ0FfVU5TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgbWFzayk7CgkJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0KTsKCQkKICAgICAgICAvLyBCZWZvcmUgcG93ZXIgb2ZmIHRoZSBtZW1vcmllcywgbW9jYV9waHkxX2Rpc2FibGVfY2xrLiAgICAKCQlpZiAocHJpdi0+Ym9uZGVkX21vZGU9PTApCgkJCW1vY2FfcHNfUG93ZXJDdHJsUEhZMShwcml2LCBQTUJfQ09NTUFORF9QSFkxX09GRik7CgkJZWxzZQoJCQltb2NhX3BzX1Bvd2VyQ3RybFBIWTEocHJpdiwgUE1CX0NPTU1BTkRfUEhZMV9PTik7CgogICAgICAgIAoJCW1vY2FfcG1iX2dpdmVfY250cmwocHJpdiwgUE1CX0dJVkVfT1dORVJTSElQXzJfRlcpOwoJCQkKCQkvKiBDaGVjayBmb3IgNjgwMi82ODAzIEEwIGNoaXAgb25seSB3aXRoIFh0YWwgbW9kICovCgkJaWYgKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkVGRkZGKSA9PSAweDY4MDIwMEEwKQoJCXsKCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDQwNDAxYyk7CgkJCWlmICgoZGF0YSAmIDB4NykgPT0gMHgyKSB7CgkJCQkvKiAyNU1IeiAqLwoJCQkJcHJpbnRrKCJNb0NBIHJ1bm5pbmcgd2l0aCAyNU1IeiBYVEFMXG4iKTsKCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmhvc3QybW9jYV9tbXBfb3V0Ym94XzBfb2Zmc2V0LCAxKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50aygiTW9DQSA9PSA1ME1IeiBYVEFMXG4iKTsKCQkJCS8qIDUwTUh6IGNsb2NrIGNoYW5nZSBvbmx5ICovCgkJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5ob3N0Mm1vY2FfbW1wX291dGJveF8wX29mZnNldCwgMCk7CgkJCQkvL05vdGU6IFRoZSByZS1jb25maWd1cmF0aW9uIGlzIGluIE5ESVZfSU5ULCBub3QgUERJVi4KCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMxX1BMTF9ESVYgKDMyJ2gxMDEwMDA1OCkgWzA5OjAwXSA9IDEwkmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA1OCk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGQzAwKSArIDQ4OwoJCQkJTU9DQV9XUigweDEwMTAwMDU4LCB0ZW1wKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMF9QTExfRElWICgzMidoMTAxMDAwMTgpIFswOTowMF0gPSAxMJJkNDAKCQkJCXRlbXAgPSBNT0NBX1JEKDB4MTAxMDAwMTgpOwoJCQkJdGVtcCA9ICh0ZW1wICYgMHhGRkZGRkMwMCkgKyA0MDsKCQkJCU1PQ0FfV1IoMHgxMDEwMDAxOCwgdGVtcCk7CgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF80ICgzMidoMTAxMDAwNEMpIFswODowMV0gPSA4kmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA0Yyk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGRTAxKSArICg0OCA8PCAxKTsKCQkJCU1PQ0FfV1IoMHgxMDEwMDA0YywgdGVtcCk7CgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF81ICgzMidoMTAxMDAwNTApIFswODowMV0gPSA4kmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA1MCk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGRTAxKSArICg0OCA8PCAxKTsKCQkJCU1PQ0FfV1IoMHgxMDEwMDA1MCwgdGVtcCk7CgoJCQkJLy8gVGhlbiBSZXN0YXJ0IHRoZSBQTEwuCgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzBfUExMX1JFU0VUICgzMidoMTAxMDAwMkMpIFswXSA9IDGSYjEKCQkJCU1PQ0FfU0VUKDB4MTAxMDAwMmMsIDEpOwoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX1JFU0VUICgzMidoMTAxMDAwNkMpIFswXSA9IDGSYjEKCQkJCU1PQ0FfU0VUKDB4MTAxMDAwNmMsIDEpOwoKCQkJCXVkZWxheSgxKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMF9QTExfUkVTRVQgKDMyJ2gxMDEwMDAyQykgWzBdID0gMZJiMAoJCQkJTU9DQV9VTlNFVCgweDEwMTAwMDJjLCAxKTsKCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMxX1BMTF9SRVNFVCAoMzInaDEwMTAwMDZDKSBbMF0gPSAxkmIwCgkJCQlNT0NBX1VOU0VUKDB4MTAxMDAwNmMsIDEpOwoJCQl9CgkJfQoKCQkvLyBDTEtHRU5fUExMX1NZUzFfUExMX1NTQ19NT0RFX0NPTlRST0xfSElHSAoJCWRhdGEgPSBNT0NBX1JEKDB4MTAxMDAwNzApOwoJCWRhdGEgPSAoZGF0YSAmIDB4RkZGRjAwMDApIHwgMHg3ZGQ7CgkJTU9DQV9XUigweDEwMTAwMDcwLCBkYXRhKTsKCgkJLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9TU0NfTU9ERV9DT05UUk9MX0xPVwoJCWRhdGEgPSBNT0NBX1JEKDB4MTAxMDAwNzQpOwoJCWRhdGEgPSAoZGF0YSAmIDB4ZmZjMDAwMDApIHwgMHgzZDcxOwoJCU1PQ0FfV1IoMHgxMDEwMDA3NCwgZGF0YSk7CgoJCS8vIENMS0dFTl9QTExfU1lTMV9QTExfU1NDX01PREVfQ09OVFJPTF9MT1cKCQlNT0NBX1NFVCgweDEwMTAwMDc0LCAoMSA8PCAyMikpOwoJfQoKCglpZiAocHJpdi0+aHdfcmV2IDw9IEhXUkVWX01PQ0FfMjBfR0VOMjEpIHsKCS8qIGNsZWFyIGp1bmsgb3V0IG9mIEdQMC9HUDEgKi8KCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5ncDBfb2Zmc2V0LCAweGZmZmZmZmZmKTsKCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5ncDFfb2Zmc2V0LCAweDApOwoJCS8qIHNldCB1cCBhY3Rpdml0eSBMRUQgZm9yIDUwJSBkdXR5IGN5Y2xlICovCgkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bGVkX2N0cmxfb2Zmc2V0LAoJCQkweDQwMDA0MDAwKTsKCX0KCgkvKiBlbmFibGUgRE1BIGNvbXBsZXRpb24gaW50ZXJydXB0cyAqLwoJbWFzayA9IE0ySF9SRVEgfCBNMkhfUkVTUCB8IE0ySF9BU1NFUlQgfCBNMkhfV0RUX0NQVTEgfAoJCU0ySF9ORVhUQ0hVTksgfCBNMkhfRE1BOwoKCWlmIChwcml2LT5od19yZXYgPj0gSFdSRVZfTU9DQV8yMF9HRU4yMSkKCQltYXNrIHw9IE0ySF9XRFRfQ1BVMCB8IE0ySF9ORVhUQ0hVTktfQ1BVMCB8CgkJCU0ySF9SRVFfQ1BVMCB8IE0ySF9SRVNQX0NQVTAgfCBNMkhfQVNTRVJUX0NQVTA7CgoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cmluZ2JlbGxfb2Zmc2V0LCAwKTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX21hc2tfY2xlYXJfb2Zmc2V0LCBtYXNrKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX21hc2tfY2xlYXJfb2Zmc2V0KTsKCgoJLyogU2V0IHBpbm11eGluZyBmb3IgTW9DQSBpbnRlcnJ1cHQgYW5kIGZsb3cgY29udHJvbCAqLwoJTU9DQV9VTlNFVCgweDEwNDA0MTEwLCAweEYwMDAwMEZGKTsKCU1PQ0FfU0VUKDB4MTA0MDQxMTAsIDB4MTAwMDAwMjIpOwogCgkvKiBTZXQgcGlubXV4aW5nIGZvciBNb0NBIElJQyBjb250cm9sICovCglpZiAoKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkZGRkYwKSA9PSAweDY4MDIwMEMwKSB8fCAKCSAgICAoKHBNb2NhRGF0YS0+Y2hpcF9pZCAmIDB4RkZGRkZGRjApID09IDB4NjgwMzAwQzApKQoJewoJCU1PQ0FfVU5TRVQoMHgxMDQwNDEwMCwgMHhGRik7ICAvLyBwaW4gbXV4aW5nCgkJTU9DQV9TRVQoMHgxMDQwNDEwMCwgMHgyMik7ICAvLyBwaW4gbXV4aW5nCgl9CgoJTU9DQV9XUigweDEwMGIwMzE4LCAyKTsKCglpZiAoYWN0aW9uID09IE1PQ0FfRElTQUJMRSAmJiBwcml2LT5lbmFibGVkKSB7CgkJcHJpdi0+ZW5hYmxlZCA9IDA7CgkJbW9jYV9jbGtfZGlzYWJsZShwcml2LT5jbGspOwoJfQp9CgpzdGF0aWMgdm9pZCBtb2NhX3JpbmdiZWxsKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgdWludDMyX3QgbWFzaykKewoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cmluZ2JlbGxfb2Zmc2V0LCBtYXNrKTsKfQoKc3RhdGljIHVpbnQzMl90IG1vY2Ffc3RhcnRfbWlwcyhzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHVuc2lnbmVkIGludCBjcHUpCnsKCWlmIChwcml2LT5od19yZXYgPT0gSFdSRVZfTU9DQV8yMF9HRU4yMikgewoJCWlmIChjcHUgPT0gMSkKCQkJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LAoJCQkJKDEgPDwgMCkpOwoJCWVsc2UgewoJCQltb2NhX21tcF9pbml0KHByaXYsIDEpOwoJCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsCgkJCQkoMSA8PCAyKSk7CgkJfQoJfSBlbHNlCgkJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAoMSA8PCAwKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCXJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9tMm1feGZlcihzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl1aW50MzJfdCBkc3QsIHVpbnQzMl90IHNyYywgdWludDMyX3QgY3RsKQp7Cgl1aW50MzJfdCBzdGF0dXM7CgoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bTJtX3NyY19vZmZzZXQsIHNyYyk7CglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5tMm1fZHN0X29mZnNldCwgZHN0KTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9zdGF0dXNfb2Zmc2V0LCAwKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9zdGF0dXNfb2Zmc2V0KTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9jbWRfb2Zmc2V0LCBjdGwpOwoKCWRvIHsKCQlzdGF0dXMgPSBNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5tMm1fc3RhdHVzX29mZnNldCk7Cgl9IHdoaWxlKHN0YXR1cyA9PSAwKTsKCn0KCnN0YXRpYyB2b2lkIG1vY2Ffd3JpdGVfbWVtKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IGRzdF9vZmZzZXQsIHZvaWQgKnNyYywgdW5zaWduZWQgaW50IGxlbikKewoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcGQgPSBwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglpZigoZHN0X29mZnNldCA+PSBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkgfHwKCQkoKGRzdF9vZmZzZXQgKyBsZW4pID4gcHJpdi0+cmVncy0+Y250bF9tZW1fb2Zmc2V0K3ByaXYtPnJlZ3MtPmNudGxfbWVtX3NpemUpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvcHkgcGFzdCBlbmQgb2YgY250bCBtZW1vcnk6ICUwOHhcbiIsCgkJCV9fRlVOQ1RJT05fXywgZHN0X29mZnNldCk7CgkJcmV0dXJuOwoJfQoKCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgl7CgkJZG1hX2FkZHJfdCBwYTsKCgkJcGEgPSBkbWFfbWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBzcmMsIGxlbiwgRE1BX1RPX0RFVklDRSk7CgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJbW9jYV9tMm1feGZlcihwcml2LCBkc3Rfb2Zmc2V0ICsgcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0LCAodWludDMyX3QpcGEsIGxlbiB8IE0yTV9XUklURSk7CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQlkbWFfdW5tYXBfc2luZ2xlKCZwcml2LT5wZGV2LT5kZXYsIHBhLCBsZW4sIERNQV9UT19ERVZJQ0UpOwoJfQoJZWxzZQoJewoJCXVpbnRwdHJfdCBhZGRyID0gKHVpbnRwdHJfdClwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0ICsgZHN0X29mZnNldDsKCQl1aW50MzJfdCAqZGF0YSA9IHNyYzsKCQlpbnQgaTsKCgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJaWYgKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAxKQoJCXsKCQkJc3JjID0gZGF0YTsKCQkJTU9DQV9XUl9CTE9DSyhhZGRyLCBzcmMsIGxlbik7CgkJfQoJCWVsc2UKCQl7CgkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykKCQkJCU1PQ0FfV1IoYWRkciwgKmRhdGEpOwoJCQlNT0NBX1JEKGFkZHIgLSA0KTsJLyogZmx1c2ggd3JpdGUgKi8KCQl9CgoJCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIG1vY2FfcmVhZF9tZW0oc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LAoJdm9pZCAqZHN0LCB1aW50MzJfdCBzcmNfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogICAgCglpZigoc3JjX29mZnNldCA+PSBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkgfHwKCQkoKHNyY19vZmZzZXQgKyBsZW4pID4gcHJpdi0+cmVncy0+Y250bF9tZW1fb2Zmc2V0K3ByaXYtPnJlZ3MtPmNudGxfbWVtX3NpemUpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvcHkgcGFzdCBlbmQgb2YgY250bCBtZW1vcnk6ICUwOHhcbiIsCgkJCV9fRlVOQ1RJT05fXywgc3JjX29mZnNldCk7CgkJcmV0dXJuOwoJfQoKCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgl7CgkJZG1hX2FkZHJfdCBwYTsKCgkJcGEgPSBkbWFfbWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBkc3QsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKCQltdXRleF9sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQltb2NhX20ybV94ZmVyKHByaXYsICh1aW50MzJfdClwYSwgc3JjX29mZnNldCArIHByaXYtPnJlZ3MtPmRhdGFfbWVtX29mZnNldCwgbGVuIHwgTTJNX1JFQUQpOwoJCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJZG1hX3VubWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBwYSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwoJfQoJZWxzZQoJewoJCXVpbnRwdHJfdCBhZGRyID0gcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0ICsgc3JjX29mZnNldDsKCQl1aW50MzJfdCAqZGF0YSA9IGRzdDsKCQlpbnQgaTsKCgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJaWYgKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAxKQoJCXsKCQkJTU9DQV9SRF9CTE9DSygodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyLCBkc3QsIGxlbik7CgkJfQoJCWVsc2UKCQl7CgkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykKCQkJCSpkYXRhID0gTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKTsKCQl9CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCX0KfQoKc3RhdGljIHZvaWQgbW9jYV93cml0ZV9zZyhzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl1aW50MzJfdCBkc3Rfb2Zmc2V0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMpCnsKCWludCBqOwoJdWludHB0cl90IGFkZHIgPSBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQgKyBkc3Rfb2Zmc2V0OwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcGQgPSBwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglkbWFfbWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX1RPX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKQoJewoJCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgkJewoJCSAgICAvLyBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCQltb2NhX20ybV94ZmVyKHByaXYsIGFkZHIsICh1aW50MzJfdClzZ1tqXS5kbWFfYWRkcmVzcywgCgkJCQlzZ1tqXS5sZW5ndGggfCBNMk1fV1JJVEUpOwoKCQkJYWRkciArPSBzZ1tqXS5sZW5ndGg7CgkJfQoJCWVsc2UKCQl7CgkJCXVuc2lnbmVkIGxvbmcgKmRhdGEgPSAodm9pZCAqKXBoeXNfdG9fdmlydChzZ1tqXS5kbWFfYWRkcmVzcyk7CiAgICAgICAgIC8vcHJpbnRrKCIlczogV3JpdGluZyAweCVseCB0byBhZGRyIDB4JTA4bHggKGxlbiA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCAqZGF0YSwgKCh1bnNpZ25lZCBsb25nKXByaXYtPmJhc2UpICsgYWRkciwgc2dbal0ubGVuZ3RoKTsKCQkJTU9DQV9XUl9CTE9DSygoKHVuc2lnbmVkIGxvbmcpcHJpdi0+YmFzZSkgKyBhZGRyLCBkYXRhLCBzZ1tqXS5sZW5ndGgpOwoJCQlhZGRyICs9IHNnW2pdLmxlbmd0aDsKCQl9Cgl9CgltdXRleF91bmxvY2soJnByaXYtPmNvcHlfbXV0ZXgpOwoKCWRtYV91bm1hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9UT19ERVZJQ0UpOwp9CgovKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0ZXN0ZWQgKi8KI2lmIDAKc3RhdGljIHZvaWQgbW9jYV9yZWFkX3NnKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IHNyY19vZmZzZXQsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cykKewoJaW50IGo7Cgl1aW50cHRyX3QgYWRkciA9IHByaXYtPmRhdGFfbWVtX29mZnNldCArIHNyY19vZmZzZXQ7CgoJZG1hX21hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9GUk9NX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKSB7CiNpZiAwIC8vVVNFX0RNQQoJCSBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCW1vY2FfbTJtX3hmZXIocHJpdiwgYWRkciwgKHVpbnQzMl90KXNnW2pdLmRtYV9hZGRyZXNzLAoJCQlzZ1tqXS5sZW5ndGggfCBNMk1fUkVBRCk7CgoJCWFkZHIgKz0gc2dbal0ubGVuZ3RoOwojZWxzZQoJCXVpbnQzMl90ICpkYXRhID0gKHZvaWQgKilwaHlzX3RvX3ZpcnQoc2dbal0uZG1hX2FkZHJlc3MpOwoJCXVuc2lnbmVkIGludCBsZW4gPSBzZ1tqXS5sZW5ndGg7CgkJaW50IGk7CgoJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykgewoJCQkqZGF0YSA9IGNwdV90b19iZTMyKAoJCQkJTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKSk7CgkJCS8vcHJpbnRrKCJNb0NBIFJFQUQ6IEFEIDB4JXggID0gMHgleCAoMHgleClcbiIsIChwcml2LT5iYXNlICsgYWRkciksIE1PQ0FfUkQoKHVpbnRwdHJfdClwcml2LT5iYXNlICsgYWRkciksICpkYXRhKTsKCQkgfQojZW5kaWYKCX0KCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgoJZG1hX3VubWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX0ZST01fREVWSUNFKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIG1vY2FfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHVpbnQzMl90ICogaGksIHVpbnQzMl90ICogbG8pCnsKCXN0cnVjdCBuZXRfZGV2aWNlICogcGRldiA7CgljaGFyCQkJCQkgbW9jYU5hbWVbN10gOwoKCWlmIChwcml2ID09IE5VTEwpCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAwKSA7CgllbHNlCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkKSA7CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI5KQoJcGRldiA9IGRldl9nZXRfYnlfbmFtZSAoICZpbml0X25ldCwgbW9jYU5hbWUgKSA7CiNlbHNlCglwZGV2ID0gZGV2X2dldF9ieV9uYW1lICggbW9jYU5hbWUgKSA7CiNlbmRpZgoKCWlmICgocGRldiAhPSBOVUxMKSAmJiAobG8gIT0gTlVMTCkgJiYgKGhpICE9IE5VTEwpKSB7CgkJbWFjX3RvX3UzMihoaSwgbG8sIHBkZXYtPmRldl9hZGRyKTsKCX0KfQoKCiNpZiBkZWZpbmVkKERTTF9NT0NBKQoKLyoKICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGFsbG93IHRoZSBlbmV0IGRyaXZlciB0byBjb21waWxlIGluCiAqIGNvbnN1bWVyIGVudmlyb25tZW50IGZvciA2OHh4IHByb2ZpbGVzLgogKi8Kdm9pZCBtb2NhX2dldF9mY19iaXRzKHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgKm1vY2FfZmNfcmVnKQp7CglzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKiAgICAgcHJpdjsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKiBwTW9jYURhdGE7Cgl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7CgoJaWYgKGFyZyA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSAoc3RydWN0IG1vY2FfcHJpdl9kYXRhICopIGFyZzsKCXBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJKm1vY2FfZmNfcmVnID0gMDsKCWlmIChwcml2ICE9IE5VTEwpCgl7CgkJLyogV2UgY2FuJ3QgcmVhZCBtb2NhIGNvcmUgcmVncyB1bmxlc3MgdGhlIGNvcmUncyBjbG9ja3MgYXJlIG9uLiAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jbG9ja19sb2NrLCBmbGFncyk7CgkJaWYgKHByaXYtPnJ1bm5pbmcpIHsKCQkJKm1vY2FfZmNfcmVnID0gTU9DQV9SRChwcml2LT5iYXNlK3ByaXYtPnJlZ3MtPnNpZGViYW5kX2dtaWlfZmNfb2Zmc2V0KTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y2xvY2tfbG9jaywgZmxhZ3MpOwoJfQp9CgojZW5kaWYgLyogRFNMX01PQ0EgKi8KCgovL2V4dGVybiB2b2lkIGJjbWVuZXRfcmVnaXN0ZXJfbW9jYV9mY19iaXRzX2NiKHZvaWQgY2Iodm9pZCAqLCB1bnNpZ25lZCBsb25nICopLCBpbnQgaXNXYW4sIHZvaWQgKiBhcmcpOwoKc3RhdGljIHZvaWQgbW9jYV9tZW1faW5pdF82ODB4QzAoIHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiApCnsKCS8vIERlLWFzc2VydCByZXNldCAoYWxsIG1lbW9yaWVzIGFyZSBPRkYgYnkgZGVmYXVsdCBGb3JjZV9TUF9vZmYgPTEsIEZvcmNlX1JmX29mZiA9MSkKCU1PQ0FfVU5TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgKCgxIDw8IDE1KSB8ICgxIDw8IDE2KSkpOwoKCW1vY2FfcG1iX2RlbGF5KHByaXYpOwoJbW9jYV9wbWJfY29udHJvbChwcml2LCBQTUJfQ09NTUFORF9BTExfT0ZGKTsKCgkvL1dyaXRlIEZvcmNlX1NQX29uID0wLCBGb3JjZV9TUF9vZmYgPTAsIEZvcmNlX1JGX29uID0wLCBGb3JjZV9SRl9vZmYgPTAKCU1PQ0FfVU5TRVQocHJpdi0+YmFzZSArIDB4MDAxZmZkMTQsICgoMSA8PCAxMCkgfCAoMSA8PCAxMSkpKTsKCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfUEFSVElBTF9PTik7Cn0KCnN0YXRpYyBpbnQgIGh3X3NwZWNpZmljX2luaXQoIHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiApCnsKI2lmZGVmIERTTF9NT0NBCglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwTW9jYURhdGE7CgoJcE1vY2FEYXRhID0gKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCgkvKiBmaWxsIGluIHRoZSBod19yZXYgZmllbGQgKi8KCXBNb2NhRGF0YS0+Y2hpcF9pZCA9IE1PQ0FfUkQoMHgxMDQwNDAwNCkgKyAweEEwOwoJaWYgKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkUwMDAwKSAhPSAweDY4MDIwMDAwKSB7IC8qIDY4MDIgb3IgNjgwMyAqLwoJCXByaW50ayhLRVJOX0VSUiAiYm1vY2E6IE5vIE1vQ0EgY2hpcCBmb3VuZFxuIik7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJaWYgKCgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZGRkZGMCkgPT0gMHg2ODAyMDBDMCkgfHwgKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkZGRkYwKSA9PSAweDY4MDMwMEMwKSkKCXsKCQlwcml2LT5pMmNfYmFzZSA9IE5VTEw7IAoKCQkvKiBJbml0aWFsaXplIDY4MHggQ08gbWVtb3J5ICovCgkJbW9jYV9tZW1faW5pdF82ODB4QzAocHJpdik7Cgl9CgoJcE1vY2FEYXRhLT5od19yZXYgPSBIV1JFVl9NT0NBXzIwX0dFTjIyOwoKCS8qIFBvd2VyIGRvd24gYWxsIExFQVAgbWVtb3JpZXMgKi8KCU1PQ0FfV1IoMHgxMDEwMDBlNCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfREFUQSAgIAoJTU9DQV9XUigweDEwMTAwMGU4LCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9IQUIgCglNT0NBX1dSKDB4MTAxMDAwZWMsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cwCglNT0NBX1dSKDB4MTAxMDAwZjAsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cxICAgCglNT0NBX1dSKDB4MTAxMDAwZjQsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cyICAKCU1PQ0FfV1IoMHgxMDEwMDBmOCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfUk9NCglNT0NBX1dSKDB4MTAxMDAwZmMsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1NIQVJFRCAgCglNT0NBX1dSKDB4MTAxMDAxNjQsIDB4Myk7IC8vIENMS0dFTl9TWVNfQ1RSTF9JTlNUX1BPV0VSX1NXSVRDSF9NRU1PUlkgCgovLwliY21lbmV0X3JlZ2lzdGVyX21vY2FfZmNfYml0c19jYigKLy8JCW1vY2FfZ2V0X2ZjX2JpdHMsIHBNb2NhRGF0YS0+dXNlX3NwaSA/IDEgOiAwLCAodm9pZCAqKXByaXYpOwojZW5kaWYKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBtb2NhX3BsYXRmb3JtX2Rldl9yZWdpc3Rlcih2b2lkKQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwTW9jYURhdGE7CglzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwUGxhdGZvcm1EZXY7CglCUF9NT0NBX0lORk8gbW9jYUluZm9bQlBfTU9DQV9NQVhfTlVNXTsKCWludCBtb2NhQ2hpcE51bSA9IEJQX01PQ0FfTUFYX05VTTsKCWludCBpOwoJaW50IHJldCA9IDA7ICAgCgoJQnBHZXRNb2NhSW5mbyhtb2NhSW5mbywgJm1vY2FDaGlwTnVtKTsKCglmb3IgKGkgPSAwOyBpIDwgbW9jYUNoaXBOdW07IGkrKykgewoJCXN3aXRjaCAobW9jYUluZm9baV0udHlwZSkgewoJCQljYXNlIEJQX01PQ0FfVFlQRV9XQU46CgkJCQlwTW9jYURhdGEgPSAmbW9jYV93YW5fZGF0YTsKCQkJCXBQbGF0Zm9ybURldiA9ICZtb2NhX3dhbl9wbGF0X2RldjsKCQkJCWJyZWFrOwoKCQkJY2FzZSBCUF9NT0NBX1RZUEVfTEFOOgoJCQkJcE1vY2FEYXRhID0gJm1vY2FfbGFuX2RhdGE7CgkJCQlwUGxhdGZvcm1EZXYgPSAmbW9jYV9sYW5fcGxhdF9kZXY7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlwcmludGsoS0VSTl9FUlIgImJtb2NhOiB1bnJlY29nbml6ZWQgTW9DQSB0eXBlICVkXG4iLAoJCQkJCW1vY2FJbmZvW2ldLnR5cGUpOwoJCQkJcmV0dXJuKC0xKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBQbGF0Zm9ybURldik7CgkJaWYgKHJldCA8IDApIHsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWVsc2UgewoJCQlwTW9jYURhdGEtPmRldklkID0gaTsKCgkJCS8qIE1hcCB0aGUgYm9hcmQgcGFyYW1zIFJGIEJhbmQgdG8gdGhlIGJtb2NhLmggdmFsdWUgKi8KCQkJc3dpdGNoIChtb2NhSW5mb1tpXS5yZkJhbmQpCgkJCXsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfTE9XOgoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9EX0xPVzsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfSElHSDoKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRF9ISUdIOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRVhUX0Q6CgkJCQkJcE1vY2FEYXRhLT5yZl9iYW5kID0gTU9DQV9CQU5EX0VYVF9EOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRToKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0Y6ICAgIAoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9GOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkvKiBEbyBub3RoaW5nICovCgkJCQkJYnJlYWs7CgkJCX0KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYm1vY2E6IEZvdW5kIE1vQ0EgZGV2aWNlICVkLyVkICBSRiBCYW5kICVkXG4iLAoJCQkJaSwgbW9jYUNoaXBOdW0sIG1vY2FJbmZvW2ldLnJmQmFuZCk7CgkJfQoJfQoKCXJldHVybihyZXQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX3BsYXRmb3JtX2Rldl91bnJlZ2lzdGVyKHZvaWQpCnsKCWlmIChtb2NhX2xhbl9kYXRhLmRldklkICE9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCkKCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbW9jYV9sYW5fcGxhdF9kZXYpOwoKCWlmIChtb2NhX3dhbl9kYXRhLmRldklkICE9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCkKCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbW9jYV93YW5fcGxhdF9kZXYpOwp9CgpzdGF0aWMgdm9pZCBtb2NhXzM0NTBfd3JpdGUoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCB1OCBhZGRyLCB1MzIgZGF0YSkKewoJLyogY29tbWVudCBvdXQgZm9yIG5vdy4gV2UgZG9uJ3QgdXNlIGkyYyBvbiB0aGUgNjMyNjhCSFIgYm9hcmQgKi8KI2lmZGVmIE1PQ0FfMzQ1MF9VU0VfSTJDCglpZiAoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApCgkJYmNtMzQ1MF93cml0ZV9yZWcoYWRkciwgZGF0YSk7CgllbHNlCiNlbmRpZgoJewoJCWlmIChwcml2LT5pMmNfYmFzZSAhPSBOVUxMKQoJCQltb2NhXzM0NTBfd3JpdGVfaTJjKHByaXYsIGFkZHIsIGRhdGEpOwoJfQp9CgpzdGF0aWMgdTMyIG1vY2FfMzQ1MF9yZWFkKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgdTggYWRkcikKewoJLyogY29tbWVudCBvdXQgZm9yIG5vdy4gV2UgZG9uJ3QgdXNlIGkyYyBvbiB0aGUgNjMyNjhCSFIgYm9hcmQgKi8KI2lmZGVmIE1PQ0FfMzQ1MF9VU0VfSTJDCglpZiAoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApCgkJcmV0dXJuKGJjbTM0NTBfcmVhZF9yZWcoYWRkcikpOwoJZWxzZQojZW5kaWYKCXsKCQlpZiAocHJpdi0+aTJjX2Jhc2UgIT0gTlVMTCkKCQkJcmV0dXJuKG1vY2FfMzQ1MF9yZWFkX2kyYyhwcml2LCBhZGRyKSk7CgkJZWxzZQoJCQlyZXR1cm4oMHhmZmZmZmZmZik7Cgl9Cn0KCg==