LyoKICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKICoKICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIE9NQVAgR1BJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgoKI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgojaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KCi8qCiAqIE9NQVAxNTEwIEdQSU8gcmVnaXN0ZXJzCiAqLwojZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmY2UwMDAKI2RlZmluZSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQJMHgwMAojZGVmaW5lIE9NQVAxNTEwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAojZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOAojZGVmaW5lIE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0wJMHgwYwojZGVmaW5lIE9NQVAxNTEwX0dQSU9fSU5UX01BU0sJCTB4MTAKI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVMJMHgxNAojZGVmaW5lIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0wJMHgxOAoKI2RlZmluZSBPTUFQMTUxMF9JSF9HUElPX0JBU0UJCTY0CgovKgogKiBPTUFQMTYxMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwogKi8KI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTQwMAojZGVmaW5lIE9NQVAxNjEwX0dQSU8yX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJlYzAwCiNkZWZpbmUgT01BUDE2MTBfR1BJTzNfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmI0MDAKI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYmMwMAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fUkVWSVNJT04JCTB4MDAwMAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CiNkZWZpbmUgT01BUDE2MTBfR1BJT19JUlFTVEFUVVMxCTB4MDAxOAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMQkweDAwMWMKI2RlZmluZSBPTUFQMTYxMF9HUElPX1dBS0VVUEVOQUJMRQkweDAwMjgKI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFJTgkJMHgwMDJjCiNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBT1VUCQkweDAwMzAKI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0CiNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwxCTB4MDAzOAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMgkweDAwM2MKI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCiNkZWZpbmUgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkEJMHgwMGE4CiNkZWZpbmUgT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUCTB4MDBiMAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX0lSUUVOQUJMRTEJMHgwMGRjCiNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BCTB4MDBlOAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX0RBVEFPVVQJMHgwMGYwCgovKgogKiBPTUFQNzMwIHNwZWNpZmljIEdQSU8gcmVnaXN0ZXJzCiAqLwojZGVmaW5lIE9NQVA3MzBfR1BJTzFfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmMwMDAKI2RlZmluZSBPTUFQNzMwX0dQSU8yX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJjODAwCiNkZWZpbmUgT01BUDczMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZDAwMAojZGVmaW5lIE9NQVA3MzBfR1BJTzRfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmQ4MDAKI2RlZmluZSBPTUFQNzMwX0dQSU81X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJlMDAwCiNkZWZpbmUgT01BUDczMF9HUElPNl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTgwMAojZGVmaW5lIE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUCQkweDAwCiNkZWZpbmUgT01BUDczMF9HUElPX0RBVEFfT1VUUFVUCTB4MDQKI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOAojZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTAkweDBjCiNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9NQVNLCQkweDEwCiNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9TVEFUVVMJCTB4MTQKCi8qCiAqIG9tYXAyNHh4IHNwZWNpZmljIEdQSU8gcmVnaXN0ZXJzCiAqLwojZGVmaW5lIE9NQVAyNFhYX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDE4MDAwCiNkZWZpbmUgT01BUDI0WFhfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDgwMWEwMDAKI2RlZmluZSBPTUFQMjRYWF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYzAwMAojZGVmaW5lIE9NQVAyNFhYX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDFlMDAwCiNkZWZpbmUgT01BUDI0WFhfR1BJT19SRVZJU0lPTgkJMHgwMDAwCiNkZWZpbmUgT01BUDI0WFhfR1BJT19TWVNDT05GSUcJCTB4MDAxMAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fU1lTU1RBVFVTCQkweDAwMTQKI2RlZmluZSBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzEJMHgwMDE4CiNkZWZpbmUgT01BUDI0WFhfR1BJT19JUlFFTkFCTEUxCTB4MDAxYwojZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ1RSTAkJMHgwMDMwCiNkZWZpbmUgT01BUDI0WFhfR1BJT19PRQkJMHgwMDM0CiNkZWZpbmUgT01BUDI0WFhfR1BJT19EQVRBSU4JCTB4MDAzOAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fREFUQU9VVAkJMHgwMDNjCiNkZWZpbmUgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDAJMHgwMDQwCiNkZWZpbmUgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEJMHgwMDQ0CiNkZWZpbmUgT01BUDI0WFhfR1BJT19SSVNJTkdERVRFQ1QJMHgwMDQ4CiNkZWZpbmUgT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNUCTB4MDA0YwojZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxCTB4MDA2MAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUSVJRRU5BQkxFMQkweDAwNjQKI2RlZmluZSBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BCTB4MDA4MAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BCQkweDAwODQKI2RlZmluZSBPTUFQMjRYWF9HUElPX0NMRUFSREFUQU9VVAkweDAwOTAKI2RlZmluZSBPTUFQMjRYWF9HUElPX1NFVERBVEFPVVQJMHgwMDk0CgojZGVmaW5lIE9NQVBfTVBVSU9fTUFTSwkJKH5PTUFQX01BWF9HUElPX0xJTkVTICYgMHhmZikKCnN0cnVjdCBncGlvX2JhbmsgewoJdm9pZCBfX2lvbWVtICpiYXNlOwoJdTE2IGlycTsKCXUxNiB2aXJ0dWFsX2lycV9zdGFydDsKCWludCBtZXRob2Q7Cgl1MzIgcmVzZXJ2ZWRfbWFwOwoJdTMyIHN1c3BlbmRfd2FrZXVwOwoJdTMyIHNhdmVkX3dha2V1cDsKCXNwaW5sb2NrX3QgbG9jazsKfTsKCiNkZWZpbmUgTUVUSE9EX01QVUlPCQkwCiNkZWZpbmUgTUVUSE9EX0dQSU9fMTUxMAkxCiNkZWZpbmUgTUVUSE9EX0dQSU9fMTYxMAkyCiNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCiNkZWZpbmUgTUVUSE9EX0dQSU9fMjRYWAk0CgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7Cgl7IE9NQVBfTVBVSU9fQkFTRSwgICAgIElOVF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsICAgICBNRVRIT0RfTVBVSU99LAoJeyBPTUFQMTYxMF9HUElPMV9CQVNFLCBJTlRfR1BJT19CQU5LMSwJICAgIElIX0dQSU9fQkFTRSwgICAgICBNRVRIT0RfR1BJT18xNjEwIH0sCgl7IE9NQVAxNjEwX0dQSU8yX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzIsIElIX0dQSU9fQkFTRSArIDE2LCBNRVRIT0RfR1BJT18xNjEwIH0sCgl7IE9NQVAxNjEwX0dQSU8zX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzMsIElIX0dQSU9fQkFTRSArIDMyLCBNRVRIT0RfR1BJT18xNjEwIH0sCgl7IE9NQVAxNjEwX0dQSU80X0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzQsIElIX0dQSU9fQkFTRSArIDQ4LCBNRVRIT0RfR1BJT18xNjEwIH0sCn07CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCnN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rIGdwaW9fYmFua18xNTEwWzJdID0gewoJeyBPTUFQX01QVUlPX0JBU0UsICAgIElOVF9NUFVJTywgICAgICBJSF9NUFVJT19CQVNFLCBNRVRIT0RfTVBVSU8gfSwKCXsgT01BUDE1MTBfR1BJT19CQVNFLCBJTlRfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLCAgTUVUSE9EX0dQSU9fMTUxMCB9Cn07CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzczMFs3XSA9IHsKCXsgT01BUF9NUFVJT19CQVNFLCAgICAgSU5UXzczMF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsCU1FVEhPRF9NUFVJTyB9LAoJeyBPTUFQNzMwX0dQSU8xX0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzEsICBJSF9HUElPX0JBU0UsCU1FVEhPRF9HUElPXzczMCB9LAoJeyBPTUFQNzMwX0dQSU8yX0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzIsICBJSF9HUElPX0JBU0UgKyAzMiwJTUVUSE9EX0dQSU9fNzMwIH0sCgl7IE9NQVA3MzBfR1BJTzNfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMywgIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT183MzAgfSwKCXsgT01BUDczMF9HUElPNF9CQVNFLCAgSU5UXzczMF9HUElPX0JBTks0LCAgSUhfR1BJT19CQVNFICsgOTYsCU1FVEhPRF9HUElPXzczMCB9LAoJeyBPTUFQNzMwX0dQSU81X0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzUsICBJSF9HUElPX0JBU0UgKyAxMjgsIE1FVEhPRF9HUElPXzczMCB9LAoJeyBPTUFQNzMwX0dQSU82X0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzYsICBJSF9HUElPX0JBU0UgKyAxNjAsIE1FVEhPRF9HUElPXzczMCB9LAp9OwojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWApzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMjR4eFs0XSA9IHsKCXsgT01BUDI0WFhfR1BJTzFfQkFTRSwgSU5UXzI0WFhfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT18yNFhYIH0sCgl7IE9NQVAyNFhYX0dQSU8yX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzIsIElIX0dQSU9fQkFTRSArIDMyLAlNRVRIT0RfR1BJT18yNFhYIH0sCgl7IE9NQVAyNFhYX0dQSU8zX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzMsIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT18yNFhYIH0sCgl7IE9NQVAyNFhYX0dQSU80X0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzQsIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT18yNFhYIH0sCn07CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgKmdwaW9fYmFuazsKc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2JhbmsgKmdldF9ncGlvX2JhbmsoaW50IGdwaW8pCnsKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCglpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQoJCQlyZXR1cm4gJmdwaW9fYmFua1swXTsKCQlyZXR1cm4gJmdwaW9fYmFua1sxXTsKCX0KI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQoJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CgkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKCQkJcmV0dXJuICZncGlvX2JhbmtbMF07CgkJcmV0dXJuICZncGlvX2JhbmtbMSArIChncGlvID4+IDQpXTsKCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCglpZiAoY3B1X2lzX29tYXA3MzAoKSkgewoJCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpCgkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOwoJCXJldHVybiAmZ3Bpb19iYW5rWzEgKyAoZ3BpbyA+PiA1KV07Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKCQlyZXR1cm4gJmdwaW9fYmFua1tncGlvID4+IDVdOwojZW5kaWYKfQoKc3RhdGljIGlubGluZSBpbnQgZ2V0X2dwaW9faW5kZXgoaW50IGdwaW8pCnsKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKCWlmIChjcHVfaXNfb21hcDczMCgpKQoJCXJldHVybiBncGlvICYgMHgxZjsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQoJCXJldHVybiBncGlvICYgMHgxZjsKI2VuZGlmCglyZXR1cm4gZ3BpbyAmIDB4MGY7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdmFsaWQoaW50IGdwaW8pCnsKCWlmIChncGlvIDwgMCkKCQlyZXR1cm4gLTE7CglpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKSB7CgkJaWYgKChncGlvICYgT01BUF9NUFVJT19NQVNLKSA+IDE2KQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIDA7Cgl9CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAoJaWYgKGNwdV9pc19vbWFwMTUxMCgpICYmIGdwaW8gPCAxNikKCQlyZXR1cm4gMDsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQoJaWYgKChjcHVfaXNfb21hcDE2eHgoKSkgJiYgZ3BpbyA8IDY0KQoJCXJldHVybiAwOwojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKCWlmIChjcHVfaXNfb21hcDczMCgpICYmIGdwaW8gPCAxOTIpCgkJcmV0dXJuIDA7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChjcHVfaXNfb21hcDI0eHgoKSAmJiBncGlvIDwgMTI4KQoJCXJldHVybiAwOwojZW5kaWYKCXJldHVybiAtMTsKfQoKc3RhdGljIGludCBjaGVja19ncGlvKGludCBncGlvKQp7CglpZiAodW5saWtlbHkoZ3Bpb192YWxpZChncGlvKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IGludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpbyk7CgkJZHVtcF9zdGFjaygpOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgaXNfaW5wdXQpCnsKCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKCXUzMiBsOwoKCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CgljYXNlIE1FVEhPRF9NUFVJTzoKCQlyZWcgKz0gT01BUF9NUFVJT19JT19DTlRMOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgoJCXJlZyArPSBPTUFQMTUxMF9HUElPX0RJUl9DT05UUk9MOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgoJCXJlZyArPSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTjsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgoJCXJlZyArPSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0w7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJcmVnICs9IE9NQVAyNFhYX0dQSU9fT0U7CgkJYnJlYWs7Cgl9CglsID0gX19yYXdfcmVhZGwocmVnKTsKCWlmIChpc19pbnB1dCkKCQlsIHw9IDEgPDwgZ3BpbzsKCWVsc2UKCQlsICY9IH4oMSA8PCBncGlvKTsKCV9fcmF3X3dyaXRlbChsLCByZWcpOwp9Cgp2b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQoJCXJldHVybjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCV9zZXRfZ3Bpb19kaXJlY3Rpb24oYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGlzX2lucHV0KTsKCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKfQoKc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCnsKCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKCXUzMiBsID0gMDsKCglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfTVBVSU86CgkJcmVnICs9IE9NQVBfTVBVSU9fT1VUUFVUOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmIChlbmFibGUpCgkJCWwgfD0gMSA8PCBncGlvOwoJCWVsc2UKCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fREFUQV9PVVRQVVQ7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCB8PSAxIDw8IGdwaW87CgkJZWxzZQoJCQlsICY9IH4oMSA8PCBncGlvKTsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVDsKCQllbHNlCgkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0NMRUFSX0RBVEFPVVQ7CgkJbCA9IDEgPDwgZ3BpbzsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgoJCXJlZyArPSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQ7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCB8PSAxIDw8IGdwaW87CgkJZWxzZQoJCQlsICY9IH4oMSA8PCBncGlvKTsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDI0WFhfR1BJT19TRVREQVRBT1VUOwoJCWVsc2UKCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJEQVRBT1VUOwoJCWwgPSAxIDw8IGdwaW87CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybjsKCX0KCV9fcmF3X3dyaXRlbChsLCByZWcpOwp9Cgp2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSkKewoJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKCglpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCgkJcmV0dXJuOwoJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CglzcGluX2xvY2soJmJhbmstPmxvY2spOwoJX3NldF9ncGlvX2RhdGFvdXQoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7CglzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cn0KCmludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKewoJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKCXZvaWQgX19pb21lbSAqcmVnOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLTE7CgliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCXJlZyA9IGJhbmstPmJhc2U7Cglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfTVBVSU86CgkJcmVnICs9IE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0g7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fREFUQV9JTlBVVDsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlyZWcgKz0gT01BUDE2MTBfR1BJT19EQVRBSU47CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzczMDoKCQlyZWcgKz0gT01BUDczMF9HUElPX0RBVEFfSU5QVVQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJcmVnICs9IE9NQVAyNFhYX0dQSU9fREFUQUlOOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlCVUcoKTsKCQlyZXR1cm4gLTE7Cgl9CglyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykKCQkJJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpICE9IDA7Cn0KCiNkZWZpbmUgTU9EX1JFR19CSVQocmVnLCBiaXRfbWFzaywgc2V0KQlcCmRvIHsJXAoJaW50IGwgPSBfX3Jhd19yZWFkbChiYXNlICsgcmVnKTsgXAoJaWYgKHNldCkgbCB8PSBiaXRfbWFzazsgXAoJZWxzZSBsICY9IH5iaXRfbWFzazsgXAoJX19yYXdfd3JpdGVsKGwsIGJhc2UgKyByZWcpOyBcCn0gd2hpbGUoMCkKCnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfMjR4eF9ncGlvX3RyaWdnZXJpbmcodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgZ3BpbywgaW50IHRyaWdnZXIpCnsKCXUzMiBncGlvX2JpdCA9IDEgPDwgZ3BpbzsKCglNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCgkJdHJpZ2dlciAmIElSUVRfTE9XKTsKCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKCQl0cmlnZ2VyICYgSVJRVF9ISUdIKTsKCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fUklTSU5HREVURUNULCBncGlvX2JpdCwKCQl0cmlnZ2VyICYgSVJRVF9SSVNJTkcpOwoJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKCQl0cmlnZ2VyICYgSVJRVF9GQUxMSU5HKTsKCS8qIEZJWE1FOiBQb3NzaWJseSBkbyAnc2V0X2lycV9oYW5kbGVyKGosIGRvX2xldmVsX0lSUSknIGlmIG9ubHkgbGV2ZWwKCSAqIHRyaWdnZXJpbmcgcmVxdWVzdGVkLiAqLwp9CgpzdGF0aWMgaW50IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgdHJpZ2dlcikKewoJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwoJdTMyIGwgPSAwOwoKCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CgljYXNlIE1FVEhPRF9NUFVJTzoKCQlyZWcgKz0gT01BUF9NUFVJT19HUElPX0lOVF9FREdFOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmICh0cmlnZ2VyID09IElSUVRfUklTSU5HKQoJCQlsIHw9IDEgPDwgZ3BpbzsKCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CgkJZWxzZQoJCQlnb3RvIGJhZDsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfQ09OVFJPTDsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlpZiAodHJpZ2dlciA9PSBJUlFUX1JJU0lORykKCQkJbCB8PSAxIDw8IGdwaW87CgkJZWxzZSBpZiAodHJpZ2dlciA9PSBJUlFUX0ZBTExJTkcpCgkJCWwgJj0gfigxIDw8IGdwaW8pOwoJCWVsc2UKCQkJZ290byBiYWQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJaWYgKGdwaW8gJiAweDA4KQoJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwyOwoJCWVsc2UKCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKCQlncGlvICY9IDB4MDc7CgkJLyogV2UgYWxsb3cgb25seSBlZGdlIHRyaWdnZXJpbmcsIGkuZS4gdHdvIGxvd2VzdCBiaXRzICovCgkJaWYgKHRyaWdnZXIgJiB+SVJRVF9CT1RIRURHRSkKCQkJQlVHKCk7CgkJLyogTk9URToga25vd3MgX19JUlFUX3tGQUwsUklTfUVER0UgbWF0Y2ggT01BUCBoYXJkd2FyZSAqLwoJCXRyaWdnZXIgJj0gMHgwMzsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlsICY9IH4oMyA8PCAoZ3BpbyA8PCAxKSk7CgkJbCB8PSB0cmlnZ2VyIDw8IChncGlvIDw8IDEpOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT183MzA6CgkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlpZiAodHJpZ2dlciA9PSBJUlFUX1JJU0lORykKCQkJbCB8PSAxIDw8IGdwaW87CgkJZWxzZSBpZiAodHJpZ2dlciA9PSBJUlFUX0ZBTExJTkcpCgkJCWwgJj0gfigxIDw8IGdwaW8pOwoJCWVsc2UKCQkJZ290byBiYWQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHJlZywgZ3BpbywgdHJpZ2dlcik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCWdvdG8gYmFkOwoJfQoJX19yYXdfd3JpdGVsKGwsIHJlZyk7CglyZXR1cm4gMDsKYmFkOgoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpcnEsIHVuc2lnbmVkIHR5cGUpCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Cgl1bnNpZ25lZCBncGlvOwoJaW50IHJldHZhbDsKCglpZiAoaXJxID4gSUhfTVBVSU9fQkFTRSkKCQlncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKCWVsc2UKCQlncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAodHlwZSAmIChfX0lSUVRfTE9XTFZMfF9fSVJRVF9ISUdITFZMfElSUVRfUFJPQkUpKQoJCXJldHVybiAtRUlOVkFMOwoKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCXJldHZhbCA9IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCB0eXBlKTsKCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKewoJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwoKCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CgljYXNlIE1FVEhPRF9NUFVJTzoKCQkvKiBNUFVJTyBpcnFzdGF0dXMgaXMgcmVzZXQgYnkgcmVhZGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyLAoJCSAqIHNvIGRvIG5vdGhpbmcgaGVyZSAqLwoJCXJldHVybjsKCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgoJCXJlZyArPSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzczMDoKCQlyZWcgKz0gT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJcmVnICs9IE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7CgkJcmV0dXJuOwoJfQoJX19yYXdfd3JpdGVsKGdwaW9fbWFzaywgcmVnKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIF9jbGVhcl9ncGlvX2lycXN0YXR1cyhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbykKewoJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKfQoKc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKewoJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwoJdTMyIGw7CgoJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCWNhc2UgTUVUSE9EX01QVUlPOgoJCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmIChlbmFibGUpCgkJCWwgJj0gfihncGlvX21hc2spOwoJCWVsc2UKCQkJbCB8PSBncGlvX21hc2s7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX01BU0s7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCAmPSB+KGdwaW9fbWFzayk7CgkJZWxzZQoJCQlsIHw9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMTsKCQllbHNlCgkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTE7CgkJbCA9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgoJCXJlZyArPSBPTUFQNzMwX0dQSU9fSU5UX01BU0s7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCAmPSB+KGdwaW9fbWFzayk7CgkJZWxzZQoJCQlsIHw9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDI0WFhfR1BJT19TRVRJUlFFTkFCTEUxOwoJCWVsc2UKCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxOwoJCWwgPSBncGlvX21hc2s7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybjsKCX0KCV9fcmF3X3dyaXRlbChsLCByZWcpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKewoJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgZW5hYmxlKTsKfQoKLyoKICogTm90ZSB0aGF0IEVOQVdBS0VVUCBuZWVkcyB0byBiZSBlbmFibGVkIGluIEdQSU9fU1lTQ09ORklHIHJlZ2lzdGVyLgogKiAxNTEwIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBhIHdha2UtdXAgcmVnaXN0ZXIuIElmIEpUQUcgaXMgY29ubmVjdGVkCiAqIHRvIHRoZSB0YXJnZXQsIHN5c3RlbSB3aWxsIHdha2UgdXAgYWx3YXlzIG9uIEdQSU8gZXZlbnRzLiBXaGlsZQogKiBzeXN0ZW0gaXMgcnVubmluZyBhbGwgcmVnaXN0ZXJlZCBHUElPIGludGVycnVwdHMgbmVlZCB0byBoYXZlIHdha2UtdXAKICogZW5hYmxlZC4gV2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkLCBvbmx5IHNlbGVjdGVkIEdQSU8gaW50ZXJydXB0cyBuZWVkCiAqIHRvIGhhdmUgd2FrZS11cCBlbmFibGVkLgogKi8Kc3RhdGljIGludCBfc2V0X2dwaW9fd2FrZXVwKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQp7Cglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CgkJaWYgKGVuYWJsZSkKCQkJYmFuay0+c3VzcGVuZF93YWtldXAgfD0gKDEgPDwgZ3Bpbyk7CgkJZWxzZQoJCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+KDEgPDwgZ3Bpbyk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGVuYWJsZSBHUElPIHdha2V1cCBmb3IgbWV0aG9kICVpXG4iLAoJCSAgICAgICBiYW5rLT5tZXRob2QpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgovKiBVc2UgZGlzYWJsZV9pcnFfd2FrZSgpIGFuZCBlbmFibGVfaXJxX3dha2UoKSBmdW5jdGlvbnMgZnJvbSBkcml2ZXJzICovCnN0YXRpYyBpbnQgZ3Bpb193YWtlX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQp7Cgl1bnNpZ25lZCBpbnQgZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CglpbnQgcmV0dmFsOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVOT0RFVjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCXJldHZhbCA9IF9zZXRfZ3Bpb193YWtldXAoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7CglzcGluX3VubG9jaygmYmFuay0+bG9jayk7CgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IG9tYXBfcmVxdWVzdF9ncGlvKGludCBncGlvKQp7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVJTlZBTDsKCgliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CglpZiAodW5saWtlbHkoYmFuay0+cmVzZXJ2ZWRfbWFwICYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSkgewoJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKCQlkdW1wX3N0YWNrKCk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJCXJldHVybiAtMTsKCX0KCWJhbmstPnJlc2VydmVkX21hcCB8PSAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7CgoJLyogU2V0IHRyaWdnZXIgdG8gbm9uZS4gWW91IG5lZWQgdG8gZW5hYmxlIHRoZSB0cmlnZ2VyIGFmdGVyIHJlcXVlc3RfaXJxICovCglfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgSVJRVF9OT0VER0UpOwoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCglpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE1MTApIHsKCQl2b2lkIF9faW9tZW0gKnJlZzsKCgkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgTVBVICovCgkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7CgkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKHJlZykgfCAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSksIHJlZyk7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgewoJCS8qIEVuYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CgkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgewoJCS8qIEVuYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQTsKCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKCX0KI2VuZGlmCglzcGluX3VubG9jaygmYmFuay0+bG9jayk7CgoJcmV0dXJuIDA7Cn0KCnZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQoJCXJldHVybjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCWlmICh1bmxpa2VseSghKGJhbmstPnJlc2VydmVkX21hcCAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IEdQSU8gJWQgd2Fzbid0IHJlc2VydmVkIVxuIiwgZ3Bpbyk7CgkJZHVtcF9zdGFjaygpOwoJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKCQlyZXR1cm47Cgl9CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CgkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKSB7CgkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BOwoJCV9fcmF3X3dyaXRlbCgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCByZWcpOwoJfQojZW5kaWYKCWJhbmstPnJlc2VydmVkX21hcCAmPSB+KDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpOwoJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgMSk7Cglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwoJX2NsZWFyX2dwaW9faXJxc3RhdHVzKGJhbmssIGdwaW8pOwoJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwp9CgovKgogKiBXZSBuZWVkIHRvIHVubWFzayB0aGUgR1BJTyBiYW5rIGludGVycnVwdCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvCiAqIGF2b2lkIG1pc3NpbmcgR1BJTyBpbnRlcnJ1cHRzIGZvciBvdGhlciBsaW5lcyBpbiB0aGUgYmFuay4KICogVGhlbiB3ZSBuZWVkIHRvIG1hc2stcmVhZC1jbGVhci11bm1hc2sgdGhlIHRyaWdnZXJlZCBHUElPIGxpbmVzCiAqIGluIHRoZSBiYW5rIHRvIGF2b2lkIG1pc3NpbmcgbmVzdGVkIGludGVycnVwdHMgZm9yIGEgR1BJTyBsaW5lLgogKiBJZiB3ZSB3YWl0IHRvIHVubWFzayBpbmRpdmlkdWFsIEdQSU8gbGluZXMgaW4gdGhlIGJhbmsgYWZ0ZXIgdGhlCiAqIGxpbmUncyBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgYmVlbiBydW4sIHdlIG1heSBtaXNzIHNvbWUgbmVzdGVkCiAqIGludGVycnVwdHMuCiAqLwpzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAoJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7Cgl2b2lkIF9faW9tZW0gKmlzcl9yZWcgPSBOVUxMOwoJdTMyIGlzcjsKCXVuc2lnbmVkIGludCBncGlvX2lycTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CgoJYmFuayA9IChzdHJ1Y3QgZ3Bpb19iYW5rICopIGRlc2MtPmRhdGE7CglpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVBfTVBVSU9fR1BJT19JTlQ7CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKQoJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCglpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE2MTApCgkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT183MzApCgkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKQoJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxOwojZW5kaWYKCgl3aGlsZSgxKSB7CgkJaXNyID0gX19yYXdfcmVhZGwoaXNyX3JlZyk7CgkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKCQlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7CgkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAxKTsKCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKCgkJaWYgKCFpc3IpCgkJCWJyZWFrOwoKCQlncGlvX2lycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwoJCWZvciAoOyBpc3IgIT0gMDsgaXNyID4+PSAxLCBncGlvX2lycSsrKSB7CgkJCXN0cnVjdCBpcnFkZXNjICpkOwoJCQlpZiAoIShpc3IgJiAxKSkKCQkJCWNvbnRpbnVlOwoJCQlkID0gaXJxX2Rlc2MgKyBncGlvX2lycTsKCQkJZGVzY19oYW5kbGVfaXJxKGdwaW9faXJxLCBkLCByZWdzKTsKCQl9CiAgICAgICAgfQp9CgpzdGF0aWMgdm9pZCBncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKewoJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCglfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoYmFuaywgZ3Bpbyk7Cn0KCnN0YXRpYyB2b2lkIGdwaW9fbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKewoJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwp9CgpzdGF0aWMgdm9pZCBncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKewoJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7Cgl1bnNpZ25lZCBpbnQgZ3Bpb19pZHggPSBnZXRfZ3Bpb19pbmRleChncGlvKTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoKCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3Bpb19pZHgsIDEpOwp9CgpzdGF0aWMgdm9pZCBtcHVpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCnsKCS8qIFRoZSBJU1IgaXMgcmVzZXQgYXV0b21hdGljYWxseSwgc28gZG8gbm90aGluZyBoZXJlLiAqLwp9CgpzdGF0aWMgdm9pZCBtcHVpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQp7Cgl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwp9CgpzdGF0aWMgdm9pZCBtcHVpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCnsKCXVuc2lnbmVkIGludCBncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoKCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBncGlvX2lycV9jaGlwID0gewoJLmFjawkJPSBncGlvX2Fja19pcnEsCgkubWFzawkJPSBncGlvX21hc2tfaXJxLAoJLnVubWFzawkJPSBncGlvX3VubWFza19pcnEsCgkuc2V0X3R5cGUJPSBncGlvX2lycV90eXBlLAoJLnNldF93YWtlCT0gZ3Bpb193YWtlX2VuYWJsZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBtcHVpb19pcnFfY2hpcCA9IHsKCS5hY2sJPSBtcHVpb19hY2tfaXJxLAoJLm1hc2sJPSBtcHVpb19tYXNrX2lycSwKCS51bm1hc2sgPSBtcHVpb191bm1hc2tfaXJxCn07CgpzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKc3RhdGljIHN0cnVjdCBjbGsgKiBncGlvX2NrID0gTlVMTDsKCnN0YXRpYyBpbnQgX19pbml0IF9vbWFwX2dwaW9faW5pdCh2b2lkKQp7CglpbnQgaTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaW5pdGlhbGl6ZWQgPSAxOwoKCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewoJCWdwaW9fY2sgPSBjbGtfZ2V0KE5VTEwsICJhcm1fZ3Bpb19jayIpOwoJCWlmIChJU19FUlIoZ3Bpb19jaykpCgkJCXByaW50aygiQ291bGQgbm90IGdldCBhcm1fZ3Bpb19ja1xuIik7CgkJZWxzZQoJCQljbGtfdXNlKGdwaW9fY2spOwoJfQoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCglpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMTUxMCBHUElPIGhhcmR3YXJlXG4iKTsKCQlncGlvX2JhbmtfY291bnQgPSAyOwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNTEwOwoJfQojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCglpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKCQl1MzIgcmV2OwoKCQlncGlvX2JhbmtfY291bnQgPSA1OwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNjEwOwoJCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKCQlwcmludGsoS0VSTl9JTkZPICJPTUFQIEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKCQkgICAgICAgKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYpOwoJfQojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDczMCBHUElPIGhhcmR3YXJlXG4iKTsKCQlncGlvX2JhbmtfY291bnQgPSA3OwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCWludCByZXY7CgoJCWdwaW9fYmFua19jb3VudCA9IDQ7CgkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzI0eHg7CgkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOwoJCXByaW50ayhLRVJOX0lORk8gIk9NQVAyNHh4IEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKCQkJKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYpOwoJfQojZW5kaWYKCWZvciAoaSA9IDA7IGkgPCBncGlvX2JhbmtfY291bnQ7IGkrKykgewoJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CgoJCWJhbmsgPSAmZ3Bpb19iYW5rW2ldOwoJCWJhbmstPnJlc2VydmVkX21hcCA9IDA7CgkJYmFuay0+YmFzZSA9IElPX0FERFJFU1MoYmFuay0+YmFzZSk7CgkJc3Bpbl9sb2NrX2luaXQoJmJhbmstPmxvY2spOwoJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSB7CgkJCW9tYXBfd3JpdGV3KDB4RkZGRiwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19HUElPX01BU0tJVCk7CgkJfQojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE1MTApIHsKCQkJX19yYXdfd3JpdGV3KDB4ZmZmZiwgYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX01BU0spOwoJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTKTsKCQl9CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE2MTApIHsKCQkJX19yYXdfd3JpdGV3KDB4MDAwMCwgYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMSk7CgkJCV9fcmF3X3dyaXRldygweGZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEpOwoJCQlfX3Jhd193cml0ZXcoMHgwMDE0LCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TWVNDT05GSUcpOwoJCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCgkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT183MzApIHsKCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX01BU0spOwoJCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTKTsKCgkJCWdwaW9fY291bnQgPSAzMjsgLyogNzMwIGhhcyAzMi1iaXQgR1BJT3MgKi8KCQl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKCQkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTEpOwoJCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMSk7CgoJCQlncGlvX2NvdW50ID0gMzI7CgkJfQojZW5kaWYKCQlmb3IgKGogPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGdwaW9fY291bnQ7IGorKykgewoJCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKCQkJCXNldF9pcnFfY2hpcChqLCAmbXB1aW9faXJxX2NoaXApOwoJCQllbHNlCgkJCQlzZXRfaXJxX2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOwoJCQlzZXRfaXJxX2hhbmRsZXIoaiwgZG9fc2ltcGxlX0lSUSk7CgkJCXNldF9pcnFfZmxhZ3MoaiwgSVJRRl9WQUxJRCk7CgkJfQoJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGJhbmstPmlycSwgZ3Bpb19pcnFfaGFuZGxlcik7CgkJc2V0X2lycV9kYXRhKGJhbmstPmlycSwgYmFuayk7Cgl9CgoJLyogRW5hYmxlIHN5c3RlbSBjbG9jayBmb3IgR1BJTyBtb2R1bGUuCgkgKiBUaGUgQ0FNX0NMS19DVFJMICppcyogcmVhbGx5IHRoZSByaWdodCBwbGFjZS4gKi8KCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKCQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKFVMUERfQ0FNX0NMS19DVFJMKSB8IDB4MDQsIFVMUERfQ0FNX0NMS19DVFJMKTsKCglyZXR1cm4gMDsKfQoKI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkIChDT05GSUdfQVJDSF9PTUFQMjRYWCkKc3RhdGljIGludCBvbWFwX2dwaW9fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKewoJaW50IGk7CgoJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CgkJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9ICZncGlvX2JhbmtbaV07CgkJdm9pZCBfX2lvbWVtICp3YWtlX3N0YXR1czsKCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CgkJdm9pZCBfX2lvbWVtICp3YWtlX3NldDsKCgkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCQljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJCXdha2Vfc3RhdHVzID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fV0FLRVVQRU5BQkxFOwoJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOwoJCQl3YWtlX3NldCA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CgkJCWJyZWFrOwoJCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKCQkJd2FrZV9zdGF0dXMgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CgkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQTsKCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbnRpbnVlOwoJCX0KCgkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCQliYW5rLT5zYXZlZF93YWtldXAgPSBfX3Jhd19yZWFkbCh3YWtlX3N0YXR1cyk7CgkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIHdha2VfY2xlYXIpOwoJCV9fcmF3X3dyaXRlbChiYW5rLT5zdXNwZW5kX3dha2V1cCwgd2FrZV9zZXQpOwoJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBvbWFwX2dwaW9fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCnsKCWludCBpOwoKCWlmICghY3B1X2lzX29tYXAyNHh4KCkgJiYgIWNwdV9pc19vbWFwMTZ4eCgpKQoJCXJldHVybiAwOwoKCWZvciAoaSA9IDA7IGkgPCBncGlvX2JhbmtfY291bnQ7IGkrKykgewoJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOwoJCXZvaWQgX19pb21lbSAqd2FrZV9jbGVhcjsKCQl2b2lkIF9faW9tZW0gKndha2Vfc2V0OwoKCQlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOwoJCQlicmVhazsKCQljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkE7CgkJCXdha2Vfc2V0ID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY29udGludWU7CgkJfQoKCQlzcGluX2xvY2soJmJhbmstPmxvY2spOwoJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCB3YWtlX2NsZWFyKTsKCQlfX3Jhd193cml0ZWwoYmFuay0+c2F2ZWRfd2FrZXVwLCB3YWtlX3NldCk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBvbWFwX2dwaW9fc3lzY2xhc3MgPSB7CglzZXRfa3NldF9uYW1lKCJncGlvIiksCgkuc3VzcGVuZAk9IG9tYXBfZ3Bpb19zdXNwZW5kLAoJLnJlc3VtZQkJPSBvbWFwX2dwaW9fcmVzdW1lLAp9OwoKc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIG9tYXBfZ3Bpb19kZXZpY2UgPSB7CgkuaWQJCT0gMCwKCS5jbHMJCT0gJm9tYXBfZ3Bpb19zeXNjbGFzcywKfTsKI2VuZGlmCgovKgogKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAogKi8KaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpCnsKCWlmICghaW5pdGlhbGl6ZWQpCgkJcmV0dXJuIF9vbWFwX2dwaW9faW5pdCgpOwoJZWxzZQoJCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9faW5pdCBvbWFwX2dwaW9fc3lzaW5pdCh2b2lkKQp7CglpbnQgcmV0ID0gMDsKCglpZiAoIWluaXRpYWxpemVkKQoJCXJldCA9IF9vbWFwX2dwaW9faW5pdCgpOwoKI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpCglpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2lzX29tYXAyNHh4KCkpIHsKCQlpZiAocmV0ID09IDApIHsKCQkJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvbWFwX2dwaW9fc3lzY2xhc3MpOwoJCQlpZiAocmV0ID09IDApCgkJCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJm9tYXBfZ3Bpb19kZXZpY2UpOwoJCX0KCX0KI2VuZGlmCgoJcmV0dXJuIHJldDsKfQoKRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfZ3Bpbyk7CkVYUE9SVF9TWU1CT0wob21hcF9mcmVlX2dwaW8pOwpFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKTsKRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RhdGFvdXQpOwpFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2dwaW9fZGF0YWluKTsKCmFyY2hfaW5pdGNhbGwob21hcF9ncGlvX3N5c2luaXQpOwo=