LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcnM6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICogICAgICAgICAgVmVybm9uIE1hdWVyeSA8dmVybnV4QHVzLmlibS5jb20+CiAqCiAqLwoKLyogUmVtb3RlIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KCiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgImlibWFzbS5oIgojaW5jbHVkZSAicmVtb3RlLmgiCgpzdGF0aWMgaW50IHhtYXggPSAxNjAwOwpzdGF0aWMgaW50IHltYXggPSAxMjAwOwoKCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCB4bGF0ZV9oaWdoW1hMQVRFX1NJWkVdID0gewoJW0tFWV9TWU1fRU5URVIgJiAweGZmXSA9IEtFWV9FTlRFUiwKCVtLRVlfU1lNX0tQU0xBU0ggJiAweGZmXSA9IEtFWV9LUFNMQVNILAoJW0tFWV9TWU1fS1BTVEFSICYgMHhmZl0gPSBLRVlfS1BBU1RFUklTSywKCVtLRVlfU1lNX0tQTUlOVVMgJiAweGZmXSA9IEtFWV9LUE1JTlVTLAoJW0tFWV9TWU1fS1BET1QgJiAweGZmXSA9IEtFWV9LUERPVCwKCVtLRVlfU1lNX0tQUExVUyAmIDB4ZmZdID0gS0VZX0tQUExVUywKCVtLRVlfU1lNX0tQMCAmIDB4ZmZdID0gS0VZX0tQMCwKCVtLRVlfU1lNX0tQMSAmIDB4ZmZdID0gS0VZX0tQMSwKCVtLRVlfU1lNX0tQMiAmIDB4ZmZdID0gS0VZX0tQMiwgW0tFWV9TWU1fS1BET1dOICYgMHhmZl0gPSBLRVlfS1AyLAoJW0tFWV9TWU1fS1AzICYgMHhmZl0gPSBLRVlfS1AzLAoJW0tFWV9TWU1fS1A0ICYgMHhmZl0gPSBLRVlfS1A0LCBbS0VZX1NZTV9LUExFRlQgJiAweGZmXSA9IEtFWV9LUDQsCglbS0VZX1NZTV9LUDUgJiAweGZmXSA9IEtFWV9LUDUsCglbS0VZX1NZTV9LUDYgJiAweGZmXSA9IEtFWV9LUDYsIFtLRVlfU1lNX0tQUklHSFQgJiAweGZmXSA9IEtFWV9LUDYsCglbS0VZX1NZTV9LUDcgJiAweGZmXSA9IEtFWV9LUDcsCglbS0VZX1NZTV9LUDggJiAweGZmXSA9IEtFWV9LUDgsIFtLRVlfU1lNX0tQVVAgJiAweGZmXSA9IEtFWV9LUDgsCglbS0VZX1NZTV9LUDkgJiAweGZmXSA9IEtFWV9LUDksCglbS0VZX1NZTV9CS19TUEMgJiAweGZmXSA9IEtFWV9CQUNLU1BBQ0UsCglbS0VZX1NZTV9UQUIgJiAweGZmXSA9IEtFWV9UQUIsCglbS0VZX1NZTV9DVFJMICYgMHhmZl0gPSBLRVlfTEVGVENUUkwsCglbS0VZX1NZTV9BTFQgJiAweGZmXSA9IEtFWV9MRUZUQUxULAoJW0tFWV9TWU1fSU5TRVJUICYgMHhmZl0gPSBLRVlfSU5TRVJULAoJW0tFWV9TWU1fREVMRVRFICYgMHhmZl0gPSBLRVlfREVMRVRFLAoJW0tFWV9TWU1fU0hJRlQgJiAweGZmXSA9IEtFWV9MRUZUU0hJRlQsCglbS0VZX1NZTV9VQVJST1cgJiAweGZmXSA9IEtFWV9VUCwKCVtLRVlfU1lNX0RBUlJPVyAmIDB4ZmZdID0gS0VZX0RPV04sCglbS0VZX1NZTV9MQVJST1cgJiAweGZmXSA9IEtFWV9MRUZULAoJW0tFWV9TWU1fUkFSUk9XICYgMHhmZl0gPSBLRVlfUklHSFQsCglbS0VZX1NZTV9FU0NBUEUgJiAweGZmXSA9IEtFWV9FU0MsCiAgICAgICAgW0tFWV9TWU1fUEFHRVVQICYgMHhmZl0gPSBLRVlfUEFHRVVQLAogICAgICAgIFtLRVlfU1lNX1BBR0VET1dOICYgMHhmZl0gPSBLRVlfUEFHRURPV04sCiAgICAgICAgW0tFWV9TWU1fSE9NRSAmIDB4ZmZdID0gS0VZX0hPTUUsCiAgICAgICAgW0tFWV9TWU1fRU5EICYgMHhmZl0gPSBLRVlfRU5ELAoJW0tFWV9TWU1fRjEgJiAweGZmXSA9IEtFWV9GMSwKCVtLRVlfU1lNX0YyICYgMHhmZl0gPSBLRVlfRjIsCglbS0VZX1NZTV9GMyAmIDB4ZmZdID0gS0VZX0YzLAoJW0tFWV9TWU1fRjQgJiAweGZmXSA9IEtFWV9GNCwKCVtLRVlfU1lNX0Y1ICYgMHhmZl0gPSBLRVlfRjUsCglbS0VZX1NZTV9GNiAmIDB4ZmZdID0gS0VZX0Y2LAoJW0tFWV9TWU1fRjcgJiAweGZmXSA9IEtFWV9GNywKCVtLRVlfU1lNX0Y4ICYgMHhmZl0gPSBLRVlfRjgsCglbS0VZX1NZTV9GOSAmIDB4ZmZdID0gS0VZX0Y5LAoJW0tFWV9TWU1fRjEwICYgMHhmZl0gPSBLRVlfRjEwLAoJW0tFWV9TWU1fRjExICYgMHhmZl0gPSBLRVlfRjExLAoJW0tFWV9TWU1fRjEyICYgMHhmZl0gPSBLRVlfRjEyLAoJW0tFWV9TWU1fQ0FQX0xPQ0sgJiAweGZmXSA9IEtFWV9DQVBTTE9DSywKCVtLRVlfU1lNX05VTV9MT0NLICYgMHhmZl0gPSBLRVlfTlVNTE9DSywKCVtLRVlfU1lNX1NDUl9MT0NLICYgMHhmZl0gPSBLRVlfU0NST0xMTE9DSywKfTsKc3RhdGljIHVuc2lnbmVkIHNob3J0IHhsYXRlW1hMQVRFX1NJWkVdID0gewoJW05PX0tFWUNPREVdID0gS0VZX1JFU0VSVkVELAoJW0tFWV9TWU1fU1BBQ0VdID0gS0VZX1NQQUNFLAoJW0tFWV9TWU1fVElMREVdID0gS0VZX0dSQVZFLCAgICAgICAgW0tFWV9TWU1fQktUSUNdID0gS0VZX0dSQVZFLAoJW0tFWV9TWU1fT05FXSA9IEtFWV8xLCAgICAgICAgICAgICAgW0tFWV9TWU1fQkFOR10gPSBLRVlfMSwKCVtLRVlfU1lNX1RXT10gPSBLRVlfMiwgICAgICAgICAgICAgIFtLRVlfU1lNX0FUXSA9IEtFWV8yLAoJW0tFWV9TWU1fVEhSRUVdID0gS0VZXzMsICAgICAgICAgICAgW0tFWV9TWU1fUE9VTkRdID0gS0VZXzMsCglbS0VZX1NZTV9GT1VSXSA9IEtFWV80LCAgICAgICAgICAgICBbS0VZX1NZTV9ET0xMQVJdID0gS0VZXzQsCglbS0VZX1NZTV9GSVZFXSA9IEtFWV81LCAgICAgICAgICAgICBbS0VZX1NZTV9QRVJDRU5UXSA9IEtFWV81LAoJW0tFWV9TWU1fU0lYXSA9IEtFWV82LCAgICAgICAgICAgICAgW0tFWV9TWU1fQ0FSQVRdID0gS0VZXzYsCglbS0VZX1NZTV9TRVZFTl0gPSBLRVlfNywgICAgICAgICAgICBbS0VZX1NZTV9BTVBFUl0gPSBLRVlfNywKCVtLRVlfU1lNX0VJR0hUXSA9IEtFWV84LCAgICAgICAgICAgIFtLRVlfU1lNX1NUQVJdID0gS0VZXzgsCglbS0VZX1NZTV9OSU5FXSA9IEtFWV85LCAgICAgICAgICAgICBbS0VZX1NZTV9MUEFSRU5dID0gS0VZXzksCglbS0VZX1NZTV9aRVJPXSA9IEtFWV8wLCAgICAgICAgICAgICBbS0VZX1NZTV9SUEFSRU5dID0gS0VZXzAsCglbS0VZX1NZTV9NSU5VU10gPSBLRVlfTUlOVVMsICAgICAgICBbS0VZX1NZTV9VU0NPUkVdID0gS0VZX01JTlVTLAoJW0tFWV9TWU1fRVFVQUxdID0gS0VZX0VRVUFMLCAgICAgICAgW0tFWV9TWU1fUExVU10gPSBLRVlfRVFVQUwsCglbS0VZX1NZTV9MQlJLVF0gPSBLRVlfTEVGVEJSQUNFLCAgICBbS0VZX1NZTV9MQ1VSTFldID0gS0VZX0xFRlRCUkFDRSwKCVtLRVlfU1lNX1JCUktUXSA9IEtFWV9SSUdIVEJSQUNFLCAgIFtLRVlfU1lNX1JDVVJMWV0gPSBLRVlfUklHSFRCUkFDRSwKCVtLRVlfU1lNX1NMQVNIXSA9IEtFWV9CQUNLU0xBU0gsICAgIFtLRVlfU1lNX1BJUEVdID0gS0VZX0JBQ0tTTEFTSCwKCVtLRVlfU1lNX1RJQ10gPSBLRVlfQVBPU1RST1BIRSwgICAgIFtLRVlfU1lNX1FVT1RFXSA9IEtFWV9BUE9TVFJPUEhFLAoJW0tFWV9TWU1fU0VNSUNdID0gS0VZX1NFTUlDT0xPTiwgICAgW0tFWV9TWU1fQ09MT05dID0gS0VZX1NFTUlDT0xPTiwKCVtLRVlfU1lNX0NPTU1BXSA9IEtFWV9DT01NQSwgICAgICAgIFtLRVlfU1lNX0xUXSA9IEtFWV9DT01NQSwKCVtLRVlfU1lNX1BFUklPRF0gPSBLRVlfRE9ULCAgICAgICAgIFtLRVlfU1lNX0dUXSA9IEtFWV9ET1QsCglbS0VZX1NZTV9CU0xBU0hdID0gS0VZX1NMQVNILCAgICAgICBbS0VZX1NZTV9RTUFSS10gPSBLRVlfU0xBU0gsCglbS0VZX1NZTV9BXSA9IEtFWV9BLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9hXSA9IEtFWV9BLAoJW0tFWV9TWU1fQl0gPSBLRVlfQiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fYl0gPSBLRVlfQiwKCVtLRVlfU1lNX0NdID0gS0VZX0MsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2NdID0gS0VZX0MsCglbS0VZX1NZTV9EXSA9IEtFWV9ELCAgICAgICAgICAgICAgICBbS0VZX1NZTV9kXSA9IEtFWV9ELAoJW0tFWV9TWU1fRV0gPSBLRVlfRSwgICAgICAgICAgICAgICAgW0tFWV9TWU1fZV0gPSBLRVlfRSwKCVtLRVlfU1lNX0ZdID0gS0VZX0YsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2ZdID0gS0VZX0YsCglbS0VZX1NZTV9HXSA9IEtFWV9HLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9nXSA9IEtFWV9HLAoJW0tFWV9TWU1fSF0gPSBLRVlfSCwgICAgICAgICAgICAgICAgW0tFWV9TWU1faF0gPSBLRVlfSCwKCVtLRVlfU1lNX0ldID0gS0VZX0ksICAgICAgICAgICAgICAgIFtLRVlfU1lNX2ldID0gS0VZX0ksCglbS0VZX1NZTV9KXSA9IEtFWV9KLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9qXSA9IEtFWV9KLAoJW0tFWV9TWU1fS10gPSBLRVlfSywgICAgICAgICAgICAgICAgW0tFWV9TWU1fa10gPSBLRVlfSywKCVtLRVlfU1lNX0xdID0gS0VZX0wsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2xdID0gS0VZX0wsCglbS0VZX1NZTV9NXSA9IEtFWV9NLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9tXSA9IEtFWV9NLAoJW0tFWV9TWU1fTl0gPSBLRVlfTiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fbl0gPSBLRVlfTiwKCVtLRVlfU1lNX09dID0gS0VZX08sICAgICAgICAgICAgICAgIFtLRVlfU1lNX29dID0gS0VZX08sCglbS0VZX1NZTV9QXSA9IEtFWV9QLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9wXSA9IEtFWV9QLAoJW0tFWV9TWU1fUV0gPSBLRVlfUSwgICAgICAgICAgICAgICAgW0tFWV9TWU1fcV0gPSBLRVlfUSwKCVtLRVlfU1lNX1JdID0gS0VZX1IsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3JdID0gS0VZX1IsCglbS0VZX1NZTV9TXSA9IEtFWV9TLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9zXSA9IEtFWV9TLAoJW0tFWV9TWU1fVF0gPSBLRVlfVCwgICAgICAgICAgICAgICAgW0tFWV9TWU1fdF0gPSBLRVlfVCwKCVtLRVlfU1lNX1VdID0gS0VZX1UsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3VdID0gS0VZX1UsCglbS0VZX1NZTV9WXSA9IEtFWV9WLCAgICAgICAgICAgICAgICBbS0VZX1NZTV92XSA9IEtFWV9WLAoJW0tFWV9TWU1fV10gPSBLRVlfVywgICAgICAgICAgICAgICAgW0tFWV9TWU1fd10gPSBLRVlfVywKCVtLRVlfU1lNX1hdID0gS0VZX1gsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3hdID0gS0VZX1gsCglbS0VZX1NZTV9ZXSA9IEtFWV9ZLCAgICAgICAgICAgICAgICBbS0VZX1NZTV95XSA9IEtFWV9ZLAoJW0tFWV9TWU1fWl0gPSBLRVlfWiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fel0gPSBLRVlfWiwKfTsKCnN0YXRpYyBjaGFyIHJlbW90ZV9tb3VzZV9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBtb3VzZSI7CnN0YXRpYyBjaGFyIHJlbW90ZV9rZXliZF9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBrZXlib2FyZCI7CgpzdGF0aWMgdm9pZCBwcmludF9pbnB1dChzdHJ1Y3QgcmVtb3RlX2lucHV0ICppbnB1dCkKewoJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfTU9VU0UpIHsKCQl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKCQlkYmcoInJlbW90ZSBtb3VzZSBtb3ZlbWVudDogKHgseSk9KCVkLCVkKSVzJXMlcyVzXG4iLAoJCQlpbnB1dC0+ZGF0YS5tb3VzZS54LCBpbnB1dC0+ZGF0YS5tb3VzZS55LAoJCQkoYnV0dG9ucyk/IiAtLSBidXR0b25zOiI6IiIsCgkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9MRUZUKT8ibGVmdCAiOiIiLAoJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKT8ibWlkZGxlICI6IiIsCgkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9SSUdIVCk/InJpZ2h0IjoiIgoJCSAgICAgICk7Cgl9IGVsc2UgewoJCWRiZygicmVtb3RlIGtleXByZXNzIChjb2RlLCBmbGFnLCBkb3duKToiCgkJCSAgICIlZCAoMHgleCkgWzB4JXhdIFsweCV4XVxuIiwKCQkJCWlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9jb2RlLAoJCQkJaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2NvZGUsCgkJCQlpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfZmxhZywKCQkJCWlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duCgkJICAgICAgKTsKCX0KfQoKc3RhdGljIHZvaWQgc2VuZF9tb3VzZV9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAoJCXN0cnVjdCByZW1vdGVfaW5wdXQgKmlucHV0KQp7Cgl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKCglpbnB1dF9yZWdzKGRldiwgcmVncyk7CglpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIGlucHV0LT5kYXRhLm1vdXNlLngpOwoJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBpbnB1dC0+ZGF0YS5tb3VzZS55KTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTEVGVCk7CglpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGJ1dHRvbnMgJiBSRU1PVEVfQlVUVE9OX1JJR0hUKTsKCWlucHV0X3N5bmMoZGV2KTsKfQoKc3RhdGljIHZvaWQgc2VuZF9rZXlib2FyZF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAoJCXN0cnVjdCByZW1vdGVfaW5wdXQgKmlucHV0KQp7Cgl1bnNpZ25lZCBpbnQga2V5OwoJdW5zaWduZWQgc2hvcnQgY29kZSA9IGlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9jb2RlOwoKCWlmIChjb2RlICYgMHhmZjAwKQoJCWtleSA9IHhsYXRlX2hpZ2hbY29kZSAmIDB4ZmZdOwoJZWxzZQoJCWtleSA9IHhsYXRlW2NvZGVdOwoJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwoJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleSwgKGlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duKSA/IDEgOiAwKTsKCWlucHV0X3N5bmMoZGV2KTsKfQoKdm9pZCBpYm1hc21faGFuZGxlX21vdXNlX2ludGVycnVwdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLAoJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQp7Cgl1bnNpZ25lZCBsb25nIHJlYWRlcjsKCXVuc2lnbmVkIGxvbmcgd3JpdGVyOwoJc3RydWN0IHJlbW90ZV9pbnB1dCBpbnB1dDsKCglyZWFkZXIgPSBnZXRfcXVldWVfcmVhZGVyKHNwKTsKCXdyaXRlciA9IGdldF9xdWV1ZV93cml0ZXIoc3ApOwoKCXdoaWxlIChyZWFkZXIgIT0gd3JpdGVyKSB7CgkJbWVtY3B5X2Zyb21pbygmaW5wdXQsIGdldF9xdWV1ZV9lbnRyeShzcCwgcmVhZGVyKSwKCQkJCXNpemVvZihzdHJ1Y3QgcmVtb3RlX2lucHV0KSk7CgoJCXByaW50X2lucHV0KCZpbnB1dCk7CgkJaWYgKGlucHV0LnR5cGUgPT0gSU5QVVRfVFlQRV9NT1VTRSkgewoJCQlzZW5kX21vdXNlX2V2ZW50KHNwLT5yZW1vdGUubW91c2VfZGV2LCByZWdzLCAmaW5wdXQpOwoJCX0gZWxzZSBpZiAoaW5wdXQudHlwZSA9PSBJTlBVVF9UWVBFX0tFWUJPQVJEKSB7CgkJCXNlbmRfa2V5Ym9hcmRfZXZlbnQoc3AtPnJlbW90ZS5rZXliZF9kZXYsIHJlZ3MsICZpbnB1dCk7CgkJfSBlbHNlCgkJCWJyZWFrOwoKCQlyZWFkZXIgPSBhZHZhbmNlX3F1ZXVlX3JlYWRlcihzcCwgcmVhZGVyKTsKCQl3cml0ZXIgPSBnZXRfcXVldWVfd3JpdGVyKHNwKTsKCX0KfQoKaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJLyogc2V0IHVwIHRoZSBtb3VzZSBpbnB1dCBkZXZpY2UgKi8KCXN0cnVjdCBpbnB1dF9kZXYgKm1vdXNlX2RldiwgKmtleWJkX2RldjsKCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihzcC0+ZGV2KTsKCWludCBlcnJvciA9IC1FTk9NRU07CglpbnQgaTsKCglzcC0+cmVtb3RlLm1vdXNlX2RldiA9IG1vdXNlX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJc3AtPnJlbW90ZS5rZXliZF9kZXYgPSBrZXliZF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKCglpZiAoIW1vdXNlX2RldiB8fCAha2V5YmRfZGV2KQoJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlczsKCgltb3VzZV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwoJbW91c2VfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7Cgltb3VzZV9kZXYtPmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7Cgltb3VzZV9kZXYtPmlkLnZlcnNpb24gPSAxOwoJbW91c2VfZGV2LT5ldmJpdFswXSAgPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOwoJbW91c2VfZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTEVGVCkgfAoJCUJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOwoJc2V0X2JpdChCVE5fVE9VQ0gsIG1vdXNlX2Rldi0+a2V5Yml0KTsKCW1vdXNlX2Rldi0+bmFtZSA9IHJlbW90ZV9tb3VzZV9uYW1lOwoJaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWCwgMCwgeG1heCwgMCwgMCk7CglpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19ZLCAwLCB5bWF4LCAwLCAwKTsKCgltb3VzZV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwoJa2V5YmRfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CglrZXliZF9kZXYtPmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7Cgltb3VzZV9kZXYtPmlkLnZlcnNpb24gPSAyOwoJa2V5YmRfZGV2LT5ldmJpdFswXSAgPSBCSVQoRVZfS0VZKTsKCWtleWJkX2Rldi0+bmFtZSA9IHJlbW90ZV9rZXliZF9uYW1lOwoKCWZvciAoaSA9IDA7IGkgPCBYTEFURV9TSVpFOyBpKyspIHsKCQlpZiAoeGxhdGVfaGlnaFtpXSkKCQkJc2V0X2JpdCh4bGF0ZV9oaWdoW2ldLCBrZXliZF9kZXYtPmtleWJpdCk7CgkJaWYgKHhsYXRlW2ldKQoJCQlzZXRfYml0KHhsYXRlW2ldLCBrZXliZF9kZXYtPmtleWJpdCk7Cgl9CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobW91c2VfZGV2KTsKCWlmIChlcnJvcikKCQlnb3RvIGVycl9mcmVlX2RldmljZXM7CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5YmRfZGV2KTsKCWlmIChlcnJvcikKCQlnb3RvIGVycl91bnJlZ2lzdGVyX21vdXNlX2RldjsKCgllbmFibGVfbW91c2VfaW50ZXJydXB0cyhzcCk7CgoJcHJpbnRrKEtFUk5fSU5GTyAiaWJtYXNtIHJlbW90ZSByZXNwb25kaW5nIHRvIGV2ZW50cyBvbiBSU0EgY2FyZCAlZFxuIiwgc3AtPm51bWJlcik7CgoJcmV0dXJuIDA7CgogZXJyX3VucmVnaXN0ZXJfbW91c2VfZGV2OgoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobW91c2VfZGV2KTsKCW1vdXNlX2RldiA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IHRyeSB0byBmcmVlIGl0IGFnYWluIGJlbG93ICovCiBlcnJfZnJlZV9kZXZpY2VzOgoJaW5wdXRfZnJlZV9kZXZpY2UobW91c2VfZGV2KTsKCWlucHV0X2ZyZWVfZGV2aWNlKGtleWJkX2Rldik7CgoJcmV0dXJuIGVycm9yOwp9Cgp2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJZGlzYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwLT5yZW1vdGUubW91c2VfZGV2KTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwLT5yZW1vdGUua2V5YmRfZGV2KTsKfQoK