LyoKICogVGVycmFUZWMgQ2luZXJneSBUsi9xYW51IFVTQjIgRFZCLVQgYWRhcHRlci4KICoKICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCiAqCQkgICAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQHFhbnUuZGU+CiAqCiAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdXNiLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KCiNpbmNsdWRlICJkbXhkZXYuaCIKI2luY2x1ZGUgImR2Yl9kZW11eC5oIgojaW5jbHVkZSAiZHZiX25ldC5oIgoKCiNpZmRlZiBDT05GSUdfRFZCX0NJTkVSR1lUMl9UVU5JTkcKCSNkZWZpbmUgU1RSRUFNX1VSQl9DT1VOVCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfU1RSRUFNX1VSQl9DT1VOVCkKCSNkZWZpbmUgU1RSRUFNX0JVRl9TSVpFIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fQlVGX1NJWkUpCgkjZGVmaW5lIFFVRVJZX0lOVEVSVkFMIChDT05GSUdfRFZCX0NJTkVSR1lUMl9RVUVSWV9JTlRFUlZBTCkKCSNpZmRlZiBDT05GSUdfRFZCX0NJTkVSR1lUMl9FTkFCTEVfUkNfSU5QVVRfREVWSUNFCgkJI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfUkNfUVVFUllfSU5URVJWQUwpCgkJI2RlZmluZSBFTkFCTEVfUkMgKDEpCgkjZW5kaWYKI2Vsc2UKCSNkZWZpbmUgU1RSRUFNX1VSQl9DT1VOVCAoMzIpCgkjZGVmaW5lIFNUUkVBTV9CVUZfU0laRSAoNTEyKQkvKiBieXRlcyAqLwoJI2RlZmluZSBFTkFCTEVfUkMgKDEpCgkjZGVmaW5lIFJDX1FVRVJZX0lOVEVSVkFMICgxMDApCS8qIG1pbGxpc2Vjb25kcyAqLwoJI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoMzMzKQkvKiBtaWxsaXNlY29uZHMgKi8KI2VuZGlmCgojZGVmaW5lIERSSVZFUl9OQU1FICJUZXJyYVRlYy9xYW51IFVTQjIuMCBIaWdoc3BlZWQgRFZCLVQgUmVjZWl2ZXIiCgpzdGF0aWMgaW50IGRlYnVnOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRlYnVnLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CgojZGVmaW5lIGRwcmludGsobGV2ZWwsIGFyZ3MuLi4pCQkJCQkJXApkbyB7CQkJCQkJCQkJXAoJaWYgKChkZWJ1ZyAmIGxldmVsKSkgewkJCQkJCVwKCQlwcmludGsoIiVzOiAlcygpOiAiLCBfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSksCVwKCQkgICAgICAgX19GVU5DVElPTl9fKTsJCQkJCVwKCQlwcmludGsoYXJncyk7IH0JCQkJCQlcCn0gd2hpbGUgKDApCgplbnVtIGNpbmVyZ3l0Ml9lcDFfY21kIHsKCUNJTkVSR1lUMl9FUDFfUElEX1RBQkxFX1JFU0VUCQk9IDB4MDEsCglDSU5FUkdZVDJfRVAxX1BJRF9TRVRVUAkJCT0gMHgwMiwKCUNJTkVSR1lUMl9FUDFfQ09OVFJPTF9TVFJFQU1fVFJBTlNGRVIJPSAweDAzLAoJQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUwk9IDB4MDQsCglDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMJCT0gMHgwNSwKCUNJTkVSR1lUMl9FUDFfU1RBUlRfU0NBTgkJPSAweDA2LAoJQ0lORVJHWVQyX0VQMV9DT05USU5VRV9TQ0FOCQk9IDB4MDcsCglDSU5FUkdZVDJfRVAxX0dFVF9SQ19FVkVOVFMJCT0gMHgwOCwKCUNJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERQkJPSAweDA5Cn07CgpzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgewoJdWludDhfdCBjbWQ7Cgl1aW50MzJfdCBmcmVxOwoJdWludDhfdCBiYW5kd2lkdGg7Cgl1aW50MTZfdCB0cHM7Cgl1aW50OF90IGZsYWdzOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgewoJdWludDMyX3QgZnJlcTsKCXVpbnQ4X3QgYmFuZHdpZHRoOwoJdWludDE2X3QgdHBzOwoJdWludDhfdCBmbGFnczsKCXVpbnQxNl90IGdhaW47Cgl1aW50OF90IHNucjsKCXVpbnQzMl90IHZpdGVyYmlfZXJyb3JfcmF0ZTsKCXVpbnQzMl90IHJzX2Vycm9yX3JhdGU7Cgl1aW50MzJfdCB1bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKCXVpbnQ4X3QgbG9ja19iaXRzOwoJdWludDhfdCBwcmV2X2xvY2tfYml0czsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCnN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8gY2luZXJneXQyX2ZlX2luZm8gPSB7CgkubmFtZSA9IERSSVZFUl9OQU1FLAoJLnR5cGUgPSBGRV9PRkRNLAoJLmZyZXF1ZW5jeV9taW4gPSAxNzQwMDAwMDAsCgkuZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMCwKCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAxNjY2NjcsCgkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfAoJCUZFX0NBTl9GRUNfM180IHwgRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzdfOCB8CgkJRkVfQ0FOX0ZFQ19BVVRPIHwKCQlGRV9DQU5fUVBTSyB8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FBTV9BVVRPIHwKCQlGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwKCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUiB8IEZFX0NBTl9NVVRFX1RTCn07CgpzdHJ1Y3QgY2luZXJneXQyIHsKCXN0cnVjdCBkdmJfZGVtdXggZGVtdXg7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwoJc3RydWN0IGR2Yl9hZGFwdGVyIGFkYXB0ZXI7CglzdHJ1Y3QgZHZiX2RldmljZSAqZmVkZXY7CglzdHJ1Y3QgZG14ZGV2IGRteGRldjsKCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKCglpbnQgc3RyZWFtaW5nOwoJaW50IHNsZWVwaW5nOwoKCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyBwYXJhbTsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHN0YXR1czsKCXN0cnVjdCB3b3JrX3N0cnVjdCBxdWVyeV93b3JrOwoKCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd3E7CglpbnQgcGVuZGluZ19mZV9ldmVudHM7CgoJdm9pZCAqc3RyZWFtYnVmOwoJZG1hX2FkZHJfdCBzdHJlYW1idWZfZG1haGFuZGxlOwoJc3RydWN0IHVyYiAqc3RyZWFtX3VyYiBbU1RSRUFNX1VSQl9DT1VOVF07CgojaWZkZWYgRU5BQkxFX1JDCglzdHJ1Y3QgaW5wdXRfZGV2IHJjX2lucHV0X2RldjsKCXN0cnVjdCB3b3JrX3N0cnVjdCByY19xdWVyeV93b3JrOwoJaW50IHJjX2lucHV0X2V2ZW50OwojZW5kaWYKfTsKCmVudW0gewoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTk9ORSA9IDB4MDAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMgID0gMHgwMSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX1JDNSAgPSAweDAyCn07CgpzdHJ1Y3QgY2luZXJneXQyX3JjX2V2ZW50IHsKCWNoYXIgdHlwZTsKCXVpbnQzMl90IHZhbHVlOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKc3RhdGljIGNvbnN0IHVpbnQzMl90IHJjX2tleXMgW10gPSB7CglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmUwMWViMDQsCUtFWV9QT1dFUiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZDAyZWIwNCwJS0VZXzEsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmMwM2ViMDQsCUtFWV8yLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZiMDRlYjA0LAlLRVlfMywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYTA1ZWIwNCwJS0VZXzQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjkwNmViMDQsCUtFWV81LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY4MDdlYjA0LAlLRVlfNiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNzA4ZWIwNCwJS0VZXzcsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjYwOWViMDQsCUtFWV84LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY1MGFlYjA0LAlLRVlfOSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMzBjZWIwNCwJS0VZXzAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjQwYmViMDQsCUtFWV9WSURFTywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMjBkZWIwNCwJS0VZX1JFRlJFU0gsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjEwZWViMDQsCUtFWV9TRUxFQ1QsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjAwZmViMDQsCUtFWV9FUEcsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWYxMGViMDQsCUtFWV9VUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYjE0ZWIwNCwJS0VZX0RPV04sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWUxMWViMDQsCUtFWV9MRUZULAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVjMTNlYjA0LAlLRVlfUklHSFQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWQxMmViMDQsCUtFWV9PSywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYTE1ZWIwNCwJS0VZX1RFWFQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTkxNmViMDQsCUtFWV9JTkZPLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU4MTdlYjA0LAlLRVlfUkVELAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU3MThlYjA0LAlLRVlfR1JFRU4sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTYxOWViMDQsCUtFWV9ZRUxMT1csCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTUxYWViMDQsCUtFWV9CTFVFLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUzMWNlYjA0LAlLRVlfVk9MVU1FVVAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTExZWViMDQsCUtFWV9WT0xVTUVET1dOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUyMWRlYjA0LAlLRVlfTVVURSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNDFiZWIwNCwJS0VZX0NIQU5ORUxVUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMDFmZWIwNCwJS0VZX0NIQU5ORUxET1dOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGJmNDBlYjA0LAlLRVlfUEFVU0UsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YjM0Y2ViMDQsCUtFWV9QTEFZLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGE3NThlYjA0LAlLRVlfUkVDT1JELAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGFiNTRlYjA0LAlLRVlfUFJFVklPVVMsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4Yjc0OGViMDQsCUtFWV9TVE9QLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGEzNWNlYjA0LAlLRVlfTkVYVAp9OwoKc3RhdGljIGludCBjaW5lcmd5dDJfY29tbWFuZCAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLAoJCQkgICAgICBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKCQkJICAgICAgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pCnsKCWludCBhY3R1YWxfbGVuOwoJY2hhciBkdW1teTsKCWludCByZXQ7CgoJcmV0ID0gdXNiX2J1bGtfbXNnKGNpbmVyZ3l0Mi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMSksCgkJCSAgIHNlbmRfYnVmLCBzZW5kX2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAxMDAwKTsKCglpZiAocmV0KQoJCWRwcmludGsoMSwgInVzYl9idWxrX21zZyAoc2VuZCkgZmFpbGVkLCBlcnIgJWlcbiIsIHJldCk7CgoJaWYgKCFyZWN2X2J1ZikKCQlyZWN2X2J1ZiA9ICZkdW1teTsKCglyZXQgPSB1c2JfYnVsa19tc2coY2luZXJneXQyLT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoY2luZXJneXQyLT51ZGV2LCAxKSwKCQkJICAgcmVjdl9idWYsIHJlY3ZfYnVmX2xlbiwgJmFjdHVhbF9sZW4sIDEwMDApOwoKCWlmIChyZXQpCgkJZHByaW50aygxLCAidXNiX2J1bGtfbXNnIChyZWFkKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKCglyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsX2xlbjsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIGludCBlbmFibGUpCnsKCWNoYXIgYnVmIFtdID0geyBDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSLCBlbmFibGUgPyAxIDogMCB9OwoJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3NsZWVwIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIGludCBzbGVlcCkKewoJY2hhciBidWYgW10gPSB7IENJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERSwgc2xlZXAgPyAxIDogMCB9OwoJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKCWNpbmVyZ3l0Mi0+c2xlZXBpbmcgPSBzbGVlcDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0cmVhbV9pcnEgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwoKc3RhdGljIGludCBjaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0Miwgc3RydWN0IHVyYiAqdXJiKQp7CglpbnQgZXJyOwoKCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKCQkJICBjaW5lcmd5dDItPnVkZXYsCgkJCSAgdXNiX3JjdmJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMHgyKSwKCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlciwKCQkJICBTVFJFQU1fQlVGX1NJWkUsCgkJCSAgY2luZXJneXQyX3N0cmVhbV9pcnEsCgkJCSAgY2luZXJneXQyKTsKCglpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpKQoJCWRwcmludGsoMSwgInVyYiBzdWJtaXNzaW9uIGZhaWxlZCAoZXJyID0gJWkpIVxuIiwgZXJyKTsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RyZWFtX2lycSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXJiLT5jb250ZXh0OwoKCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKQoJCWR2Yl9kbXhfc3dmaWx0ZXIoJmNpbmVyZ3l0Mi0+ZGVtdXgsCgkJCQkgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CgoJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtaW5nKQoJCWNpbmVyZ3l0Ml9zdWJtaXRfc3RyZWFtX3VyYihjaW5lcmd5dDIsIHVyYik7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWludCBpOwoKCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykKCQlpZiAoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKQoJCQl1c2JfZnJlZV91cmIoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKTsKCglwY2lfZnJlZV9jb25zaXN0ZW50KE5VTEwsIFNUUkVBTV9VUkJfQ09VTlQqU1RSRUFNX0JVRl9TSVpFLAoJCQkgICAgY2luZXJneXQyLT5zdHJlYW1idWYsIGNpbmVyZ3l0Mi0+c3RyZWFtYnVmX2RtYWhhbmRsZSk7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX2FsbG9jX3N0cmVhbV91cmJzIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWludCBpOwoKCWNpbmVyZ3l0Mi0+c3RyZWFtYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoTlVMTCwKCQkJCQkgICAgICBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSwKCQkJCQkgICAgICAmY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKCWlmICghY2luZXJneXQyLT5zdHJlYW1idWYpIHsKCQlkcHJpbnRrKDEsICJmYWlsZWQgdG8gYWxsb2MgY29uc2lzdGVudCBzdHJlYW0gbWVtb3J5IGFyZWEsIGJhaWxpbmcgb3V0IVxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0KGNpbmVyZ3l0Mi0+c3RyZWFtYnVmLCAwLCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSk7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKSB7CgkJc3RydWN0IHVyYiAqdXJiOwoKCQlpZiAoISh1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpKSkgewoJCQlkcHJpbnRrKDEsICJmYWlsZWQgdG8gYWxsb2MgY29uc2lzdGVudCBzdHJlYW0gdXJicywgYmFpbGluZyBvdXQhXG4iKTsKCQkJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoKCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGNpbmVyZ3l0Mi0+c3RyZWFtYnVmICsgaSAqIFNUUkVBTV9CVUZfU0laRTsKCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTVFJFQU1fQlVGX1NJWkU7CgoJCWNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSA9IHVyYjsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJaW50IGk7CgoJY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMCk7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKQoJCWlmIChjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pCgkJCXVzYl9raWxsX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaSwgZXJyOwoKCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykgewoJCWlmICgoZXJyID0gY2luZXJneXQyX3N1Ym1pdF9zdHJlYW1fdXJiKGNpbmVyZ3l0MiwgY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKSkpIHsKCQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCQkJZHByaW50aygxLCAiZmFpbGVkIHVyYiBzdWJtaXNzaW9uICglaTogZXJyID0gJWkpIVxuIiwgaSwgZXJyKTsKCQkJcmV0dXJuIGVycjsKCQl9Cgl9CgoJY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCnsKCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkZW11eC0+cHJpdjsKCglpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKCQljaW5lcmd5dDJfc3RhcnRfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKCgljaW5lcmd5dDItPnN0cmVhbWluZysrOwoJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQp7CglzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZGVtdXgtPnByaXY7CgoJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJaWYgKC0tY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoKCXVwKCZjaW5lcmd5dDItPnNlbSk7CglyZXR1cm4gMDsKfQoKLyoqCiAqICBjb252ZXJ0IGxpbnV4LWR2YiBmcm9udGVuZCBwYXJhbWV0ZXIgc2V0IGludG8gVFBTLgogKiAgU2VlIEVUU0kgRVRTLTMwMDc0NCwgc2VjdGlvbiA0LjYuMiwgdGFibGUgOSBmb3IgZGV0YWlscy4KICoKICogIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFibHkgcmV1c2FibGUgYW5kIG1heSBiZXR0ZXIgZ2V0IHBsYWNlZCBpbiBhIHN1cHBvcnQKICogIGxpYnJhcnkuCiAqCiAqICBXZSByZXBsYWNlIGVycm9ybm91cyBmaWVsZHMgYnkgZGVmYXVsdCBUUFMgZmllbGRzICh0aGUgb25lcyB3aXRoIHZhbHVlIDApLgogKi8Kc3RhdGljIHVpbnQxNl90IGNvbXB1dGVfdHBzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCnsKCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpvcCA9ICZwLT51Lm9mZG07Cgl1aW50MTZfdCB0cHMgPSAwOwoKCXN3aXRjaCAob3AtPmNvZGVfcmF0ZV9IUCkgewoJCWNhc2UgRkVDXzJfMzoKCQkJdHBzIHw9ICgxIDw8IDcpOwoJCQlicmVhazsKCQljYXNlIEZFQ18zXzQ6CgkJCXRwcyB8PSAoMiA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfNV82OgoJCQl0cHMgfD0gKDMgPDwgNyk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzdfODoKCQkJdHBzIHw9ICg0IDw8IDcpOwoJCQlicmVhazsKCQljYXNlIEZFQ18xXzI6CgkJY2FzZSBGRUNfQVVUTzoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgNykgKi87Cgl9CgoJc3dpdGNoIChvcC0+Y29kZV9yYXRlX0xQKSB7CgkJY2FzZSBGRUNfMl8zOgoJCQl0cHMgfD0gKDEgPDwgNCk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzNfNDoKCQkJdHBzIHw9ICgyIDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ181XzY6CgkJCXRwcyB8PSAoMyA8PCA0KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfN184OgoJCQl0cHMgfD0gKDQgPDwgNCk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzFfMjoKCQljYXNlIEZFQ19BVVRPOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCA0KSAqLzsKCX0KCglzd2l0Y2ggKG9wLT5jb25zdGVsbGF0aW9uKSB7CgkJY2FzZSBRQU1fMTY6CgkJCXRwcyB8PSAoMSA8PCAxMyk7CgkJCWJyZWFrOwoJCWNhc2UgUUFNXzY0OgoJCQl0cHMgfD0gKDIgPDwgMTMpOwoJCQlicmVhazsKCQljYXNlIFFQU0s6CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDEzKSAqLzsKCX0KCglzd2l0Y2ggKG9wLT50cmFuc21pc3Npb25fbW9kZSkgewoJCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfOEs6CgkJCXRwcyB8PSAoMSA8PCAwKTsKCQkJYnJlYWs7CgkJY2FzZSBUUkFOU01JU1NJT05fTU9ERV8ySzoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMCkgKi87Cgl9CgoJc3dpdGNoIChvcC0+Z3VhcmRfaW50ZXJ2YWwpIHsKCQljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMTY6CgkJCXRwcyB8PSAoMSA8PCAyKTsKCQkJYnJlYWs7CgkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CgkJCXRwcyB8PSAoMiA8PCAyKTsKCQkJYnJlYWs7CgkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzQ6CgkJCXRwcyB8PSAoMyA8PCAyKTsKCQkJYnJlYWs7CgkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzMyOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCAyKSAqLzsKCX0KCglzd2l0Y2ggKG9wLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKCQljYXNlIEhJRVJBUkNIWV8xOgoJCQl0cHMgfD0gKDEgPDwgMTApOwoJCQlicmVhazsKCQljYXNlIEhJRVJBUkNIWV8yOgoJCQl0cHMgfD0gKDIgPDwgMTApOwoJCQlicmVhazsKCQljYXNlIEhJRVJBUkNIWV80OgoJCQl0cHMgfD0gKDMgPDwgMTApOwoJCQlicmVhazsKCQljYXNlIEhJRVJBUkNIWV9OT05FOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCAxMCkgKi87Cgl9CgoJcmV0dXJuIHRwczsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7CglpbnQgZXJyOwoKCWlmICgoZXJyID0gZHZiX2dlbmVyaWNfb3Blbihpbm9kZSwgZmlsZSkpKQoJCXJldHVybiBlcnI7CgoJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgewoJCWNpbmVyZ3l0Ml9zbGVlcChjaW5lcmd5dDIsIDApOwoJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBIWi8yKTsKCX0KCgl1cCgmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoKCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKCQljYW5jZWxfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmspOwoJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CgkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMSk7Cgl9CgoJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKCglyZXR1cm4gZHZiX2dlbmVyaWNfcmVsZWFzZShpbm9kZSwgZmlsZSk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2luZXJneXQyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7Cglwb2xsX3dhaXQoZmlsZSwgJmNpbmVyZ3l0Mi0+cG9sbF93cSwgd2FpdCk7CglyZXR1cm4gKFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJKTsKfQoKCnN0YXRpYyBpbnQgY2luZXJneXQyX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKCQkgICAgIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7CglzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZyAqc3RhdCA9ICZjaW5lcmd5dDItPnN0YXR1czsKCWZlX3N0YXR1c190IHN0YXR1cyA9IDA7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgRkVfR0VUX0lORk86CgkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIqKSBhcmcsICZjaW5lcmd5dDJfZmVfaW5mbywKCQkJCSAgICBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKSk7CgoJY2FzZSBGRV9SRUFEX1NUQVRVUzoKCQlpZiAoMHhmZmZmIC0gbGUxNl90b19jcHUoc3RhdC0+Z2FpbikgPiAzMCkKCQkJc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CgkJaWYgKHN0YXQtPmxvY2tfYml0cyAmICgxIDw8IDYpKQoJCQlzdGF0dXMgfD0gRkVfSEFTX0xPQ0s7CgkJaWYgKHN0YXQtPmxvY2tfYml0cyAmICgxIDw8IDUpKQoJCQlzdGF0dXMgfD0gRkVfSEFTX1NZTkM7CgkJaWYgKHN0YXQtPmxvY2tfYml0cyAmICgxIDw8IDQpKQoJCQlzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CgkJaWYgKHN0YXQtPmxvY2tfYml0cyAmICgxIDw8IDEpKQoJCQlzdGF0dXMgfD0gRkVfSEFTX1ZJVEVSQkk7CgoJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgIF9fdXNlciopIGFyZywgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOwoKCWNhc2UgRkVfUkVBRF9CRVI6CgkJcmV0dXJuIHB1dF91c2VyKGxlMzJfdG9fY3B1KHN0YXQtPnZpdGVyYmlfZXJyb3JfcmF0ZSksCgkJCQkoX191MzIgX191c2VyICopIGFyZyk7CgoJY2FzZSBGRV9SRUFEX1NJR05BTF9TVFJFTkdUSDoKCQlyZXR1cm4gcHV0X3VzZXIoMHhmZmZmIC0gbGUxNl90b19jcHUoc3RhdC0+Z2FpbiksCgkJCQkoX191MTYgX191c2VyICopIGFyZyk7CgoJY2FzZSBGRV9SRUFEX1NOUjoKCQlyZXR1cm4gcHV0X3VzZXIoKHN0YXQtPnNuciA8PCA4KSB8IHN0YXQtPnNuciwKCQkJCShfX3UxNiBfX3VzZXIgKikgYXJnKTsKCgljYXNlIEZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTOgoJCS8qIFVOQyBhcmUgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gaG9zdCBieXRlIG9yZGVyLi4uICovCgkJcmV0dXJuIHB1dF91c2VyKHN0YXQtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50LAoJCQkJKF9fdTMyIF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgRkVfU0VUX0ZST05URU5EOgoJewoJCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyAqcGFyYW0gPSAmY2luZXJneXQyLT5wYXJhbTsKCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcDsKCQlpbnQgZXJyOwoKCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQoJCQlyZXR1cm4gLUVQRVJNOwoKCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsICh2b2lkICBfX3VzZXIqKSBhcmcsIHNpemVvZihwKSkpCgkJCXJldHVybiAtRUZBVUxUOwoKCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJCXBhcmFtLT5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwoJCXBhcmFtLT50cHMgPSBjcHVfdG9fbGUxNihjb21wdXRlX3RwcygmcCkpOwoJCXBhcmFtLT5mcmVxID0gY3B1X3RvX2xlMzIocC5mcmVxdWVuY3kgLyAxMDAwKTsKCQlwYXJhbS0+YmFuZHdpZHRoID0gOCAtIHAudS5vZmRtLmJhbmR3aWR0aCAtIEJBTkRXSURUSF84X01IWjsKCgkJc3RhdC0+bG9ja19iaXRzID0gMDsKCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzKys7CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnBvbGxfd3EpOwoKCQllcnIgPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsCgkJCQkJKGNoYXIgKikgcGFyYW0sIHNpemVvZigqcGFyYW0pLAoJCQkJCU5VTEwsIDApOwoKCQl1cCgmY2luZXJneXQyLT5zZW0pOwoKCQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKCX0KCgljYXNlIEZFX0dFVF9GUk9OVEVORDoKCQkvKioKCQkgKiAgdHJpdmlhbCB0byBpbXBsZW1lbnQgKHNlZSBzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZykuCgkJICogIGVxdWl2YWxlbnQgdG8gRkVfUkVBRCBpb2N0bHMsIGJ1dCBuZWVkcwoJCSAqICBUUFMgLT4gbGludXgtZHZiIHBhcmFtZXRlciBzZXQgY29udmVyc2lvbi4gRmVlbCBmcmVlCgkJICogIHRvIGltcGxlbWVudCB0aGlzIGFuZCBzZW5kIHVzIGEgcGF0Y2ggaWYgeW91IG5lZWQgdGhpcwoJCSAqICBmdW5jdGlvbmFsaXR5LgoJCSAqLwoJCWJyZWFrOwoKCWNhc2UgRkVfR0VUX0VWRU5UOgoJewoJCS8qKgoJCSAqICBmb3Igbm93IHdlIG9ubHkgZmlsbCB0aGUgc3RhdHVzIGZpZWxkLiB0aGUgcGFyYW1ldGVycwoJCSAqICBhcmUgdHJpdmlhbCB0byBmaWxsIGFzIHNvb24gRkVfR0VUX0ZST05URU5EIGlzIGRvbmUuCgkJICovCgkJc3RydWN0IGR2Yl9mcm9udGVuZF9ldmVudCBfX3VzZXIgKmUgPSAodm9pZCBfX3VzZXIgKikgYXJnOwoJCWlmIChjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID09IDApIHsKCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQoJCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNpbmVyZ3l0Mi0+cG9sbF93cSwKCQkJCQkJIGNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMgPiAwKTsKCQl9CgkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyA9IDA7CgkJcmV0dXJuIGNpbmVyZ3l0Ml9pb2N0bChpbm9kZSwgZmlsZSwgRkVfUkVBRF9TVEFUVVMsCgkJCQkJKHVuc2lnbmVkIGxvbmcpICZlLT5zdGF0dXMpOwoJfQoKCWRlZmF1bHQ6CgkJOwoJfQoKCXJldHVybiAtRUlOVkFMOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKCWludCByZXQgPSAwOwoKCWxvY2tfa2VybmVsKCk7CgoJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEUgfCBWTV9FWEVDKSkgewoJCXJldCA9IC1FUEVSTTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJaWYgKHZtYS0+dm1fZW5kID4gdm1hLT52bV9zdGFydCArIFNUUkVBTV9VUkJfQ09VTlQgKiBTVFJFQU1fQlVGX1NJWkUpIHsKCQlyZXQgPSAtRUlOVkFMOwoJCWdvdG8gYmFpbG91dDsKCX0KCgl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0RPTlRDT1BZKTsKCXZtYS0+dm1fZmlsZSA9IGZpbGU7CgoJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKCQkJICAgICAgdmlydF90b19waHlzKGNpbmVyZ3l0Mi0+c3RyZWFtYnVmKSA+PiBQQUdFX1NISUZULAoJCQkgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCgkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KSA/IC1FQUdBSU4gOiAwOwpiYWlsb3V0OgoJdW5sb2NrX2tlcm5lbCgpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2luZXJneXQyX2ZvcHMgPSB7Cgkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKCS5pb2N0bAkJPSBjaW5lcmd5dDJfaW9jdGwsCgkucG9sbCAgICAgICAgICAgPSBjaW5lcmd5dDJfcG9sbCwKCS5vcGVuICAgICAgICAgICA9IGNpbmVyZ3l0Ml9vcGVuLAoJLnJlbGVhc2UgICAgICAgID0gY2luZXJneXQyX3JlbGVhc2UsCgkubW1hcAkJPSBjaW5lcmd5dDJfbW1hcAp9OwoKc3RhdGljIHN0cnVjdCBkdmJfZGV2aWNlIGNpbmVyZ3l0Ml9mZV90ZW1wbGF0ZSA9IHsKCS51c2VycyA9IH4wLAoJLndyaXRlcnMgPSAxLAoJLnJlYWRlcnMgPSAofjApLTEsCgkuZm9wcyA9ICZjaW5lcmd5dDJfZm9wcwp9OwoKI2lmZGVmIEVOQUJMRV9SQwpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnlfcmMgKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IChzdHJ1Y3QgY2luZXJneXQyICopIGRhdGE7CgljaGFyIGJ1ZiBbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OwoJc3RydWN0IGNpbmVyZ3l0Ml9yY19ldmVudCByY19ldmVudHNbMTJdOwoJaW50IG4sIGxlbjsKCglpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuOwoKCWxlbiA9IGNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwKCQkJICAgICAoY2hhciAqKSByY19ldmVudHMsIHNpemVvZihyY19ldmVudHMpKTsKCglmb3IgKG49MDsgbGVuPjAgJiYgbjwobGVuL3NpemVvZihyY19ldmVudHNbMF0pKTsgbisrKSB7CgkJaW50IGk7CgovKgkJZHByaW50aygxLCJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsbixsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpLHJjX2V2ZW50c1tuXS50eXBlKTsqLwoKCQlpZiAocmNfZXZlbnRzW25dLnR5cGUgPT0gQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDICYmCgkJICAgIHJjX2V2ZW50c1tuXS52YWx1ZSA9PSB+MCkKCQl7CgkJCS8qKgoJCQkgKiBrZXlyZXBlYXQgYml0LiBJZiB3ZSB3b3VsZCBoYW5kbGUgdGhpcyBwcm9wZXJseQoJCQkgKiB3ZSB3b3VsZCBuZWVkIHRvIGVtaXQgZG93biBldmVudHMgYXMgbG9uZyB0aGUKCQkJICoga2V5cmVwZWF0IGdvZXMsIGEgdXAgZXZlbnQgaWYgbm8gZnVydGhlcgoJCQkgKiByZXBlYXQgYml0cyBvY2N1ci4gV291bGQgbmVlZCBhIHRpbWVyIHRvIGltcGxlbWVudAoJCQkgKiBhbmQgbm8gb3RoZXIgZHJpdmVyIGRvZXMgdGhpcywgc28gd2Ugc2ltcGx5CgkJCSAqIGVtaXQgdGhlIGxhc3Qga2V5IHVwL2Rvd24gc2VxdWVuY2UgYWdhaW4uCgkJCSAqLwoJCX0gZWxzZSB7CgkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOwoJCQlmb3IgKGk9MDsgaTxzaXplb2YocmNfa2V5cykvc2l6ZW9mKHJjX2tleXNbMF0pOyBpKz0zKSB7CgkJCQlpZiAocmNfa2V5c1tpKzBdID09IHJjX2V2ZW50c1tuXS50eXBlICYmCgkJCQkgICAgcmNfa2V5c1tpKzFdID09IGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkpCgkJCQl7CgkJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IHJjX2tleXNbaSsyXTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgIT0gS0VZX01BWCkgewoJCQlpbnB1dF9yZXBvcnRfa2V5KCZjaW5lcmd5dDItPnJjX2lucHV0X2RldiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMSk7CgkJCWlucHV0X3JlcG9ydF9rZXkoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAwKTsKCQkJaW5wdXRfc3luYygmY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOwoJCX0KCX0KCglzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywKCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSQ19RVUVSWV9JTlRFUlZBTCkpOwoKCXVwKCZjaW5lcmd5dDItPnNlbSk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IChzdHJ1Y3QgY2luZXJneXQyICopIGRhdGE7CgljaGFyIGNtZCBbXSA9IHsgQ0lORVJHWVQyX0VQMV9HRVRfVFVORVJfU1RBVFVTIH07CglzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZyAqcyA9ICZjaW5lcmd5dDItPnN0YXR1czsKCXVpbnQ4X3QgbG9ja19iaXRzOwoJdWludDMyX3QgdW5jOwoKCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm47CgoJdW5jID0gcy0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7Cglsb2NrX2JpdHMgPSBzLT5sb2NrX2JpdHM7CgoJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBjbWQsIHNpemVvZihjbWQpLCAoY2hhciAqKSBzLCBzaXplb2YoKnMpKTsKCgl1bmMgKz0gbGUzMl90b19jcHUocy0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQpOwoJcy0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQgPSB1bmM7CgoJaWYgKGxvY2tfYml0cyAhPSBzLT5sb2NrX2JpdHMpIHsKCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+cG9sbF93cSk7CgkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cysrOwoJfQoKCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLAoJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFFVRVJZX0lOVEVSVkFMKSk7CgoJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAoJCSAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDI7CglpbnQgaSwgZXJyOwoKCWlmICghKGNpbmVyZ3l0MiA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgY2luZXJneXQyKSwgR0ZQX0tFUk5FTCkpKSB7CgkJZHByaW50aygxLCAib3V0IG9mIG1lbW9yeT8hP1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0IChjaW5lcmd5dDIsIDAsIHNpemVvZiAoc3RydWN0IGNpbmVyZ3l0MikpOwoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgKHZvaWQgKikgY2luZXJneXQyKTsKCglpbml0X01VVEVYKCZjaW5lcmd5dDItPnNlbSk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkICgmY2luZXJneXQyLT5wb2xsX3dxKTsKCUlOSVRfV09SSygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBjaW5lcmd5dDJfcXVlcnksIGNpbmVyZ3l0Mik7CgoJY2luZXJneXQyLT51ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCWNpbmVyZ3l0Mi0+cGFyYW0uY21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKCglpZiAoY2luZXJneXQyX2FsbG9jX3N0cmVhbV91cmJzIChjaW5lcmd5dDIpIDwgMCkgewoJCWRwcmludGsoMSwgInVuYWJsZSB0byBhbGxvY2F0ZSBzdHJlYW0gdXJic1xuIik7CgkJa2ZyZWUoY2luZXJneXQyKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglkdmJfcmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyLCBEUklWRVJfTkFNRSwgVEhJU19NT0RVTEUpOwoKCWNpbmVyZ3l0Mi0+ZGVtdXgucHJpdiA9IGNpbmVyZ3l0MjsKCWNpbmVyZ3l0Mi0+ZGVtdXguZmlsdGVybnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5mZWVkbnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5zdGFydF9mZWVkID0gY2luZXJneXQyX3N0YXJ0X2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LnN0b3BfZmVlZCA9IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7CgoJaWYgKChlcnIgPSBkdmJfZG14X2luaXQoJmNpbmVyZ3l0Mi0+ZGVtdXgpKSA8IDApIHsKCQlkcHJpbnRrKDEsICJkdmJfZG14X2luaXQoKSBmYWlsZWQgKGVyciA9ICVkKVxuIiwgZXJyKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJY2luZXJneXQyLT5kbXhkZXYuZmlsdGVybnVtID0gY2luZXJneXQyLT5kZW11eC5maWx0ZXJudW07CgljaW5lcmd5dDItPmRteGRldi5kZW11eCA9ICZjaW5lcmd5dDItPmRlbXV4LmRteDsKCWNpbmVyZ3l0Mi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7CgoJaWYgKChlcnIgPSBkdmJfZG14ZGV2X2luaXQoJmNpbmVyZ3l0Mi0+ZG14ZGV2LCAmY2luZXJneXQyLT5hZGFwdGVyKSkgPCAwKSB7CgkJZHByaW50aygxLCAiZHZiX2RteGRldl9pbml0KCkgZmFpbGVkIChlcnIgPSAlZClcbiIsIGVycik7CgkJZ290byBiYWlsb3V0OwoJfQoKCWlmIChkdmJfbmV0X2luaXQoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZHZibmV0LCAmY2luZXJneXQyLT5kZW11eC5kbXgpKQoJCWRwcmludGsoMSwgImR2Yl9uZXRfaW5pdCgpIGZhaWxlZCFcbiIpOwoKCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZmVkZXYsCgkJCSAgICAmY2luZXJneXQyX2ZlX3RlbXBsYXRlLCBjaW5lcmd5dDIsCgkJCSAgICBEVkJfREVWSUNFX0ZST05URU5EKTsKCiNpZmRlZiBFTkFCTEVfUkMKCWluaXRfaW5wdXRfZGV2KCZjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7CgoJY2luZXJneXQyLT5yY19pbnB1dF9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwoJY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Y29kZW1heCA9IEtFWV9NQVg7CgljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5uYW1lID0gRFJJVkVSX05BTUUgIiByZW1vdGUgY29udHJvbCI7CgoJZm9yIChpPTA7IGk8c2l6ZW9mKHJjX2tleXMpL3NpemVvZihyY19rZXlzWzBdKTsgaSs9MykKCQlzZXRfYml0KHJjX2tleXNbaSsyXSwgY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Yml0KTsKCglpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKCgljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKCglJTklUX1dPUksoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5X3JjLCBjaW5lcmd5dDIpOwoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwojZW5kaWYKCXJldHVybiAwOwoKYmFpbG91dDoKCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2luZXJneXQyLT5kbXhkZXYpOwoJZHZiX2RteF9yZWxlYXNlKCZjaW5lcmd5dDItPmRlbXV4KTsKCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKCZjaW5lcmd5dDItPmFkYXB0ZXIpOwoJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMgKGNpbmVyZ3l0Mik7CglrZnJlZShjaW5lcmd5dDIpOwoJcmV0dXJuIC1FTk9NRU07Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CgoJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybjsKCiNpZmRlZiBFTkFCTEVfUkMKCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yayk7CglmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKI2VuZGlmCgoJY2luZXJneXQyLT5kZW11eC5kbXguY2xvc2UoJmNpbmVyZ3l0Mi0+ZGVtdXguZG14KTsKCWR2Yl9uZXRfcmVsZWFzZSgmY2luZXJneXQyLT5kdmJuZXQpOwoJZHZiX2RteGRldl9yZWxlYXNlKCZjaW5lcmd5dDItPmRteGRldik7CglkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwoJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGNpbmVyZ3l0Mi0+ZmVkZXYpOwoJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyKTsKCgljaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyhjaW5lcmd5dDIpOwoJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKCWtmcmVlKGNpbmVyZ3l0Mik7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwoKCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmIChzdGF0ZSA+IDApIHsJLyogc3RhdGUgMCBzZWVtcyB0byBtZWFuIERFVklDRV9QTV9PTiAqLwoJCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwojaWZkZWYgRU5BQkxFX1JDCgkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrKTsKI2VuZGlmCgkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCQlpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcpCgkJCWNpbmVyZ3l0Ml9zdG9wX3N0cmVhbV94ZmVyKGNpbmVyZ3l0Mik7CgkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKCX0KCgl1cCgmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3Jlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwoJc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnICpwYXJhbSA9ICZjaW5lcmd5dDItPnBhcmFtOwoKCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICghY2luZXJneXQyLT5zbGVlcGluZykgewoJCWNpbmVyZ3l0Ml9zbGVlcChjaW5lcmd5dDIsIDApOwoJCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgKGNoYXIgKikgcGFyYW0sIHNpemVvZigqcGFyYW0pLCBOVUxMLCAwKTsKCQlpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcpCgkJCWNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBIWi8yKTsKCX0KCiNpZmRlZiBFTkFCTEVfUkMKCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBIWi8yKTsKI2VuZGlmCgl1cCgmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjaW5lcmd5dDJfdGFibGUgW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDAzOCkgfSwKCXsgMCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgY2luZXJneXQyX3RhYmxlKTsKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjaW5lcmd5dDJfZHJpdmVyID0gewoJLm93bmVyCT0gVEhJU19NT0RVTEUsCgkubmFtZQk9ICJjaW5lcmd5VDIiLAoJLnByb2JlCT0gY2luZXJneXQyX3Byb2JlLAoJLmRpc2Nvbm5lY3QJPSBjaW5lcmd5dDJfZGlzY29ubmVjdCwKCS5zdXNwZW5kCT0gY2luZXJneXQyX3N1c3BlbmQsCgkucmVzdW1lCQk9IGNpbmVyZ3l0Ml9yZXN1bWUsCgkuaWRfdGFibGUJPSBjaW5lcmd5dDJfdGFibGUKfTsKCnN0YXRpYyBpbnQgX19pbml0IGNpbmVyZ3l0Ml9pbml0ICh2b2lkKQp7CglpbnQgZXJyOwoKCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZjaW5lcmd5dDJfZHJpdmVyKSkgPCAwKQoJCWRwcmludGsoMSwgInVzYl9yZWdpc3RlcigpIGZhaWxlZCEgKGVyciAlaSlcbiIsIGVycik7CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNpbmVyZ3l0Ml9leGl0ICh2b2lkKQp7Cgl1c2JfZGVyZWdpc3RlcigmY2luZXJneXQyX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0IChjaW5lcmd5dDJfaW5pdCk7Cm1vZHVsZV9leGl0IChjaW5lcmd5dDJfZXhpdCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkhvbGdlciBXYWVjaHRsZXIsIERhbmllbCBNYWNrIik7Cgo=