ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9MSUNFTlNFLnFsYTN4eHggYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTElDRU5TRS5xbGEzeHh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjA3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTElDRU5TRS5xbGEzeHh4CkBAIC0wLDAgKzEsNDYgQEAKK0NvcHlyaWdodCAoYykgIDIwMDMtMjAwNiBRTG9naWMgQ29ycG9yYXRpb24KK1FMb2dpYyBMaW51eCBOZXR3b3JraW5nIEhCQSBEcml2ZXIKKworVGhpcyBwcm9ncmFtIGluY2x1ZGVzIGEgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42IHRoYXQgbWF5IGJlCitkaXN0cmlidXRlZCB3aXRoIFFMb2dpYyBoYXJkd2FyZSBzcGVjaWZpYyBmaXJtd2FyZSBiaW5hcnkgZmlsZS4KK1lvdSBtYXkgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlIGRldmljZSBkcml2ZXIgY29kZSB1bmRlciB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiAodmVyc2lvbiAyIG9yIGEgbGF0ZXIgdmVyc2lvbikuCisKK1lvdSBtYXkgcmVkaXN0cmlidXRlIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaXJtd2FyZSBiaW5hcnkgZmlsZQordW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKKworCTEuIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIChvbmx5IGlmIGFwcGxpY2FibGUpLAorCSAgIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKKwkgICBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKwkyLiBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKwkgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisJICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisJICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworCTMuIFRoZSBuYW1lIG9mIFFMb2dpYyBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8KKwkgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKwkgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorCitSRUdBUkRMRVNTIE9GIFdIQVQgTElDRU5TSU5HIE1FQ0hBTklTTSBJUyBVU0VEIE9SIEFQUExJQ0FCTEUsCitUSElTIFBST0dSQU0gSVMgUFJPVklERUQgQlkgUUxPR0lDIENPUlBPUkFUSU9OICJBUyBJUycnIEFORCBBTlkKK0VYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKK1RPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKK09SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworVVNFUiBBQ0tOT1dMRURHRVMgQU5EIEFHUkVFUyBUSEFUIFVTRSBPRiBUSElTIFBST0dSQU0gV0lMTCBOT1QKK0NSRUFURSBPUiBHSVZFIEdST1VORFMgRk9SIEEgTElDRU5TRSBCWSBJTVBMSUNBVElPTiwgRVNUT1BQRUwsIE9SCitPVEhFUldJU0UgSU4gQU5ZIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgKFBBVEVOVCwgQ09QWVJJR0hULAorVFJBREUgU0VDUkVULCBNQVNLIFdPUkssIE9SIE9USEVSIFBST1BSSUVUQVJZIFJJR0hUKSBFTUJPRElFRCBJTgorQU5ZIE9USEVSIFFMT0dJQyBIQVJEV0FSRSBPUiBTT0ZUV0FSRSBFSVRIRVIgU09MRUxZIE9SIElOCitDT01CSU5BVElPTiBXSVRIIFRISVMgUFJPR1JBTS4KKwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBjMDRjMjVlLi5kMTNmOTg1IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMjM2Niw2ICsyMzY2LDEyIEBACiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKK1FMT0dJQyBRTEEzWFhYIE5FVFdPUksgRFJJVkVSCitQOglSb24gTWVyY2VyCitNOglsaW51eC1kcml2ZXJAcWxvZ2ljLmNvbQorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIFFOWDQgRklMRVNZU1RFTQogUDoJQW5kZXJzIExhcnNlbgogTToJYWxAYWxhcnNlbi5uZXQKQEAgLTI5MDEsOCArMjkwNyw4IEBACiBTOglNYWludGFpbmVkCiAKIFRVTElQIE5FVFdPUksgRFJJVkVSCi1QOglKZWZmIEdhcnppawotTToJamdhcnppa0Bwb2JveC5jb20KK1A6CVZhbGVyaWUgSGVuc29uCitNOgl2YWxfaGVuc29uQGxpbnV4LmludGVsLmNvbQogTDoJdHVsaXAtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLwogUzoJTWFpbnRhaW5lZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYwppbmRleCAwZGU2MzlkLi4wNDY2MWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBvd2VyLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jCmluZGV4IGUyYTIyMzAuLmEyOWIzYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBvd2VyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcG93ZXIuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCAyNzNlMDVmLi4wZWFkZWM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw3IEBACiAKICMgUzNDMjQxMiBzdXBwb3J0CiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpCSs9IHMzYzI0MTIubworb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEyKQkrPSBzM2MyNDEyLWlycS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpCSs9IHMzYzI0MTItY2xvY2subwogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmgKaW5kZXggYjBlZDlkMi4uYmU0MmU0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2NwdS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuaApAQCAtOCwxNiArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgICAgMjQtQXVnLTIwMDQgQkpEICBTdGFydCBvZiBnZW5lcmljIFMzQzI0WFggc3VwcG9ydAotICogICAgIDE4LU9jdC0yMDA0IEJKRCAgTW92ZWQgYm9hcmQgc3RydWN0IGludG8gdGhpcyBmaWxlCi0gKiAgICAgMDQtSmFuLTIwMDUgQkpEICBOZXcgdWFydCBpbml0aWFsaXNhdGlvbgotICogICAgIDEwLUphbi0yMDA1IEJKRCAgTW92ZWQgZ2VuZXJpYyBpbml0IGhlcmUsIHNwZWNpZmljIHRvIGNwdSBoZWFkZXJzCi0gKiAgICAgMTQtSmFuLTIwMDUgQkpEICBBZGRlZCBzM2MyNHh4X2luaXRfY2xvY2tzKCkgY2FsbAotICogICAgIDEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX3tWQSxTWn0gdG8gUzNDMjRYWF97VkEsU1p9ICYgSU9ERVNDX0VOVAotICogICAgIDE0LU1hci0yMDA1IEJKRCAgVXBkYXRlZCBmb3IgX19pb21lbQotICogICAgIDE1LUphbi0yMDA2IExDVlIgVXBkYXRlZCBTM0MyNDEwX1BBXyMjeCB0byBuZXcgUzNDMjRYWF9QQV8jI3ggbWFjcm8KICovCiAKIC8qIHRvZG8gLSBmaXggd2hlbiBybWsgY2hhbmdlcyBpb2Rlc2NzIHRvIHVzZSBgdm9pZCBfX2lvbWVtICpgICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYwppbmRleCBhZDM4NDVlLi5jYWUzNWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKQEAgLTEsMjIgKzEsMTQgQEAKIC8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogQmFzZSBTM0MyNDEwIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucworICogQmFzZSBTM0MyNFhYIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucwogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTW9kaWZpY2F0aW9uczoKLSAqICAgICAxNS1KYW4tMjAwNiBMQ1ZSIFVzaW5nIFMzQzI0WFhfUEFfIyN4IG1hY3JvIGZvciBjb21tb24gUzNDMjRYWCBkZXZpY2VzCi0gKiAgICAgMTAtTWFyLTIwMDUgTENWUiBDaGFuZ2VkIFMzQzI0MTBfe1ZBLFNafSB0byBTM0MyNFhYX3tWQSxTWn0KLSAqICAgICAxMC1GZWItMjAwNSBCSkQgIEFkZGVkIGNhbWVyYSBmcm9tIGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2Ci0gKiAgICAgMjktQXVnLTIwMDQgQkpEICBBZGRlZCB0aW1lcnMgMCB0aHJvdWdoIDMKLSAqICAgICAyOS1BdWctMjAwNCBCSkQgIENoYW5nZWQgaW5kZXggb2YgZGV2aWNlcyB3ZSBvbmx5IGhhdmUgb25lIG9mIHRvIC0xCi0gKiAgICAgMjEtQXVnLTIwMDQgQkpEICBBZGRlZCBJUlFfVElDSyB0byBSVEMgcmVzb3VyY2VzCi0gKiAgICAgMTgtQXVnLTIwMDQgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmluZGV4IDY4MjJkYzcuLmNkNjEzOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHVuc2lnbmVkIGxvbmcgczNjX2lycXdha2VfZWludGFsbG93CT0gMHgwMDAwZmZmMEw7CiB1bnNpZ25lZCBsb25nIHMzY19pcnF3YWtlX2VpbnRtYXNrCT0gMHhmZmZmZmZmZkw7CiAKLXN0YXRpYyBpbnQKK2ludAogczNjX2lycV93YWtlKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgaXJxYml0ID0gMSA8PCAoaXJxbm8gLSBJUlFfRUlOVDApOwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJczNjX2lycV91bm1hc2soKGlycW5vIDw9IChJUlFfRUlOVDcgLSBFWFRJTlRfT0ZGKSkgPyBJUlFfRUlOVDR0NyA6IElSUV9FSU5UOHQyMyk7CiB9CiAKLXN0YXRpYyBpbnQKK2ludAogczNjX2lycWV4dF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQogewogCXZvaWQgX19pb21lbSAqZXh0aW50X3JlZzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuaAppbmRleCA0YWJmMGNhLi5mN2NjNGM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5oCkBAIC05NywzICs5Nyw4IEBACiAJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7CiAJfQogfQorCisvKiBleHBvcnRlZCBmb3IgdXNlIGluIGFyY2gvYXJtL21hY2gtczNjMjQxMCAqLworCitleHRlcm4gaW50IHMzY19pcnFfd2FrZSh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBzdGF0ZSk7CitleHRlcm4gaW50IHMzY19pcnFleHRfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKaW5kZXggOTQ3MjM0ZC4uMjk2OGZiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwpAQCAtOCwzMSArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgICAgMTQtU2VwLTIwMDQgQkpEICBVU0IgcG93ZXIgY29udHJvbAotICogICAgIDIwLUF1Zy0yMDA0IEJKRCAgQWRkZWQgczNjMjQxMF9ib2FyZCBzdHJ1Y3QKLSAqICAgICAxOC1BdWctMjAwNCBCSkQgIEFkZGVkIHBsYXRmb3JtIGRldmljZXMgZnJvbSBkZWZhdWx0IHNldAotICogICAgIDE2LU1heS0yMDAzIEJKRCAgQ3JlYXRlZCBpbml0aWFsIHZlcnNpb24KLSAqICAgICAxNi1BdWctMjAwMyBCSkQgIEZpeGVkIGhlYWRlciBmaWxlcyBhbmQgY29weXJpZ2h0LCBhZGRlZCBVUkwKLSAqICAgICAwNS1TZXAtMjAwMyBCSkQgIE1vdmVkIHRvIHYyLjYga2VybmVsCi0gKiAgICAgMDYtSmFuLTIwMDMgQkpEICBVcGRhdGVzIGZvciA8YXJjaC9tYXAuaD4KLSAqICAgICAxOC1KYW4tMjAwMyBCSkQgIEFkZGVkIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24KLSAqICAgICAwNS1PY3QtMjAwNCBCSkQgIFBvd2VyIG1hbmFnZW1lbnQgY29kZQotICogICAgIDA0LU5vdi0yMDA0IEJKRCAgVXBkYXRlZCBzZXJpYWwgcG9ydCBjbG9ja3MKLSAqICAgICAwNC1KYW4tMjAwNSBCSkQgIE5ldyB1YXJ0IGluaXQgY2FsbAotICogICAgIDEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBpbmNsdWRlIG9mIHMzYzI0MTAuaAotICogICAgIDE0LUphbi0yMDA1IEJKRCAgQWRkIHN1cHBvcnQgZm9yIG11aXRscGxlIE5BTkQgZGV2aWNlcwotICogICAgIDAzLU1hci0yMDA1IEJKRCAgRW5zdXJlZCB0aGF0IGJhc3QtY3BsZC5oIGlzIGluY2x1ZGVkCi0gKiAgICAgMTAtTWFyLTIwMDUgTENWUiBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQotICogICAgIDE0LU1hci0yMDA1IEJKRCAgVXBkYXRlZCBmb3IgX19pb21lbSBjaGFuZ2VzCi0gKiAgICAgMjItSnVuLTIwMDUgQkpEICBBZGRlZCBETTkwMDAgcGxhdGZvcm0gaW5mb3JtYXRpb24KLSAqICAgICAyOC1KdW4tMjAwNSBCSkQgIE1vdmVkIHBtIGZ1bmN0aW9uYWxpdHkgb3V0IHRvIGNvbW1vbiBjb2RlCi0gKiAgICAgMTctSnVsLTIwMDUgQkpEICBDaGFuZ2VkIHRvIHBsYXRmb3JtIGRldmljZSBmb3IgU3VwZXJJTyAxNjU1MHMKLSAqICAgICAyNS1KdWwtMjAwNSBCSkQgIFJlbW92ZWQgQVNJWCBzdGF0aWMgbWFwcGluZ3MKLSAqICAgICAyNy1KdWwtMjAwNSBCSkQgIEVuc3VyZSBtYXhpbXVtIGZyZXF1ZW5jeSBvZiBpMmMgYnVzCi0gKiAgICAgMjAtU2VwLTIwMDUgQkpEICBBZGRlZCBzdGF0aWMgdG8gbm9uLWV4cG9ydGVkIGl0ZW1zCi0gKiAgICAgMjYtT2N0LTIwMDUgQkpEICBBZGRlZCBGQiBwbGF0Zm9ybSBkYXRhCiAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCBhZWM0MzFiLi44Yzg5NWMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTksMjMgKzksNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgICAgMTYtTWF5LTIwMDMgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgotICogICAgIDE2LUF1Zy0yMDAzIEJKRCAgRml4ZWQgaGVhZGVyIGZpbGVzIGFuZCBjb3B5cmlnaHQsIGFkZGVkIFVSTAotICogICAgIDA1LVNlcC0yMDAzIEJKRCAgTW92ZWQgdG8gdjIuNiBrZXJuZWwKLSAqICAgICAwNi1KYW4tMjAwMyBCSkQgIFVwZGF0ZXMgZm9yIDxhcmNoL21hcC5oPgotICogICAgIDE4LUphbi0yMDAzIEJKRCAgQWRkZWQgc2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbgotICogICAgIDE3LUZlYi0yMDAzIEJKRCAgQ29waWVkIHRvIG1hY2gtaXBhcS5jCi0gKiAgICAgMjEtQXVnLTIwMDQgQkpEICBBZGRlZCBzdHJ1Y3QgczNjMjQxMF9ib2FyZAotICogICAgIDA0LVNlcC0yMDA0IEJKRCAgQ2hhbmdlZCB1YXJ0IGluaXQsIHJlbmFtZWQgaXBhcV8gLT4gaDE5NDBfCi0gKiAgICAgMTgtT2N0LTIwMDQgQkpEICBVcGRhdGVkIG5ldyBib2FyZCBzdHJ1Y3R1cmUgbmFtZQotICogICAgIDA0LU5vdi0yMDA0IEJKRCAgQ2hhbmdlIGZvciBuZXcgc2VyaWFsIGNsb2NrCi0gKiAgICAgMDQtSmFuLTIwMDUgQkpEICBVcGRhdGVkIHVhcnQgaW5pdCBjYWxsCi0gKiAgICAgMTAtSmFuLTIwMDUgQkpEICBSZW1vdmVkIGluY2x1ZGUgb2YgczNjMjQxMC5oCi0gKiAgICAgMTQtSmFuLTIwMDUgQkpEICBBZGRlZCBjbG9jayBpbml0Ci0gKiAgICAgMTAtTWFyLTIwMDUgTENWUiBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQotICogICAgIDIwLVNlcC0yMDA1IEJKRCAgQWRkZWQgc3RhdGljIHRvIG5vbi1leHBvcnRlZCBpdGVtcwotICogICAgIDI2LU9jdC0yMDA1IEJKRCAgQ2hhbmdlZCBuYW1lIG9mIGZiIGluaXQgY2FsbAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYwppbmRleCAzMDZhZmMxLi4yM2Q3YzA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYwpAQCAtOSwxNSArOSw2IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTW9kaWZpY2F0aW9uczoKLSAqCTE2LVNlcC0yMDA0IEJKRCAgQ29waWVkIGZyb20gbWFjaC1oMTk0MC5jCi0gKgkyNS1PY3QtMjAwNCBCSkQgIFVwZGF0ZXMgZm9yIDIuNi4xMC1yYzEKLSAqCTEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBpbmNsdWRlIG9mIHMzYzI0MTAuaCBzM2MyNDQwLmgKLSAqCTE0LUphbi0yMDA1IEJKRCAgQWRkZWQgbmV3IGNsb2NrIGluaXQKLSAqCTEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKLSAqCTE0LU1hci0yMDA1IEJKRCAgRml4ZWQgX19pb21lbSB3YXJuaW5ncwotICoJMjAtU2VwLTIwMDUgQkpEICBBZGRlZCBzdGF0aWMgdG8gbm9uLWV4cG9ydGVkIGl0ZW1zCi0gKgkzMS1PY3QtMjAwNSBCSkQgIEFkZGVkIExDRCBzZXR1cCBmb3IgZnJhbWVidWZmZXIKICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCmluZGV4IDI1ZjdlOWYuLmIzYjAxNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYwpAQCAtMjcsMTAgKzI3LDYgQEAKICAqIGRlcml2ZWQgZnJvbSBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMsIHdyaXR0ZW4gYnkKICAqIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCi0gKiAxMC1NYXItMjAwNSBMQ1ZSICBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQotICogMjAtU2VwLTIwMDUgQkpEICAgQWRkZWQgc3RhdGljIHRvIG5vbi1leHBvcnRlZCBpdGVtcwotICogMDEtQXByLTIwMDYgQkpEICAgTW92ZWQgaW5pdCBjb2RlIHRvIGNvbW1vbiBzbWRrCi0gKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTMuYwppbmRleCBiN2VmN2QzLi4zYTRjYTdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEzLmMKQEAgLTExMiw3ICsxMTIsMjAgQEAKIAlzbWRrX21hY2hpbmVfaW5pdCgpOwogfQogCi1NQUNISU5FX1NUQVJUKFMzQzI0MTMsICJTTURLMjQxMyIpCitNQUNISU5FX1NUQVJUKFMzQzI0MTMsICJTM0MyNDEzIikKKwkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+ICovCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKworCS5maXh1cAkJPSBzbWRrMjQxM19maXh1cCwKKwkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gc21kazI0MTNfbWFwX2lvLAorCS5pbml0X21hY2hpbmUJPSBzbWRrMjQxM19tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAorTUFDSElORV9FTkQKKworTUFDSElORV9TVEFSVChTTURLMjQxMywgIlNNREsyNDEzIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+ICovCiAJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwppbmRleCBkMThlZmIyLi5hMGQ3NjkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwpAQCAtMTAsMjUgKzEwLDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBNb2RpZmljYXRpb25zOgotICogICAgIDE0LVNlcC0yMDA0IEJKRCAgVVNCIFBvd2VyIGNvbnRyb2wKLSAqICAgICAwNC1TZXAtMjAwNCBCSkQgIEFkZGVkIG5ldyB1YXJ0IGluaXQsIGFuZCBpbyBpbml0Ci0gKiAgICAgMjEtQXVnLTIwMDQgQkpEICBBZGRlZCBzdHJ1Y3QgczNjMjQxMF9ib2FyZAotICogICAgIDA2LUF1Zy0yMDA0IEJKRCAgRml4ZWQgY2FsbCB0byB0aW1lIGluaXRpYWxpc2F0aW9uCi0gKiAgICAgMDUtQXByLTIwMDQgQkpEICBDb3BpZWQgdG8gbWFrZSBtYWNoLXZyMTAwMC5jCi0gKiAgICAgMTgtT2N0LTIwMDQgQkpEICBVcGRhdGVkIGJvYXJkIHN0cnVjdAotICogICAgIDA0LU5vdi0yMDA0IEJKRCAgQ2xvY2sgYW5kIHNlcmlhbCBjb25maWd1cmF0aW9uIHVwZGF0ZQotICoKLSAqICAgICAwNC1KYW4tMjAwNSBCSkQgIFVwZGF0ZWQgdWFydCBpbml0IGNhbGwKLSAqICAgICAxMC1KYW4tMjAwNSBCSkQgIFJlbW92ZWQgaW5jbHVkZSBvZiBzM2MyNDEwLmgKLSAqICAgICAxNC1KYW4tMjAwNSBCSkQgIEFkZGVkIGNsb2NrIGluaXQKLSAqICAgICAxNS1KYW4tMjAwNSBCSkQgIEFkZCBzZXJpYWwgcG9ydCBkZXZpY2UgZGVmaW5pdGlvbgotICogICAgIDIwLUphbi0yMDA1IEJKRCAgVXNlIFVQRl9JT1JFTUFQIGZvciBwb3J0cwotICogICAgIDEwLUZlYi0yMDA1IEJKRCAgQWRkZWQgcG93ZXItb2ZmIGNhcGFiaWxpdHkKLSAqICAgICAxMC1NYXItMjAwNSBMQ1ZSIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCi0gKiAgICAgMTQtTWFyLTIwMDYgQkpEICB2b2lkIF9faW9tZW0gZml4ZXMKLSAqICAgICAyMi1KdW4tMjAwNiBCSkQgIEFkZGVkIERNOTAwMCBwbGF0Zm9ybSBpbmZvcm1hdGlvbgotICogICAgIDIwLVNlcC0yMDA1IEJKRCAgQWRkZWQgc3RhdGljIHRvIG5vbi1leHBvcnRlZCBpdGVtcwogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MDAtZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MDAtZ3Bpby5jCmluZGV4IDUxMjdmMzkuLmYyYTc4MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDAwLWdwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQwMC1ncGlvLmMKQEAgLTE3LDEwICsxNyw3IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKiBDaGFuZ2Vsb2cKLSAqCTE1LUphbi0yMDA2ICBMQ1ZSICBTcGxpdHRlZCBmcm9tIGdwaW8uYywgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBTM0MyNDAwCi0gKi8KKyovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuaAppbmRleCA3M2YxYTI0Li5mYmVkMDg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmgKQEAgLTksMTQgKzksNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgICAgMTgtQXVnLTIwMDQgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgotICogICAgIDIwLUF1Zy0yMDA0IEJKRCAgQWRkZWQgczNjMjQxMF9ib2FyZCBzdHJ1Y3QKLSAqICAgICAwNC1TZXAtMjAwNCBCSkQgIEFkZGVkIHMzYzI0MTBfaW5pdF91YXJ0cygpIGNhbGwKLSAqICAgICAxNy1PY3QtMjAwNCBCSkQgIE1vdmVkIGJvYXJkIG91dCB0byBjcHUKLSAqICAgICAwNC1KYW4tMjAwNSBCSkQgIENoYW5nZWQgdWFydCBpbml0Ci0gKiAgICAgMTAtSmFuLTIwMDUgQkpEICBSZW1vdmVkIHRpbWVyIHRvIGNwdS5oLCBtb3ZlZCAyNDEwIHNwZWNpZmljIGJpdHMgaGVyZQotICogICAgIDE0LUphbi0yMDA1IEJKRCAgQWRkZWQgczNjMjQxMF9pbml0X2Nsb2NrcyBjYWxsCiAqLwogCiAjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGVjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi1pcnEuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3MzYzI0MTItaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJpcnEuaCIKKworLyogdGhlIHMzYzI0MTIgY2hhbmdlcyB0aGUgYmVoYXZpb3VyIG9mIElSUV9FSU5UMCB0aHJvdWdoIElSUV9FSU5UMyBieQorICogaGF2aW5nIHRoZW0gdHVybiB1cCBpbiBib3RoIHRoZSBJTlQqIGFuZCB0aGUgRUlOVCogcmVnaXN0ZXJzLiBXaGlsc3QKKyAqIGJvdGggc2hvdyB0aGUgc3RhdHVzLCB0aGV5IGJvdGggbm93IG5lZWQgdG8gYmUgYWNrZWQgd2hlbiB0aGUgSVJRcworICogZ28gb2ZmLgorKi8KKworc3RhdGljIHZvaWQKK3MzYzI0MTJfaXJxX21hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXVuc2lnbmVkIGxvbmcgYml0dmFsID0gMVVMIDw8IChpcnFubyAtIElSUV9FSU5UMCk7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKwlfX3Jhd193cml0ZWwobWFzayB8IGJpdHZhbCwgUzNDMjQxMF9JTlRNU0spOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTJfRUlOVE1BU0spOworCV9fcmF3X3dyaXRlbChtYXNrIHwgYml0dmFsLCBTM0MyNDEyX0VJTlRNQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzM2MyNDEyX2lycV9hY2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXVuc2lnbmVkIGxvbmcgYml0dmFsID0gMVVMIDw8IChpcnFubyAtIElSUV9FSU5UMCk7CisKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEyX0VJTlRQRU5EKTsKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEwX1NSQ1BORCk7CisJX19yYXdfd3JpdGVsKGJpdHZhbCwgUzNDMjQxMF9JTlRQTkQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3MzYzI0MTJfaXJxX21hc2thY2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXVuc2lnbmVkIGxvbmcgYml0dmFsID0gMVVMIDw8IChpcnFubyAtIElSUV9FSU5UMCk7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKwlfX3Jhd193cml0ZWwobWFza3xiaXR2YWwsIFMzQzI0MTBfSU5UTVNLKTsKKworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0VJTlRNQVNLKTsKKwlfX3Jhd193cml0ZWwobWFzayB8IGJpdHZhbCwgUzNDMjQxMl9FSU5UTUFTSyk7CisKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEyX0VJTlRQRU5EKTsKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEwX1NSQ1BORCk7CisJX19yYXdfd3JpdGVsKGJpdHZhbCwgUzNDMjQxMF9JTlRQTkQpOworfQorCitzdGF0aWMgdm9pZAorczNjMjQxMl9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwl1bnNpZ25lZCBsb25nIGJpdHZhbCA9IDFVTCA8PCAoaXJxbm8gLSBJUlFfRUlOVDApOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0VJTlRNQVNLKTsKKwlfX3Jhd193cml0ZWwobWFzayAmIH5iaXR2YWwsIFMzQzI0MTJfRUlOVE1BU0spOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKwlfX3Jhd193cml0ZWwobWFzayAmIH5iaXR2YWwsIFMzQzI0MTBfSU5UTVNLKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzYzI0MTJfaXJxX2VpbnQwdDQgPSB7CisJLmFjawkgICA9IHMzYzI0MTJfaXJxX2FjaywKKwkubWFzawkgICA9IHMzYzI0MTJfaXJxX21hc2ssCisJLnVubWFzawkgICA9IHMzYzI0MTJfaXJxX3VubWFzaywKKwkuc2V0X3dha2UgID0gczNjX2lycV93YWtlLAorCS5zZXRfdHlwZSAgPSBzM2NfaXJxZXh0X3R5cGUsCit9OworCitzdGF0aWMgaW50IHMzYzI0MTJfaXJxX2FkZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQoreworCXVuc2lnbmVkIGludCBpcnFubzsKKworCWZvciAoaXJxbm8gPSBJUlFfRUlOVDA7IGlycW5vIDw9IElSUV9FSU5UMzsgaXJxbm8rKykgeworCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2MyNDEyX2lycV9laW50MHQ0KTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjMjQxMl9pcnFfZHJpdmVyID0geworCS5hZGQJCT0gczNjMjQxMl9pcnFfYWRkLAorfTsKKworc3RhdGljIGludCBzM2MyNDEyX2lycV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTJfc3lzY2xhc3MsICZzM2MyNDEyX2lycV9kcml2ZXIpOworfQorCithcmNoX2luaXRjYWxsKHMzYzI0MTJfaXJxX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1pcnEuYwppbmRleCBhY2ZlMzg3Li4xNjY3YmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1pcnEuYwpAQCAtMTcsOSArMTcsNiBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgkyNS1KdWwtMjAwNSBCSkQJCVNwbGl0IGZyb20gaXJxLmMKLSAqCiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NHgtaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0eC1pcnEuYwppbmRleCAyYWFkY2ExLi40NGM1YWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0eC1pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0eC1pcnEuYwpAQCAtMTcsOSArMTcsNiBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgkyNS1KdWwtMjAwNSBCSkQJCVNwbGl0IGZyb20gaXJxLmMKLSAqCiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTIyLDIxICsxMTksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0NHhfaXJxX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDQwX2lycV9kcml2ZXIgPSB7CiAJLmFkZAk9IHMzYzI0NHhfaXJxX2FkZCwKIH07CiAKIHN0YXRpYyBpbnQgczNjMjQ0MF9pcnFfaW5pdCh2b2lkKQogewotCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDQwX3N5c2NsYXNzLCAmczNjMjQ0eF9pcnFfZHJpdmVyKTsKKwlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczNjMjQ0MF9zeXNjbGFzcywgJnMzYzI0NDBfaXJxX2RyaXZlcik7CiB9CiAKIGFyY2hfaW5pdGNhbGwoczNjMjQ0MF9pcnFfaW5pdCk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDQyX2lycV9kcml2ZXIgPSB7CisJLmFkZAk9IHMzYzI0NHhfaXJxX2FkZCwKK307CiAKIHN0YXRpYyBpbnQgczNjMjQ0Ml9pcnFfaW5pdCh2b2lkKQogewotCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDQyX3N5c2NsYXNzLCAmczNjMjQ0eF9pcnFfZHJpdmVyKTsKKwlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczNjMjQ0Ml9zeXNjbGFzcywgJnMzYzI0NDJfaXJxX2RyaXZlcik7CiB9CiAKIGFyY2hfaW5pdGNhbGwoczNjMjQ0Ml9pcnFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwppbmRleCAxZTg5ZDQwLi40NGE3YTY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCWIJX19hcm05MjZfc2V0dXAKIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9WRlB8SFdDQVBfRURTUHxIV0NBUF9KQVZBCiAJLmxvbmcJY3B1X2FybTkyNl9uYW1lCiAJLmxvbmcJYXJtOTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2NHdiaV90bGJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2F1ZGl0LmMgYi9hcmNoL2kzODYva2VybmVsL2F1ZGl0LmMKaW5kZXggNWE1M2M2Zi4uM2I5N2NmZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hdWRpdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXVkaXQuYwpAQCAtOCwxMyArOCw0MSBAQAogfjBVCiB9OwogCitzdGF0aWMgdW5zaWduZWQgcmVhZF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3JlYWQuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIHdyaXRlX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfd3JpdGUuaD4KK34wVQorfTsKKwogc3RhdGljIHVuc2lnbmVkIGNoYXR0cl9jbGFzc1tdID0gewogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2NoYW5nZV9hdHRyLmg+CiB+MFUKIH07CiAKK2ludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpCit7CisJc3dpdGNoKHN5c2NhbGwpIHsKKwljYXNlIF9fTlJfb3BlbjoKKwkJcmV0dXJuIDI7CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisJY2FzZSBfX05SX3NvY2tldGNhbGw6CisJCXJldHVybiA0OworCWNhc2UgX19OUl9leGVjdmU6CisJCXJldHVybiA1OworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwogc3RhdGljIGludCBfX2luaXQgYXVkaXRfY2xhc3Nlc19pbml0KHZvaWQpCiB7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEUsIHdyaXRlX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19SRUFELCByZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEUsIGRpcl9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSLCBjaGF0dHJfY2xhc3MpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvYXVkaXQuYyBiL2FyY2gvaWE2NC9pYTMyL2F1ZGl0LmMKaW5kZXggYWI5NGYyZS4uOTJkN2QwYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYXVkaXQuYworKysgYi9hcmNoL2lhNjQvaWEzMi9hdWRpdC5jCkBAIC05LDMgKzksMjkgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9jaGFuZ2VfYXR0ci5oPgogfjBVCiB9OworCit1bnNpZ25lZCBpYTMyX3dyaXRlX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfd3JpdGUuaD4KK34wVQorfTsKKwordW5zaWduZWQgaWEzMl9yZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitpbnQgaWEzMl9jbGFzc2lmeV9zeXNjYWxsKHVuc2lnbmVkIHN5c2NhbGwpCit7CisJc3dpdGNoKHN5c2NhbGwpIHsKKwljYXNlIF9fTlJfb3BlbjoKKwkJcmV0dXJuIDI7CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisJY2FzZSBfX05SX3NvY2tldGNhbGw6CisJCXJldHVybiA0OworCWNhc2UgX19OUl9leGVjdmU6CisJCXJldHVybiA1OworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYXVkaXQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYXVkaXQuYwppbmRleCBmMjUxMjkzLi4wNDY4MjU1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2F1ZGl0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hdWRpdC5jCkBAIC04LDE5ICs4LDU0IEBACiB+MFUKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCByZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCiBzdGF0aWMgdW5zaWduZWQgY2hhdHRyX2NsYXNzW10gPSB7CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfY2hhbmdlX2F0dHIuaD4KIH4wVQogfTsKIAoraW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKK3sKKyNpZmRlZiBDT05GSUdfSUEzMl9TVVBQT1JUCisJZXh0ZXJuIGludCBpYTMyX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQpOworCWlmIChhYmkgPT0gQVVESVRfQVJDSF9JMzg2KQorCQlyZXR1cm4gaWEzMl9jbGFzc2lmeV9zeXNjYWxsKHN5c2NhbGwpOworI2VuZGlmCisJc3dpdGNoKHN5c2NhbGwpIHsKKwljYXNlIF9fTlJfb3BlbjoKKwkJcmV0dXJuIDI7CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisJY2FzZSBfX05SX2V4ZWN2ZToKKwkJcmV0dXJuIDU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBhdWRpdF9jbGFzc2VzX2luaXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfSUEzMl9TVVBQT1JUCiAJZXh0ZXJuIF9fdTMyIGlhMzJfZGlyX2NsYXNzW107CisJZXh0ZXJuIF9fdTMyIGlhMzJfd3JpdGVfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgaWEzMl9yZWFkX2NsYXNzW107CiAJZXh0ZXJuIF9fdTMyIGlhMzJfY2hhdHRyX2NsYXNzW107CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEVfMzIsIGlhMzJfd3JpdGVfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQURfMzIsIGlhMzJfcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFXzMyLCBpYTMyX2Rpcl9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSXzMyLCBpYTMyX2NoYXR0cl9jbGFzcyk7CiAjZW5kaWYKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURSwgd3JpdGVfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQUQsIHJlYWRfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURSwgZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFIsIGNoYXR0cl9jbGFzcyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA5NTZjMmU1Li43ZDMyYWQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTcwLDYgKzcwLDggQEAKIGtleGVjLSQoQ09ORklHX1BQQzY0KQkJOj0gbWFjaGluZV9rZXhlY182NC5vCiBrZXhlYy0kKENPTkZJR19QUEMzMikJCTo9IG1hY2hpbmVfa2V4ZWNfMzIubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIGNyYXNoLm8gJChrZXhlYy15KQorb2JqLSQoQ09ORklHX0FVRElUKQkJKz0gYXVkaXQubworb2JqNjQtJChDT05GSUdfQVVESVQpCQkrPSBjb21wYXRfYXVkaXQubwogCiBpZmVxICgkKENPTkZJR19QUENfSVNFUklFUykseSkKICQob2JqKS9oZWFkXzY0Lm86ICQob2JqKS9scGFybWFwLnMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXVkaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU1ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hdWRpdC5jCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworc3RhdGljIHVuc2lnbmVkIGRpcl9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2Rpcl93cml0ZS5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgcmVhZF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3JlYWQuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIHdyaXRlX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfd3JpdGUuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXR0cl9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2NoYW5nZV9hdHRyLmg+Cit+MFUKK307CisKK2ludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpCit7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJZXh0ZXJuIGludCBwcGMzMl9jbGFzc2lmeV9zeXNjYWxsKHVuc2lnbmVkKTsKKwlpZiAoYWJpID09IEFVRElUX0FSQ0hfUFBDKQorCQlyZXR1cm4gcHBjMzJfY2xhc3NpZnlfc3lzY2FsbChzeXNjYWxsKTsKKyNlbmRpZgorCXN3aXRjaChzeXNjYWxsKSB7CisJY2FzZSBfX05SX29wZW46CisJCXJldHVybiAyOworCWNhc2UgX19OUl9vcGVuYXQ6CisJCXJldHVybiAzOworCWNhc2UgX19OUl9zb2NrZXRjYWxsOgorCQlyZXR1cm4gNDsKKwljYXNlIF9fTlJfZXhlY3ZlOgorCQlyZXR1cm4gNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGl0X2NsYXNzZXNfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QUEM2NAorCWV4dGVybiBfX3UzMiBwcGMzMl9kaXJfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgcHBjMzJfd3JpdGVfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgcHBjMzJfcmVhZF9jbGFzc1tdOworCWV4dGVybiBfX3UzMiBwcGMzMl9jaGF0dHJfY2xhc3NbXTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgcHBjMzJfd3JpdGVfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQURfMzIsIHBwYzMyX3JlYWRfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURV8zMiwgcHBjMzJfZGlyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIHBwYzMyX2NoYXR0cl9jbGFzcyk7CisjZW5kaWYKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURSwgd3JpdGVfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQUQsIHJlYWRfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURSwgZGlyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFIsIGNoYXR0cl9jbGFzcyk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoYXVkaXRfY2xhc3Nlc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY29tcGF0X2F1ZGl0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NvbXBhdF9hdWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MGQ0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NvbXBhdF9hdWRpdC5jCkBAIC0wLDAgKzEsMzggQEAKKyN1bmRlZiBfX3Bvd2VycGM2NF9fCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCit1bnNpZ25lZCBwcGMzMl9kaXJfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9kaXJfd3JpdGUuaD4KK34wVQorfTsKKwordW5zaWduZWQgcHBjMzJfY2hhdHRyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfY2hhbmdlX2F0dHIuaD4KK34wVQorfTsKKwordW5zaWduZWQgcHBjMzJfd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCit1bnNpZ25lZCBwcGMzMl9yZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitpbnQgcHBjMzJfY2xhc3NpZnlfc3lzY2FsbCh1bnNpZ25lZCBzeXNjYWxsKQoreworCXN3aXRjaChzeXNjYWxsKSB7CisJY2FzZSBfX05SX29wZW46CisJCXJldHVybiAyOworCWNhc2UgX19OUl9vcGVuYXQ6CisJCXJldHVybiAzOworCWNhc2UgX19OUl9zb2NrZXRjYWxsOgorCQlyZXR1cm4gNDsKKwljYXNlIF9fTlJfZXhlY3ZlOgorCQlyZXR1cm4gNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQppbmRleCA4NjYwMWE5Li45YTMzZWQ2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKQEAgLTE2LDkgKzE2LDExIEBACiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IHMzOTBfa3N5bXMubyBtb2R1bGUubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiAKK29iai0kKENPTkZJR19BVURJVCkJCSs9IGF1ZGl0Lm8KK2NvbXBhdC1vYmotJChDT05GSUdfQVVESVQpCSs9IGNvbXBhdF9hdWRpdC5vCiBvYmotJChDT05GSUdfQ09NUEFUKQkJKz0gY29tcGF0X2xpbnV4Lm8gY29tcGF0X3NpZ25hbC5vIFwKIAkJCQkJY29tcGF0X3dyYXBwZXIubyBjb21wYXRfZXhlY19kb21haW4ubyBcCi0JCQkJCWJpbmZtdF9lbGYzMi5vCisJCQkJCWJpbmZtdF9lbGYzMi5vICQoY29tcGF0LW9iai15KQogCiBvYmotJChDT05GSUdfVklSVF9USU1FUikJKz0gdnRpbWUubwogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpCSs9IHN0YWNrdHJhY2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hdWRpdC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hdWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDFkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2F1ZGl0LmMKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitzdGF0aWMgdW5zaWduZWQgZGlyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfZGlyX3dyaXRlLmg+Cit+MFUKK307CisKK3N0YXRpYyB1bnNpZ25lZCByZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhdHRyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfY2hhbmdlX2F0dHIuaD4KK34wVQorfTsKKworaW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKK3sKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJZXh0ZXJuIGludCBzMzkwX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQpOworCWlmIChhYmkgPT0gQVVESVRfQVJDSF9TMzkwKQorCQlyZXR1cm4gczM5MF9jbGFzc2lmeV9zeXNjYWxsKHN5c2NhbGwpOworI2VuZGlmCisJc3dpdGNoKHN5c2NhbGwpIHsKKwljYXNlIF9fTlJfb3BlbjoKKwkJcmV0dXJuIDI7CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisJY2FzZSBfX05SX3NvY2tldGNhbGw6CisJCXJldHVybiA0OworCWNhc2UgX19OUl9leGVjdmU6CisJCXJldHVybiA1OworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgYXVkaXRfY2xhc3Nlc19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCWV4dGVybiBfX3UzMiBzMzkwX2Rpcl9jbGFzc1tdOworCWV4dGVybiBfX3UzMiBzMzkwX3dyaXRlX2NsYXNzW107CisJZXh0ZXJuIF9fdTMyIHMzOTBfcmVhZF9jbGFzc1tdOworCWV4dGVybiBfX3UzMiBzMzkwX2NoYXR0cl9jbGFzc1tdOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFXzMyLCBzMzkwX3dyaXRlX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19SRUFEXzMyLCBzMzkwX3JlYWRfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURV8zMiwgczM5MF9kaXJfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUl8zMiwgczM5MF9jaGF0dHJfY2xhc3MpOworI2VuZGlmCisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEUsIHdyaXRlX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19SRUFELCByZWFkX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEUsIGRpcl9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSLCBjaGF0dHJfY2xhc3MpOworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGF1ZGl0X2NsYXNzZXNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9hdWRpdC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQ5NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfYXVkaXQuYwpAQCAtMCwwICsxLDM4IEBACisjdW5kZWYgX19zMzkweF9fCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCit1bnNpZ25lZCBzMzkwX2Rpcl9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2Rpcl93cml0ZS5oPgorfjBVCit9OworCit1bnNpZ25lZCBzMzkwX2NoYXR0cl9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2NoYW5nZV9hdHRyLmg+Cit+MFUKK307CisKK3Vuc2lnbmVkIHMzOTBfd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCit1bnNpZ25lZCBzMzkwX3JlYWRfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9yZWFkLmg+Cit+MFUKK307CisKK2ludCBzMzkwX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQgc3lzY2FsbCkKK3sKKwlzd2l0Y2goc3lzY2FsbCkgeworCWNhc2UgX19OUl9vcGVuOgorCQlyZXR1cm4gMjsKKwljYXNlIF9fTlJfb3BlbmF0OgorCQlyZXR1cm4gMzsKKwljYXNlIF9fTlJfc29ja2V0Y2FsbDoKKwkJcmV0dXJuIDQ7CisJY2FzZSBfX05SX2V4ZWN2ZToKKwkJcmV0dXJuIDU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9hdWRpdC5jIGIvYXJjaC94ODZfNjQvaWEzMi9hdWRpdC5jCmluZGV4IGFiOTRmMmUuLjkyZDdkMGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvYXVkaXQuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2F1ZGl0LmMKQEAgLTksMyArOSwyOSBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2NoYW5nZV9hdHRyLmg+CiB+MFUKIH07CisKK3Vuc2lnbmVkIGlhMzJfd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCit1bnNpZ25lZCBpYTMyX3JlYWRfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9yZWFkLmg+Cit+MFUKK307CisKK2ludCBpYTMyX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQgc3lzY2FsbCkKK3sKKwlzd2l0Y2goc3lzY2FsbCkgeworCWNhc2UgX19OUl9vcGVuOgorCQlyZXR1cm4gMjsKKwljYXNlIF9fTlJfb3BlbmF0OgorCQlyZXR1cm4gMzsKKwljYXNlIF9fTlJfc29ja2V0Y2FsbDoKKwkJcmV0dXJuIDQ7CisJY2FzZSBfX05SX2V4ZWN2ZToKKwkJcmV0dXJuIDU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2F1ZGl0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXVkaXQuYwppbmRleCBhMDY3YWE0Li4yMWYzMzM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXVkaXQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXVkaXQuYwpAQCAtOCwxOSArOCw1NCBAQAogfjBVCiB9OwogCitzdGF0aWMgdW5zaWduZWQgcmVhZF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3JlYWQuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIHdyaXRlX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfd3JpdGUuaD4KK34wVQorfTsKKwogc3RhdGljIHVuc2lnbmVkIGNoYXR0cl9jbGFzc1tdID0gewogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X2NoYW5nZV9hdHRyLmg+CiB+MFUKIH07CiAKK2ludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpCit7CisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJZXh0ZXJuIGludCBpYTMyX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQpOworCWlmIChhYmkgPT0gQVVESVRfQVJDSF9JMzg2KQorCQlyZXR1cm4gaWEzMl9jbGFzc2lmeV9zeXNjYWxsKHN5c2NhbGwpOworI2VuZGlmCisJc3dpdGNoKHN5c2NhbGwpIHsKKwljYXNlIF9fTlJfb3BlbjoKKwkJcmV0dXJuIDI7CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisJY2FzZSBfX05SX2V4ZWN2ZToKKwkJcmV0dXJuIDU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBhdWRpdF9jbGFzc2VzX2luaXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KIAlleHRlcm4gX191MzIgaWEzMl9kaXJfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgaWEzMl93cml0ZV9jbGFzc1tdOworCWV4dGVybiBfX3UzMiBpYTMyX3JlYWRfY2xhc3NbXTsKIAlleHRlcm4gX191MzIgaWEzMl9jaGF0dHJfY2xhc3NbXTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgaWEzMl93cml0ZV9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRF8zMiwgaWEzMl9yZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIsIGlhMzJfZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIGlhMzJfY2hhdHRyX2NsYXNzKTsKICNlbmRpZgorCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFLCB3cml0ZV9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hZWM2Mnh4LmMgYi9kcml2ZXJzL2lkZS9wY2kvYWVjNjJ4eC5jCmluZGV4IGE3YzcyNWYuLmYyODYwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9hZWM2Mnh4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2FlYzYyeHguYwpAQCAtNDI1LDEyICs0MjUsMTIgQEAKIAlyZXR1cm4gZC0+aW5pdF9zZXR1cChkZXYsIGQpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWVjNjJ4eF9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODUwVUYpLCAwIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwKSwgMSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MFIpLCAyIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODY1KSwgMyB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NVIpLCA0IH0sCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWVjNjJ4eF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg1MFVGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MCwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MFIsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NSwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NVIsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0IH0sCiAJeyAwLCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZWM2Mnh4X3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwppbmRleCAwMzY3N2JmLi5mMDYzZDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwpAQCAtNjQ5LDExICs2NDksMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN2d2tzX3BjaV90YmxbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFKSwgMH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSksIDF9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUpLCAyfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMiksIDN9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERSksIDR9LAorCXsgUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorCXsgUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgM30sCisJeyBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCiAJeyAwLCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdndrc19wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zaWltYWdlLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2lpbWFnZS5jCmluZGV4IDI1Y2ViNGEuLjIwYjM5MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zaWltYWdlLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NpaW1hZ2UuYwpAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lpbWFnZV9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ01ELCBQQ0lfREVWSUNFX0lEX1NJSV82ODApLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfQ01ELCBQQ0lfREVWSUNFX0lEX1NJSV82ODAsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfU0FUQQotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9TSUlfMzExMiksIDF9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9TSUlfMTIxMFNBKSwgMn0sCisJeyBQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9TSUlfMzExMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyBQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9TSUlfMTIxMFNBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKICNlbmRpZgogCXsgMCwgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKaW5kZXggYTRmNzI4OC4uM2VmNTY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIGNvbmZpZyBJU0ROX1BQUAogCWJvb2wgIlN1cHBvcnQgc3luY2hyb25vdXMgUFBQIgogCWRlcGVuZHMgb24gSU5FVAorCXNlbGVjdCBTTEhDCiAJaGVscAogCSAgT3ZlciBkaWdpdGFsIGNvbm5lY3Rpb25zIHN1Y2ggYXMgSVNETiwgdGhlcmUgaXMgbm8gbmVlZCB0bwogCSAgc3luY2hyb25pemUgc2VuZGVyIGFuZCByZWNpcGllbnQncyBjbG9ja3Mgd2l0aCBzdGFydCBhbmQgc3RvcCBiaXRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9pbXhtbWMuYyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCmluZGV4IDdjYTllOTUuLmZiNjU2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2lteG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCkBAIC05MSw2ICs5MSw4IEBACiAJaW50CQkJZG1hX2FsbG9jYXRlZDsKIAogCXVuc2lnbmVkIGNoYXIJCWFjdHVhbF9idXNfd2lkdGg7CisKKwlpbnQJCQlwcmV2X2NtZF9jb2RlOwogfTsKIAogI2RlZmluZSBJTVhNQ0lfUEVORF9JUlFfYgkwCkBAIC0yNDgsMTYgKzI1MCwxNCBAQAogCSAqIHBhcnRpYWwgRklGTyBmaWxscyBhbmQgcmVhZHMuIFRoZSBsZW5ndGggaGFzIHRvIGJlIHJvdW5kZWQgdXAgdG8gYnVyc3Qgc2l6ZSBtdWx0aXBsZS4KIAkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBTQ1IgcmVhZCBhdCBsZWFzdC4KIAkgKi8KLQlpZiAoZGF0YXN6IDwgNjQpIHsKKwlpZiAoZGF0YXN6IDwgNTEyKSB7CiAJCWhvc3QtPmRtYV9zaXplID0gZGF0YXN6OwogCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKSB7CiAJCQlob3N0LT5kbWFfZGlyID0gRE1BX0ZST01fREVWSUNFOwogCiAJCQkvKiBIYWNrIHRvIGVuYWJsZSByZWFkIFNDUiAqLwotCQkJaWYoZGF0YXN6IDwgMTYpIHsKLQkJCQlNTUNfTk9CID0gMTsKLQkJCQlNTUNfQkxLX0xFTiA9IDE2OwotCQkJfQorCQkJTU1DX05PQiA9IDE7CisJCQlNTUNfQkxLX0xFTiA9IDUxMjsKIAkJfSBlbHNlIHsKIAkJCWhvc3QtPmRtYV9kaXIgPSBETUFfVE9fREVWSUNFOwogCQl9CkBAIC00MDksNiArNDA5LDkgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAorCWlmKHJlcSAmJiByZXEtPmNtZCkKKwkJaG9zdC0+cHJldl9jbWRfY29kZSA9IHJlcS0+Y21kLT5vcGNvZGU7CisKIAlob3N0LT5yZXEgPSBOVUxMOwogCWhvc3QtPmNtZCA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IE5VTEw7CkBAIC01NTMsNyArNTU2LDYgQEAKIHsKIAlpbnQgaTsKIAlpbnQgYnVyc3RfbGVuOwotCWludCBmbHVzaF9sZW47CiAJaW50IHRyYW5zX2RvbmUgPSAwOwogCXVuc2lnbmVkIGludCBzdGF0ID0gKnBzdGF0OwogCkBAIC01NjYsNDQgKzU2OCw0MyBAQAogCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiaW14bWNpX2NwdV9kcml2ZW5fZGF0YSBydW5uaW5nIFNUQVRVUyA9IDB4JXhcbiIsCiAJCXN0YXQpOwogCisJdWRlbGF5KDIwKTsJLyogcmVxdWlyZWQgZm9yIGNsb2NrcyA8IDhNSHoqLworCiAJaWYoaG9zdC0+ZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKIAkJaW14bWNpX2J1c3lfd2FpdF9mb3Jfc3RhdHVzKGhvc3QsICZzdGF0LAogCQkJCVNUQVRVU19BUFBMX0JVRkZfRkYgfCBTVEFUVVNfREFUQV9UUkFOU19ET05FLAotCQkJCTIwLCAiaW14bWNpX2NwdV9kcml2ZW5fZGF0YSByZWFkIik7CisJCQkJNTAsICJpbXhtY2lfY3B1X2RyaXZlbl9kYXRhIHJlYWQiKTsKIAogCQl3aGlsZSgoc3RhdCAmIChTVEFUVVNfQVBQTF9CVUZGX0ZGIHwgIFNUQVRVU19EQVRBX1RSQU5TX0RPTkUpKSAmJgotCQkgICAgICAoaG9zdC0+ZGF0YV9jbnQgPCBob3N0LT5kbWFfc2l6ZSkpIHsKLQkJCWlmKGJ1cnN0X2xlbiA+PSBob3N0LT5kbWFfc2l6ZSAtIGhvc3QtPmRhdGFfY250KSB7Ci0JCQkJZmx1c2hfbGVuID0gYnVyc3RfbGVuOwotCQkJCWJ1cnN0X2xlbiA9IGhvc3QtPmRtYV9zaXplIC0gaG9zdC0+ZGF0YV9jbnQ7Ci0JCQkJZmx1c2hfbGVuIC09IGJ1cnN0X2xlbjsKLQkJCQlob3N0LT5kYXRhX2NudCA9IGhvc3QtPmRtYV9zaXplOwotCQkJCXRyYW5zX2RvbmUgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlmbHVzaF9sZW4gPSAwOwotCQkJCWhvc3QtPmRhdGFfY250ICs9IGJ1cnN0X2xlbjsKLQkJCX0KKwkJICAgICAgKGhvc3QtPmRhdGFfY250IDwgNTEyKSkgeworCisJCQl1ZGVsYXkoMjApOwkvKiByZXF1aXJlZCBmb3IgY2xvY2tzIDwgOE1IeiovCiAKIAkJCWZvcihpID0gYnVyc3RfbGVuOyBpPj0yIDsgaS09MikgewotCQkJCSooaG9zdC0+ZGF0YV9wdHIrKykgPSBNTUNfQlVGRkVSX0FDQ0VTUzsKLQkJCQl1ZGVsYXkoMjApOwkvKiByZXF1aXJlZCBmb3IgY2xvY2tzIDwgOE1IeiovCisJCQkJdTE2IGRhdGE7CisJCQkJZGF0YSA9IE1NQ19CVUZGRVJfQUNDRVNTOworCQkJCXVkZWxheSgxMCk7CS8qIHJlcXVpcmVkIGZvciBjbG9ja3MgPCA4TUh6Ki8KKwkJCQlpZihob3N0LT5kYXRhX2NudCsyIDw9IGhvc3QtPmRtYV9zaXplKSB7CisJCQkJCSooaG9zdC0+ZGF0YV9wdHIrKykgPSBkYXRhOworCQkJCX0gZWxzZSB7CisJCQkJCWlmKGhvc3QtPmRhdGFfY250IDwgaG9zdC0+ZG1hX3NpemUpCisJCQkJCQkqKHU4KikoaG9zdC0+ZGF0YV9wdHIpID0gZGF0YTsKKwkJCQl9CisJCQkJaG9zdC0+ZGF0YV9jbnQgKz0gMjsKIAkJCX0KIAotCQkJaWYoaSA9PSAxKQotCQkJCSoodTgqKShob3N0LT5kYXRhX3B0cikgPSBNTUNfQlVGRkVSX0FDQ0VTUzsKLQogCQkJc3RhdCA9IE1NQ19TVEFUVVM7CiAKLQkJCS8qIEZsdXNoIGV4dHJhIGJ5dGVzIGZyb20gRklGTyAqLwotCQkJd2hpbGUoZmx1c2hfbGVuICYmICEoc3RhdCAmIFNUQVRVU19EQVRBX1RSQU5TX0RPTkUpKXsKLQkJCQlpID0gTU1DX0JVRkZFUl9BQ0NFU1M7Ci0JCQkJc3RhdCA9IE1NQ19TVEFUVVM7Ci0JCQkJc3RhdCAmPSB+U1RBVFVTX0NSQ19SRUFEX0VSUjsgLyogU3R1cGlkIGJ1dCByZXF1aXJlZCB0aGVyZSAqLwotCQkJfQotCi0JCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImlteG1jaV9jcHVfZHJpdmVuX2RhdGEgcmVhZCBidXJzdCAlZCBTVEFUVVMgPSAweCV4XG4iLAotCQkJCWJ1cnN0X2xlbiwgc3RhdCk7CisJCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImlteG1jaV9jcHVfZHJpdmVuX2RhdGEgcmVhZCAlZCBidXJzdCAlZCBTVEFUVVMgPSAweCV4XG4iLAorCQkJCWhvc3QtPmRhdGFfY250LCBidXJzdF9sZW4sIHN0YXQpOwogCQl9CisKKwkJaWYoKHN0YXQgJiBTVEFUVVNfREFUQV9UUkFOU19ET05FKSAmJiAoaG9zdC0+ZGF0YV9jbnQgPj0gNTEyKSkKKwkJCXRyYW5zX2RvbmUgPSAxOworCisJCWlmKGhvc3QtPmRtYV9zaXplICYgMHgxZmYpCisJCQlzdGF0ICY9IH5TVEFUVVNfQ1JDX1JFQURfRVJSOworCiAJfSBlbHNlIHsKIAkJaW14bWNpX2J1c3lfd2FpdF9mb3Jfc3RhdHVzKGhvc3QsICZzdGF0LAogCQkJCVNUQVRVU19BUFBMX0JVRkZfRkUsCkBAIC02OTIsOCArNjkzLDggQEAKIAkJICAgICAgIHdoYXQsIHN0YXQsIE1NQ19JTlRfTUFTSyk7CiAJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiQ01EX0RBVF9DT05UID0gMHglMDR4LCBNTUNfQkxLX0xFTiA9IDB4JTA0eCwgTU1DX05PQiA9IDB4JTA0eCwgRE1BX0NDUiA9IDB4JTA4eFxuIiwKIAkJICAgICAgIE1NQ19DTURfREFUX0NPTlQsIE1NQ19CTEtfTEVOLCBNTUNfTk9CLCBDQ1IoaG9zdC0+ZG1hKSk7Ci0JCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiQ01EJWQsIGJ1cyAlZC1iaXQsIGRtYV9zaXplID0gMHgleFxuIiwKLQkJICAgICAgIGhvc3QtPmNtZD9ob3N0LT5jbWQtPm9wY29kZTowLCAxPDxob3N0LT5hY3R1YWxfYnVzX3dpZHRoLCBob3N0LT5kbWFfc2l6ZSk7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiQ01EJWQsIHByZXZDTUQlZCwgYnVzICVkLWJpdCwgZG1hX3NpemUgPSAweCV4XG4iLAorCQkgICAgICAgaG9zdC0+Y21kP2hvc3QtPmNtZC0+b3Bjb2RlOjAsIGhvc3QtPnByZXZfY21kX2NvZGUsIDE8PGhvc3QtPmFjdHVhbF9idXNfd2lkdGgsIGhvc3QtPmRtYV9zaXplKTsKIAl9CiAKIAlpZighaG9zdC0+cHJlc2VudCB8fCB0aW1lb3V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jLmMgYi9kcml2ZXJzL21tYy9tbWMuYwppbmRleCAzMzUyNWJkLi43NGVhYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWMuYworKysgYi9kcml2ZXJzL21tYy9tbWMuYwpAQCAtMjQ3LDYgKzI0Nyw1NSBAQAogCiBFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9hcHBfY21kKTsKIAorLyoqCisgKgltbWNfc2V0X2RhdGFfdGltZW91dCAtIHNldCB0aGUgdGltZW91dCBmb3IgYSBkYXRhIGNvbW1hbmQKKyAqCUBkYXRhOiBkYXRhIHBoYXNlIGZvciBjb21tYW5kCisgKglAY2FyZDogdGhlIE1NQyBjYXJkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0cmFuc2ZlcgorICoJQHdyaXRlOiBmbGFnIHRvIGRpZmZlcmVudGlhdGUgcmVhZHMgZnJvbSB3cml0ZXMKKyAqLwordm9pZCBtbWNfc2V0X2RhdGFfdGltZW91dChzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsIGNvbnN0IHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKKwkJCSAgaW50IHdyaXRlKQoreworCXVuc2lnbmVkIGludCBtdWx0OworCisJLyoKKwkgKiBTRCBjYXJkcyB1c2UgYSAxMDAgbXVsdGlwbGllciByYXRoZXIgdGhhbiAxMAorCSAqLworCW11bHQgPSBtbWNfY2FyZF9zZChjYXJkKSA/IDEwMCA6IDEwOworCisJLyoKKwkgKiBTY2FsZSB1cCB0aGUgbXVsdGlwbGllciAoYW5kIHRoZXJlZm9yZSB0aGUgdGltZW91dCkgYnkKKwkgKiB0aGUgcjJ3IGZhY3RvciBmb3Igd3JpdGVzLgorCSAqLworCWlmICh3cml0ZSkKKwkJbXVsdCA8PD0gY2FyZC0+Y3NkLnIyd19mYWN0b3I7CisKKwlkYXRhLT50aW1lb3V0X25zID0gY2FyZC0+Y3NkLnRhY2NfbnMgKiBtdWx0OworCWRhdGEtPnRpbWVvdXRfY2xrcyA9IGNhcmQtPmNzZC50YWNjX2Nsa3MgKiBtdWx0OworCisJLyoKKwkgKiBTRCBjYXJkcyBhbHNvIGhhdmUgYW4gdXBwZXIgbGltaXQgb24gdGhlIHRpbWVvdXQuCisJICovCisJaWYgKG1tY19jYXJkX3NkKGNhcmQpKSB7CisJCXVuc2lnbmVkIGludCB0aW1lb3V0X3VzLCBsaW1pdF91czsKKworCQl0aW1lb3V0X3VzID0gZGF0YS0+dGltZW91dF9ucyAvIDEwMDA7CisJCXRpbWVvdXRfdXMgKz0gZGF0YS0+dGltZW91dF9jbGtzICogMTAwMCAvCisJCQkoY2FyZC0+aG9zdC0+aW9zLmNsb2NrIC8gMTAwMCk7CisKKwkJaWYgKHdyaXRlKQorCQkJbGltaXRfdXMgPSAyNTAwMDA7CisJCWVsc2UKKwkJCWxpbWl0X3VzID0gMTAwMDAwOworCisJCWlmICh0aW1lb3V0X3VzID4gbGltaXRfdXMpIHsKKwkJCWRhdGEtPnRpbWVvdXRfbnMgPSBsaW1pdF91cyAqIDEwMDA7CisJCQlkYXRhLT50aW1lb3V0X2Nsa3MgPSAwOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChtbWNfc2V0X2RhdGFfdGltZW91dCk7CisKIHN0YXRpYyBpbnQgbW1jX3NlbGVjdF9jYXJkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIAogLyoqCkBAIC05MDgsMTEgKzk1Nyw5IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQ7Ci0KIAlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxOwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CiAJc3RydWN0IG1tY19kYXRhIGRhdGE7Ci0KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhcmQsICZob3N0LT5jYXJkcywgbm9kZSkgewpAQCAtOTQ3LDggKzk5NCw4IEBACiAKIAkJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1tY19kYXRhKSk7CiAKLQkJZGF0YS50aW1lb3V0X25zID0gY2FyZC0+Y3NkLnRhY2NfbnMgKiAxMDsKLQkJZGF0YS50aW1lb3V0X2Nsa3MgPSBjYXJkLT5jc2QudGFjY19jbGtzICogMTA7CisJCW1tY19zZXRfZGF0YV90aW1lb3V0KCZkYXRhLCBjYXJkLCAwKTsKKwogCQlkYXRhLmJsa3N6X2JpdHMgPSAzOwogCQlkYXRhLmJsa3N6ID0gMSA8PCAzOwogCQlkYXRhLmJsb2NrcyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCmluZGV4IDExNWNjMjEuLmEwZTBkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvcHJvdG9jb2wuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTE3MSw4ICsxNzIsNiBAQAogCiAJCWJycS5jbWQuYXJnID0gcmVxLT5zZWN0b3IgPDwgOTsKIAkJYnJxLmNtZC5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7Ci0JCWJycS5kYXRhLnRpbWVvdXRfbnMgPSBjYXJkLT5jc2QudGFjY19ucyAqIDEwOwotCQlicnEuZGF0YS50aW1lb3V0X2Nsa3MgPSBjYXJkLT5jc2QudGFjY19jbGtzICogMTA7CiAJCWJycS5kYXRhLmJsa3N6X2JpdHMgPSBtZC0+YmxvY2tfYml0czsKIAkJYnJxLmRhdGEuYmxrc3ogPSAxIDw8IG1kLT5ibG9ja19iaXRzOwogCQlicnEuZGF0YS5ibG9ja3MgPSByZXEtPm5yX3NlY3RvcnMgPj4gKG1kLT5ibG9ja19iaXRzIC0gOSk7CkBAIC0xODAsNiArMTc5LDggQEAKIAkJYnJxLnN0b3AuYXJnID0gMDsKIAkJYnJxLnN0b3AuZmxhZ3MgPSBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7CiAKKwkJbW1jX3NldF9kYXRhX3RpbWVvdXQoJmJycS5kYXRhLCBjYXJkLCBycV9kYXRhX2RpcihyZXEpICE9IFJFQUQpOworCiAJCWlmIChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpIHsKIAkJCWJycS5jbWQub3Bjb2RlID0gYnJxLmRhdGEuYmxvY2tzID4gMSA/IE1NQ19SRUFEX01VTFRJUExFX0JMT0NLIDogTU1DX1JFQURfU0lOR0xFX0JMT0NLOwogCQkJYnJxLmRhdGEuZmxhZ3MgfD0gTU1DX0RBVEFfUkVBRDsKQEAgLTE4NywxMiArMTg4LDYgQEAKIAkJCWJycS5jbWQub3Bjb2RlID0gTU1DX1dSSVRFX0JMT0NLOwogCQkJYnJxLmRhdGEuZmxhZ3MgfD0gTU1DX0RBVEFfV1JJVEU7CiAJCQlicnEuZGF0YS5ibG9ja3MgPSAxOwotCi0JCQkvKgotCQkJICogU2NhbGUgdXAgdGhlIHRpbWVvdXQgYnkgdGhlIHIydyBmYWN0b3IKLQkJCSAqLwotCQkJYnJxLmRhdGEudGltZW91dF9ucyA8PD0gY2FyZC0+Y3NkLnIyd19mYWN0b3I7Ci0JCQlicnEuZGF0YS50aW1lb3V0X2Nsa3MgPDw9IGNhcmQtPmNzZC5yMndfZmFjdG9yOwogCQl9CiAKIAkJaWYgKGJycS5kYXRhLmJsb2NrcyA+IDEpIHsKQEAgLTMyNCw1MiArMzE5LDExIEBACiAJbWQtPnJlYWRfb25seSA9IG1tY19ibGtfcmVhZG9ubHkoY2FyZCk7CiAKIAkvKgotCSAqIEZpZ3VyZSBvdXQgYSB3b3JrYWJsZSBibG9jayBzaXplLiAgTU1DIGNhcmRzIGhhdmU6Ci0JICogIC0gdHdvIGJsb2NrIHNpemVzLCBvbmUgZm9yIHJlYWQgYW5kIG9uZSBmb3Igd3JpdGUuCi0JICogIC0gbWF5IHN1cHBvcnQgcGFydGlhbCByZWFkcyBhbmQvb3Igd3JpdGVzCi0JICogICAgKGFsbG93cyBibG9jayBzaXplcyBzbWFsbGVyIHRoYW4gc3BlY2lmaWVkKQorCSAqIEJvdGggU0QgYW5kIE1NQyBzcGVjaWZpY2F0aW9ucyBzdGF0ZSAoYWx0aG91Z2ggYSBiaXQKKwkgKiB1bmNsZWFybHkgaW4gdGhlIE1NQyBjYXNlKSB0aGF0IGEgYmxvY2sgc2l6ZSBvZiA1MTIKKwkgKiBieXRlcyBtdXN0IGFsd2F5cyBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQuCiAJICovCi0JbWQtPmJsb2NrX2JpdHMgPSBjYXJkLT5jc2QucmVhZF9ibGtiaXRzOwotCWlmIChjYXJkLT5jc2Qud3JpdGVfYmxrYml0cyAhPSBjYXJkLT5jc2QucmVhZF9ibGtiaXRzKSB7Ci0JCWlmIChjYXJkLT5jc2Qud3JpdGVfYmxrYml0cyA8IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMgJiYKLQkJICAgIGNhcmQtPmNzZC5yZWFkX3BhcnRpYWwpIHsKLQkJCS8qCi0JCQkgKiB3cml0ZSBibG9jayBzaXplIGlzIHNtYWxsZXIgdGhhbiByZWFkIGJsb2NrCi0JCQkgKiBzaXplLCBidXQgd2Ugc3VwcG9ydCBwYXJ0aWFsIHJlYWRzLCBzbyBjaG9vc2UKLQkJCSAqIHRoZSBzbWFsbGVyIHdyaXRlIGJsb2NrIHNpemUuCi0JCQkgKi8KLQkJCW1kLT5ibG9ja19iaXRzID0gY2FyZC0+Y3NkLndyaXRlX2Jsa2JpdHM7Ci0JCX0gZWxzZSBpZiAoY2FyZC0+Y3NkLndyaXRlX2Jsa2JpdHMgPiBjYXJkLT5jc2QucmVhZF9ibGtiaXRzICYmCi0JCQkgICBjYXJkLT5jc2Qud3JpdGVfcGFydGlhbCkgewotCQkJLyoKLQkJCSAqIHJlYWQgYmxvY2sgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gd3JpdGUgYmxvY2sKLQkJCSAqIHNpemUsIGJ1dCB3ZSBzdXBwb3J0IHBhcnRpYWwgd3JpdGVzLiAgVXNlIHJlYWQKLQkJCSAqIGJsb2NrIHNpemUuCi0JCQkgKi8KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBXZSBkb24ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiBmb3Igd3JpdGVzLgotCQkJICovCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc2VsZWN0IGJsb2NrIHNpemUgZm9yICIKLQkJCQkid3JpdGluZyAocmIldSB3YiV1IHJwJXUgd3AldSlcbiIsCi0JCQkJbW1jX2NhcmRfaWQoY2FyZCksCi0JCQkJMSA8PCBjYXJkLT5jc2QucmVhZF9ibGtiaXRzLAotCQkJCTEgPDwgY2FyZC0+Y3NkLndyaXRlX2Jsa2JpdHMsCi0JCQkJY2FyZC0+Y3NkLnJlYWRfcGFydGlhbCwKLQkJCQljYXJkLT5jc2Qud3JpdGVfcGFydGlhbCk7Ci0JCQltZC0+cmVhZF9vbmx5ID0gMTsKLQkJfQotCX0KLQotCS8qCi0JICogUmVmdXNlIHRvIGFsbG93IGJsb2NrIHNpemVzIHNtYWxsZXIgdGhhbiA1MTIgYnl0ZXMuCi0JICovCi0JaWYgKG1kLT5ibG9ja19iaXRzIDwgOSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc3VwcG9ydCBibG9jayBzaXplICV1XG4iLAotCQkJbW1jX2NhcmRfaWQoY2FyZCksIDEgPDwgbWQtPmJsb2NrX2JpdHMpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9rZnJlZTsKLQl9CisJbWQtPmJsb2NrX2JpdHMgPSA5OwogCiAJbWQtPmRpc2sgPSBhbGxvY19kaXNrKDEgPDwgTU1DX1NISUZUKTsKIAlpZiAobWQtPmRpc2sgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDEuYyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKaW5kZXggMDcxMzZlYy4uZDdiMTE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDEuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMS5jCkBAIC0xMjAsNyArMTIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogZm9yIENPTkZJR19JUF9NVUxUSUNBU1QgKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggODBlOGNhMC4uN2MyMzgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC0zMTY5LDcgKzMxNjksNyBAQAogewogCWludCBwY2lfcmMsIGVpc2FfcmM7CiAKLQlwY2lfcmMgPSBwY2lfbW9kdWxlX2luaXQoJnZvcnRleF9kcml2ZXIpOworCXBjaV9yYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZvcnRleF9kcml2ZXIpOwogCWVpc2FfcmMgPSB2b3J0ZXhfZWlzYV9pbml0KCk7CiAKIAlpZiAocGNpX3JjID09IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCmluZGV4IDE0MjhiYjcuLjRjMmU3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzljcC5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCkBAIC0yMDk4LDcgKzIwOTgsNyBAQAogI2lmZGVmIE1PRFVMRQogCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKICNlbmRpZgotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZjcF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjcF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3BfZXhpdCAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwppbmRleCBlNGY0ZWFmLi4yYTcwNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5dG9vLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCkBAIC0yNjI5LDcgKzI2MjksNyBAQAogCXByaW50ayAoS0VSTl9JTkZPIFJUTDgxMzlfRFJJVkVSX05BTUUgIlxuIik7CiAjZW5kaWYKIAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZydGw4MTM5X3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydGw4MTM5X3BjaV9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgzOTAuYyBiL2RyaXZlcnMvbmV0LzgzOTAuYwppbmRleCBkMjkzNWFlLi4zZWI3MDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvODM5MC5jCkBAIC0yOTksNyArMjk5LDcgQEAKIAkgKglTbG93IHBoYXNlIHdpdGggbG9jayBoZWxkLgogCSAqLwogCSAKLQlkaXNhYmxlX2lycV9ub3N5bmMoZGV2LT5pcnEpOworCWRpc2FibGVfaXJxX25vc3luY19sb2NrZGVwKGRldi0+aXJxKTsKIAkKIAlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwogCQpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAkJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOwogCQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0JCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQllbmFibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOwogCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMzc5LDcgKzM3OSw3IEBACiAJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOwogCQogCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwllbmFibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOwogCiAJZGV2X2tmcmVlX3NrYiAoc2tiKTsKIAllaV9sb2NhbC0+c3RhdC50eF9ieXRlcyArPSBzZW5kX2xlbmd0aDsKQEAgLTUwNSw5ICs1MDUsOSBAQAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiB2b2lkIGVpX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZGlzYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CiAJZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOwotCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCWVuYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggYTJiZDgxMS4uZGU0ZjllMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0xNDExLDYgKzE0MTEsMjIgQEAKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgZm9yY2VkZXRoLgogCitjb25maWcgRk9SQ0VERVRIX05BUEkKKwlib29sICJVc2UgUnggYW5kIFR4IFBvbGxpbmcgKE5BUEkpIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRk9SQ0VERVRIICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIE5BUEkgaXMgYSBuZXcgZHJpdmVyIEFQSSBkZXNpZ25lZCB0byByZWR1Y2UgQ1BVIGFuZCBpbnRlcnJ1cHQgbG9hZAorCSAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlY2VpdmluZyBsb3RzIG9mIHBhY2tldHMgZnJvbSB0aGUgY2FyZC4gSXQgaXMKKwkgIHN0aWxsIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBhbmQgdGh1cyBub3QgeWV0IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworCSAgSWYgeW91ciBlc3RpbWF0ZWQgUnggbG9hZCBpcyAxMGtwcHMgb3IgbW9yZSwgb3IgaWYgdGhlIGNhcmQgd2lsbCBiZQorCSAgZGVwbG95ZWQgb24gcG90ZW50aWFsbHkgdW5mcmllbmRseSBuZXR3b3JrcyAoZS5nLiBpbiBhIGZpcmV3YWxsKSwKKwkgIHRoZW4gc2F5IFkgaGVyZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBDUzg5eDAKIAl0cmlzdGF0ZSAiQ1M4OXgwIHN1cHBvcnQiCkBAIC0yMjkwLDYgKzIzMDYsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDIgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CiAJICBFdGhlcm5ldC4KIAorY29uZmlnIFFMQTNYWFgKKwl0cmlzdGF0ZSAiUUxvZ2ljIFFMQTNYWFggTmV0d29yayBEcml2ZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFFMb2dpYyBJU1AzWFhYIGdpZ2FiaXQgRXRoZXJuZXQgY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHFsYTN4eHguCisKIGVuZG1lbnUKIAogIwpAQCAtMjU1MCw2ICsyNTc1LDcgQEAKIAogY29uZmlnIFBQUAogCXRyaXN0YXRlICJQUFAgKHBvaW50LXRvLXBvaW50IHByb3RvY29sKSBzdXBwb3J0IgorCXNlbGVjdCBTTEhDCiAJLS0taGVscC0tLQogCSAgUFBQIChQb2ludCB0byBQb2ludCBQcm90b2NvbCkgaXMgYSBuZXdlciBhbmQgYmV0dGVyIFNMSVAuICBJdCBzZXJ2ZXMKIAkgIHRoZSBzYW1lIHB1cnBvc2U6IHNlbmRpbmcgSW50ZXJuZXQgdHJhZmZpYyBvdmVyIHRlbGVwaG9uZSAoYW5kIG90aGVyCkBAIC0yNzMwLDYgKzI3NTYsNyBAQAogY29uZmlnIFNMSVBfQ09NUFJFU1NFRAogCWJvb2wgIkNTTElQIGNvbXByZXNzZWQgaGVhZGVycyIKIAlkZXBlbmRzIG9uIFNMSVAKKwlzZWxlY3QgU0xIQwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgcHJvdG9jb2wgaXMgZmFzdGVyIHRoYW4gU0xJUCBiZWNhdXNlIGl0IHVzZXMgY29tcHJlc3Npb24gb24gdGhlCiAJICBUQ1AvSVAgaGVhZGVycyAobm90IG9uIHRoZSBkYXRhIGl0c2VsZiksIGJ1dCBpdCBoYXMgdG8gYmUgc3VwcG9ydGVkCkBAIC0yNzQyLDYgKzI3NjksMTIgQEAKIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGV4cGxhaW5zIGhvdyB0byBjb25maWd1cmUKIAkgIENTTElQLiBUaGlzIHdvbid0IGVubGFyZ2UgeW91ciBrZXJuZWwuCiAKK2NvbmZpZyBTTEhDCisJdHJpc3RhdGUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIFZhbiBKYWNvYnNlbiBzZXJpYWwgbGluZSBoZWFkZXIgY29tcHJlc3Npb24KKwkgIHJvdXRpbmVzLgorCiBjb25maWcgU0xJUF9TTUFSVAogCWJvb2wgIktlZXBhbGl2ZSBhbmQgbGluZWZpbGwiCiAJZGVwZW5kcyBvbiBTTElQCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IDg0MjdiZjkuLjZmZjE3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0yLDEwICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZXR3b3JrIChldGhlcmNhcmQpIGRldmljZSBkcml2ZXJzLgogIwogCi1pZmVxICgkKENPTkZJR19JU0ROX1BQUCkseSkKLSAgb2JqLSQoQ09ORklHX0lTRE4pICs9IHNsaGMubwotZW5kaWYKLQogb2JqLSQoQ09ORklHX0UxMDAwKSArPSBlMTAwMC8KIG9iai0kKENPTkZJR19JQk1fRU1BQykgKz0gaWJtX2VtYWMvCiBvYmotJChDT05GSUdfSVhHQikgKz0gaXhnYi8KQEAgLTExMyw4ICsxMDksOSBAQAogb2JqLSQoQ09ORklHX05FX0g4MzAwKSArPSBuZS1oODMwMC5vIDgzOTAubwogCiBvYmotJChDT05GSUdfTVY2NDNYWF9FVEgpICs9IG12NjQzeHhfZXRoLm8KK29iai0kKENPTkZJR19RTEEzWFhYKSArPSBxbGEzeHh4Lm8KIAotb2JqLSQoQ09ORklHX1BQUCkgKz0gcHBwX2dlbmVyaWMubyBzbGhjLm8KK29iai0kKENPTkZJR19QUFApICs9IHBwcF9nZW5lcmljLm8KIG9iai0kKENPTkZJR19QUFBfQVNZTkMpICs9IHBwcF9hc3luYy5vCiBvYmotJChDT05GSUdfUFBQX1NZTkNfVFRZKSArPSBwcHBfc3luY3R0eS5vCiBvYmotJChDT05GSUdfUFBQX0RFRkxBVEUpICs9IHBwcF9kZWZsYXRlLm8KQEAgLTEyMyw5ICsxMjAsNyBAQAogb2JqLSQoQ09ORklHX1BQUE9FKSArPSBwcHBveC5vIHBwcG9lLm8KIAogb2JqLSQoQ09ORklHX1NMSVApICs9IHNsaXAubwotaWZlcSAoJChDT05GSUdfU0xJUF9DT01QUkVTU0VEKSx5KQotICBvYmotJChDT05GSUdfU0xJUCkgKz0gc2xoYy5vCi1lbmRpZgorb2JqLSQoQ09ORklHX1NMSEMpICs9IHNsaGMubwogCiBvYmotJChDT05GSUdfRFVNTVkpICs9IGR1bW15Lm8KIG9iai0kKENPTkZJR19JRkIpICs9IGlmYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCmluZGV4IDFjMDFlOWIuLmMwZjM1NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCkBAIC03MjUsNyArNzI1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNlbmljX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhY2VuaWNfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFjZW5pY19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFjZW5pY19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwppbmRleCBlZDMyMmE3Li4yZWY4ZTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTIxNTgsNyArMjE1OCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFtZDgxMTFlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhbWQ4MTExZV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbWQ4MTExZV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYW1kODExMWVfY2xlYW51cCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLXBjaS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLXBjaS5jCmluZGV4IDk3OWEzM2QuLmZjMjU2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1wY2kuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogc3RhdGljIGludCBfX2luaXQgY29tMjAwMjBwY2lfaW5pdCh2b2lkKQogewogCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmNvbTIwMDIwcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNvbTIwMDIwcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb20yMDAyMHBjaV9jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuYyBiL2RyaXZlcnMvbmV0L2I0NC5jCmluZGV4IGJlYTBmYzAuLjE3ZWIyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5jCkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCWRtYV9kZXNjX2FsaWduX21hc2sgPSB+KGRtYV9kZXNjX2FsaWduX3NpemUgLSAxKTsKIAlkbWFfZGVzY19zeW5jX3NpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGRtYV9kZXNjX2FsaWduX3NpemUsIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKIAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmI0NF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZiNDRfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGI0NF9jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmMgYi9kcml2ZXJzL25ldC9ibngyLmMKaW5kZXggNjUyZWIwNS4uNjU0YjkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuYwpAQCAtNjAxNiw3ICs2MDE2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYm54Ml9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYm54Ml9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYm54Ml9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGJueDJfY2xlYW51cCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCmluZGV4IGEzMTU0NGMuLjI2MDQwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKQEAgLTUyNDUsNyArNTI0NSw3IEBACiAJZWxzZQogCQlsaW5rX3RyYW5zaXRpb25fdGltZW91dCA9IDA7CiAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjYXNfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2FzX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjYXNfY2xlYW51cCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCmluZGV4IGU2Nzg3MjQuLmI2ZGUxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMKQEAgLTEyNDMsNyArMTI0Myw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHQxX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHQxX2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCA5MWNjOGNiLi43ZDA2ZGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTM0NDQsNyArMzQ0NCw3IEBACiB7CiAJaW50IHJjX3BjaSwgcmNfZWlzYTsKIAotCXJjX3BjaSA9IHBjaV9tb2R1bGVfaW5pdCgmZGZ4X2RyaXZlcik7CisJcmNfcGNpID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZGZ4X2RyaXZlcik7CiAJaWYgKHJjX3BjaSA+PSAwKSBkZnhfaGF2ZV9wY2kgPSAxOwogCQogCXJjX2Vpc2EgPSBkZnhfZWlzYV9pbml0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbDJrLmMgYi9kcml2ZXJzL25ldC9kbDJrLmMKaW5kZXggNDAyOTYxZS4uYTU3MmMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGwyay5jCisrKyBiL2RyaXZlcnMvbmV0L2RsMmsuYwpAQCAtMTgxNSw3ICsxODE1LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0CiByaW9faW5pdCAodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmcmlvX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJpb19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jIGIvZHJpdmVycy9uZXQvZG05MDAwLmMKaW5kZXggM2Q3NmZhMS4uYTg2MGViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZG05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvZG05MDAwLmMKQEAgLTM3Nyw4ICszNzcsOCBAQAogCQlrZnJlZShkYi0+ZGF0YV9yZXEpOwogCX0KIAotCWlmIChkYi0+YWRkcl9yZXMgIT0gTlVMTCkgewotCQlyZWxlYXNlX3Jlc291cmNlKGRiLT5hZGRyX3Jlcyk7CisJaWYgKGRiLT5hZGRyX3JlcSAhPSBOVUxMKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoZGItPmFkZHJfcmVxKTsKIAkJa2ZyZWUoZGItPmFkZHJfcmVxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKaW5kZXggY2U4NTBmMS4uNDdkOTcwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMTU4LDEwICsxNTgsMTAgQEAKIAogCiAjZGVmaW5lIERSVl9OQU1FCQkiZTEwMCIKLSNkZWZpbmUgRFJWX0VYVAkJIi1OQVBJIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjMuNS4xMC1rMiJEUlZfRVhUCisjZGVmaW5lIERSVl9FWFQJCQkiLU5BUEkiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMy41LjE2LWsyIkRSVl9FWFQKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCQkiSW50ZWwoUikgUFJPLzEwMCBOZXR3b3JrIERyaXZlciIKLSNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJIkNvcHlyaWdodChjKSAxOTk5LTIwMDUgSW50ZWwgQ29ycG9yYXRpb24iCisjZGVmaW5lIERSVl9DT1BZUklHSFQJCSJDb3B5cmlnaHQoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uIgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiOiAiCiAKICNkZWZpbmUgRTEwMF9XQVRDSERPR19QRVJJT0QJKDIgKiBIWikKQEAgLTEzOTUsMTUgKzEzOTUsMTEgQEAKIAl9CiAKIAlpZigobmljLT5tYWMgPj0gbWFjXzgyNTUwX0QxMDIpIHx8ICgobmljLT5mbGFncyAmIGljaCkgJiYKLQkgICAobWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfVFBJU1RBVFVTKSAmIDB4ODAwMCkpKSB7Ci0JCS8qIGVuYWJsZS9kaXNhYmxlIE1ESS9NREktWCBhdXRvLXN3aXRjaGluZy4KLQkJICAgTURJL01ESS1YIGF1dG8tc3dpdGNoaW5nIGlzIGRpc2FibGVkIGZvciA4MjU1MUVSL1FNIGNoaXBzICovCi0JCWlmKChuaWMtPm1hYyA9PSBtYWNfODI1NTFfRSkgfHwgKG5pYy0+bWFjID09IG1hY184MjU1MV9GKSB8fAotCQkgICAobmljLT5tYWMgPT0gbWFjXzgyNTUxXzEwKSB8fCAobmljLT5taWkuZm9yY2VfbWVkaWEpIHx8Ci0JCSAgICEobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkKLQkJCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OQ09ORklHLCAwKTsKLQkJZWxzZQotCQkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05DT05GSUcsIE5DT05GSUdfQVVUT19TV0lUQ0gpOworCSAgIChtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9UUElTVEFUVVMpICYgMHg4MDAwKSAmJgorCQkhKG5pYy0+ZWVwcm9tW2VlcHJvbV9jbmZnX21kaXhdICYgZWVwcm9tX21kaXhfZW5hYmxlZCkpKSB7CisJCS8qIGVuYWJsZS9kaXNhYmxlIE1ESS9NREktWCBhdXRvLXN3aXRjaGluZy4gKi8KKwkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05DT05GSUcsCisJCQkJbmljLT5taWkuZm9yY2VfbWVkaWEgPyAwIDogTkNPTkZJR19BVVRPX1NXSVRDSCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNzY3LDExICsxNzYzLDEwIEBACiAjZGVmaW5lIFJGRF9CVUZfTEVOIChzaXplb2Yoc3RydWN0IHJmZCkgKyBWTEFOX0VUSF9GUkFNRV9MRU4pCiBzdGF0aWMgaW50IGUxMDBfcnhfYWxsb2Nfc2tiKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKIHsKLQlpZighKHJ4LT5za2IgPSBkZXZfYWxsb2Nfc2tiKFJGRF9CVUZfTEVOICsgTkVUX0lQX0FMSUdOKSkpCisJaWYoIShyeC0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuaWMtPm5ldGRldiwgUkZEX0JVRl9MRU4gKyBORVRfSVBfQUxJR04pKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBBbGlnbiwgaW5pdCwgYW5kIG1hcCB0aGUgUkZELiAqLwotCXJ4LT5za2ItPmRldiA9IG5pYy0+bmV0ZGV2OwogCXNrYl9yZXNlcnZlKHJ4LT5za2IsIE5FVF9JUF9BTElHTik7CiAJbWVtY3B5KHJ4LT5za2ItPmRhdGEsICZuaWMtPmJsYW5rX3JmZCwgc2l6ZW9mKHN0cnVjdCByZmQpKTsKIAlyeC0+ZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsIHJ4LT5za2ItPmRhdGEsCkBAIC0yMTQ3LDcgKzIxNDIsNyBAQAogCiAJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMsIE5VTEwpOwogCi0JaWYoIShza2IgPSBkZXZfYWxsb2Nfc2tiKEVUSF9EQVRBX0xFTikpKSB7CisJaWYoIShza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5pYy0+bmV0ZGV2LCBFVEhfREFUQV9MRU4pKSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9sb29wYmFja19ub25lOwogCX0KQEAgLTI3OTksNiArMjc5NCw3IEBACiAJLyogRGV0YWNoOyBwdXQgbmV0aWYgaW50byBzdGF0ZSBzaW1pbGFyIHRvIGhvdHBsdWcgdW5wbHVnLiAqLwogCW5ldGlmX3BvbGxfZW5hYmxlKG5ldGRldik7CiAJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCS8qIFJlcXVlc3QgYSBzbG90IHJlc2V0LiAqLwogCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwpAQCAtMjg3Nyw3ICsyODczLDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CiAJfQotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmUxMDBfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZTEwMF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZTEwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKaW5kZXggZDMwNDI5Ny4uOThhZmE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCkBAIC0yNDIsMTIgKzI0MiwxMCBAQAogCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9pbmZvX3RpbWVyOwogCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKLSAgICAJdWludDE2X3QgbW5nX3ZsYW5faWQ7CisJdWludDE2X3QgbW5nX3ZsYW5faWQ7CiAJdWludDMyX3QgYmRfbnVtYmVyOwogCXVpbnQzMl90IHJ4X2J1ZmZlcl9sZW47Ci0JdWludDMyX3QgcGFydF9udW07CiAJdWludDMyX3Qgd29sOwotCXVpbnQzMl90IGtzcDNfcG9ydF9hOwogCXVpbnQzMl90IHNtYXJ0c3BlZWQ7CiAJdWludDMyX3QgZW5fbW5nX3B0OwogCXVpbnQxNl90IGxpbmtfc3BlZWQ7CkBAIC0zNDIsNyArMzQwLDkgQEAKIAlib29sZWFuX3QgdHNvX2ZvcmNlOwogI2VuZGlmCiAJYm9vbGVhbl90IHNtYXJ0X3Bvd2VyX2Rvd247CS8qIHBoeSBzbWFydCBwb3dlciBkb3duICovCisJYm9vbGVhbl90IHF1YWRfcG9ydF9hOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgZWVwcm9tX3dvbDsKIH07CiAKIGVudW0gZTEwMDBfc3RhdGVfdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggODhhODJiYS4uM2ZjY2ZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtMTgzLDYgKzE4Myw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fRTEwMDBfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQltc2xlZXAoMSk7CisKIAlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlody0+YXV0b25lZyA9IDE7CiAJCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQpAQCAtMTk5LDE2ICsyMDIsMjAgQEAKIAkJCQkJCSAgQURWRVJUSVNFRF9UUDsKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBody0+YXV0b25lZ19hZHZlcnRpc2VkOwogCX0gZWxzZQotCQlpZiAoZTEwMDBfc2V0X3NwZF9kcGx4KGFkYXB0ZXIsIGVjbWQtPnNwZWVkICsgZWNtZC0+ZHVwbGV4KSkKKwkJaWYgKGUxMDAwX3NldF9zcGRfZHBseChhZGFwdGVyLCBlY21kLT5zcGVlZCArIGVjbWQtPmR1cGxleCkpIHsKKwkJCWNsZWFyX2JpdChfX0UxMDAwX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkvKiByZXNldCB0aGUgbGluayAqLwogCi0JaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKLQkJZTEwMDBfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKLQllbHNlCisJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQllMTAwMF91cChhZGFwdGVyKTsKKwl9IGVsc2UKIAkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CiAKKwljbGVhcl9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzOCw5ICsyNDUsMTMgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlpbnQgcmV0dmFsID0gMDsKIAogCWFkYXB0ZXItPmZjX2F1dG9uZWcgPSBwYXVzZS0+YXV0b25lZzsKIAorCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fRTEwMDBfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQltc2xlZXAoMSk7CisKIAlpZiAocGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKIAkJaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKIAllbHNlIGlmIChwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKQEAgLTI1MywxNSArMjY0LDE3IEBACiAJaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOwogCiAJaWYgKGFkYXB0ZXItPmZjX2F1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKLQkJCWUxMDAwX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7Ci0JCWVsc2UKKwkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJCWUxMDAwX3VwKGFkYXB0ZXIpOworCQl9IGVsc2UKIAkJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCX0gZWxzZQotCQlyZXR1cm4gKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSA/Ci0JCQllMTAwMF9zZXR1cF9saW5rKGh3KSA6IGUxMDAwX2ZvcmNlX21hY19mYyhodykpOworCQlyZXR2YWwgPSAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpID8KKwkJCSAgIGUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CiAKLQlyZXR1cm4gMDsKKwljbGVhcl9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHVpbnQzMl90CkBAIC00MTUsMTIgKzQyOCwxMiBAQAogCQlyZWdzX2J1ZmZbMjNdID0gcmVnc19idWZmWzE4XTsgLyogbWRpeCBtb2RlICovCiAJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDApOwogCX0gZWxzZSB7Ci0gICAgICAgIAllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywgJnBoeV9kYXRhKTsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsICZwaHlfZGF0YSk7CiAJCXJlZ3NfYnVmZlsxM10gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIGxlbmd0aCAqLwogCQlyZWdzX2J1ZmZbMTRdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLwogCQlyZWdzX2J1ZmZbMTVdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLwogCQlyZWdzX2J1ZmZbMTZdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLwotICAgICAgICAJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CiAJCXJlZ3NfYnVmZlsxN10gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGV4dGVuZGVkIDEwYnQgZGlzdGFuY2UgKi8KIAkJcmVnc19idWZmWzE4XSA9IHJlZ3NfYnVmZlsxM107IC8qIGNhYmxlIHBvbGFyaXR5ICovCiAJCXJlZ3NfYnVmZlsxOV0gPSAwOyAgLyogRHVtbXkgKHRvIGFsaWduIHcvIElHUCBwaHkgcmVnIGR1bXApICovCkBAIC02OTYsNyArNzA5LDYgQEAKIAl9CiAKIAljbGVhcl9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7Ci0KIAlyZXR1cm4gMDsKIGVycl9zZXR1cF90eDoKIAllMTAwMF9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CkBAIC04ODEsMTYgKzg5MywxNyBAQAogCiAJKmRhdGEgPSAwOwogCisJLyogTk9URTogd2UgZG9uJ3QgdGVzdCBNU0kgaW50ZXJydXB0cyBoZXJlLCB5ZXQgKi8KIAkvKiBIb29rIHVwIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIganVzdCBmb3IgdGhpcyB0ZXN0ICovCiAJaWYgKCFyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIElSUUZfUFJPQkVfU0hBUkVELAotCQkJIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkgewotIAkJc2hhcmVkX2ludCA9IEZBTFNFOwotIAl9IGVsc2UgaWYgKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsCi0JCQkgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpeworCQkJIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkKKwkJc2hhcmVkX2ludCA9IEZBTFNFOworCWVsc2UgaWYgKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsCisJCQkgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gLTE7CiAJfQotCURQUklOVEsoUFJPQkUsSU5GTywgInRlc3RpbmcgJXMgaW50ZXJydXB0XG4iLAorCURQUklOVEsoSFcsIElORk8sICJ0ZXN0aW5nICVzIGludGVycnVwdFxuIiwKIAkgICAgICAgIChzaGFyZWRfaW50ID8gInNoYXJlZCIgOiAidW5zaGFyZWQiKSk7CiAKIAkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLwpAQCAtMTI1NiwxMSArMTI2OSwxMCBAQAogCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIDB4OTE0MCk7CiAJCS8qIGF1dG9uZWcgb2ZmICovCiAJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgMHg4MTQwKTsKLQl9IGVsc2UgaWYgKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKSB7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykKIAkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsCiAJCSAgICAgICAgICAgICAgICAgICAgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsCiAJCSAgICAgICAgICAgICAgICAgICAgMHgxQ0MpOwotCX0KIAogCWN0cmxfcmVnID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKIApAQCAtMTI4OCw5ICsxMzAwLDkgQEAKIAl9CiAKIAlpZiAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciAmJgotCSAgIGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkgICBhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KQogCQljdHJsX3JlZyB8PSBFMTAwMF9DVFJMX0lMT1M7IC8qIEludmVydCBMb3NzIG9mIFNpZ25hbCAqLwotCX0gZWxzZSB7CisJZWxzZSB7CiAJCS8qIFNldCB0aGUgSUxPUyBiaXQgb24gdGhlIGZpYmVyIE5pYyBpcyBoYWxmCiAJCSAqIGR1cGxleCBsaW5rIGlzIGRldGVjdGVkLiAqLwogCQlzdGF0X3JlZyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKTsKQEAgLTE0MjYsMTEgKzE0MzgsMTAgQEAKIAljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgogCWRlZmF1bHQ6CiAJCWh3LT5hdXRvbmVnID0gVFJVRTsKLQkJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykgeworCQlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKQogCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKIAkJCQkJICAgIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLAogCQkJCQkgICAgMHgxODApOwotCQl9CiAJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfcmVnKTsKIAkJaWYgKHBoeV9yZWcgJiBNSUlfQ1JfTE9PUEJBQ0spIHsKIAkJCXBoeV9yZWcgJj0gfk1JSV9DUl9MT09QQkFDSzsKQEAgLTE1OTAsNiArMTYwMSw4IEBACiAJcmV0dXJuIEUxMDAwX1RFU1RfTEVOOwogfQogCitleHRlcm4gdm9pZCBlMTAwMF9wb3dlcl91cF9waHkoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKik7CisKIHN0YXRpYyB2b2lkCiBlMTAwMF9kaWFnX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsIHVpbnQ2NF90ICpkYXRhKQpAQCAtMTYwNiw2ICsxNjE5LDggQEAKIAkJdWludDhfdCBmb3JjZWRfc3BlZWRfZHVwbGV4ID0gYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleDsKIAkJdWludDhfdCBhdXRvbmVnID0gYWRhcHRlci0+aHcuYXV0b25lZzsKIAorCQlEUFJJTlRLKEhXLCBJTkZPLCAib2ZmbGluZSB0ZXN0aW5nIHN0YXJ0aW5nXG4iKTsKKwogCQkvKiBMaW5rIHRlc3QgcGVyZm9ybWVkIGJlZm9yZSBoYXJkd2FyZSByZXNldCBzbyBhdXRvbmVnIGRvZXNuJ3QKIAkJICogaW50ZXJmZXJlIHdpdGggdGVzdCByZXN1bHQgKi8KIAkJaWYgKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCkBAIC0xNjI5LDYgKzE2NDQsOCBAQAogCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIAogCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJLyogbWFrZSBzdXJlIHRoZSBwaHkgaXMgcG93ZXJlZCB1cCAqLworCQllMTAwMF9wb3dlcl91cF9waHkoYWRhcHRlcik7CiAJCWlmIChlMTAwMF9sb29wYmFja190ZXN0KGFkYXB0ZXIsICZkYXRhWzNdKSkKIAkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAKQEAgLTE2NDIsNiArMTY1OSw3IEBACiAJCWlmIChpZl9ydW5uaW5nKQogCQkJZGV2X29wZW4obmV0ZGV2KTsKIAl9IGVsc2UgeworCQlEUFJJTlRLKEhXLCBJTkZPLCAib25saW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCQkvKiBPbmxpbmUgdGVzdHMgKi8KIAkJaWYgKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwpAQCAtMTY1NywxNCArMTY3NSwxMiBAQAogCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDQgKiAxMDAwKTsKIH0KIAotc3RhdGljIHZvaWQKLWUxMDAwX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQorc3RhdGljIGludCBlMTAwMF93b2xfZXhjbHVzaW9uKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJaW50IHJldHZhbCA9IDE7IC8qIGZhaWwgYnkgZGVmYXVsdCAqLwogCi0Jc3dpdGNoIChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKwlzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CkBAIC0xNjcyLDUyICsxNjg4LDg3IEBACiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9GSUJFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0NPUFBFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUENJRToKKwkJLyogdGhlc2UgZG9uJ3Qgc3VwcG9ydCBXb0wgYXQgYWxsICovCiAJCXdvbC0+c3VwcG9ydGVkID0gMDsKLQkJd29sLT53b2xvcHRzICAgPSAwOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX0NPUFBFUjoKKwkJLyogV2FrZSBldmVudHMgbm90IHN1cHBvcnRlZCBvbiBwb3J0IEIgKi8KKwkJaWYgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkgeworCQkJd29sLT5zdXBwb3J0ZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJLyogcmV0dXJuIHN1Y2Nlc3MgZm9yIG5vbiBleGNsdWRlZCBhZGFwdGVyIHBvcnRzICovCisJCXJldHZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgorCQkvKiBxdWFkIHBvcnQgYWRhcHRlcnMgb25seSBzdXBwb3J0IFdvTCBvbiBwb3J0IEEgKi8KKwkJaWYgKCFhZGFwdGVyLT5xdWFkX3BvcnRfYSkgeworCQkJd29sLT5zdXBwb3J0ZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJLyogcmV0dXJuIHN1Y2Nlc3MgZm9yIG5vbiBleGNsdWRlZCBhZGFwdGVyIHBvcnRzICovCisJCXJldHZhbCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGR1YWwgcG9ydCBjYXJkcyBvbmx5IHN1cHBvcnQgV29MIG9uIHBvcnQgQSBmcm9tIG5vdyBvbgorCQkgKiB1bmxlc3MgaXQgd2FzIGVuYWJsZWQgaW4gdGhlIGVlcHJvbSBmb3IgcG9ydCBCCisJCSAqIHNvIGV4Y2x1ZGUgRlVOQ18xIHBvcnRzIGZyb20gaGF2aW5nIFdvTCBlbmFibGVkICovCisJCWlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEgJiYKKwkJICAgICFhZGFwdGVyLT5lZXByb21fd29sKSB7CisJCQl3b2wtPnN1cHBvcnRlZCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXJldHZhbCA9IDA7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfAorCSAgICAgICAgICAgICAgICAgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKworCS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgLT5zdXBwb3J0ZWQgPSAwIGFuZCByZXR1cm4gMSBpZiB3b2wgaXMgbm90CisJICogc3VwcG9ydGVkIGJ5IHRoaXMgaGFyZHdhcmUgKi8KKwlpZiAoZTEwMDBfd29sX2V4Y2x1c2lvbihhZGFwdGVyLCB3b2wpKQogCQlyZXR1cm47CiAKKwkvKiBhcHBseSBhbnkgc3BlY2lmaWMgdW5zdXBwb3J0ZWQgbWFza3MgaGVyZSAqLworCXN3aXRjaCAoYWRhcHRlci0+aHcuZGV2aWNlX2lkKSB7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgotCQkvKiBkZXZpY2UgaWQgMTBCNSBwb3J0LUEgc3VwcG9ydHMgd29sICovCi0JCWlmICghYWRhcHRlci0+a3NwM19wb3J0X2EpIHsKLQkJCXdvbC0+c3VwcG9ydGVkID0gMDsKLQkJCXJldHVybjsKLQkJfQotCQkvKiBLU1AzIGRvZXMgbm90IHN1cHBwb3J0IFVDQVNUIHdha2UtdXBzIGZvciBhbnkgaW50ZXJmYWNlICovCi0JCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDOworCQkvKiBLU1AzIGRvZXMgbm90IHN1cHBwb3J0IFVDQVNUIHdha2UtdXBzICovCisJCXdvbC0+c3VwcG9ydGVkICY9IH5XQUtFX1VDQVNUOwogCiAJCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX0VYKQogCQkJRFBSSU5USyhEUlYsIEVSUiwgIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0ICIKIAkJICAgICAgICAiZGlyZWN0ZWQgKHVuaWNhc3QpIGZyYW1lIHdha2UtdXAgcGFja2V0c1xuIik7Ci0JCXdvbC0+d29sb3B0cyA9IDA7Ci0JCWdvdG8gZG9fZGVmYXVsdHM7Ci0KLQljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKLQkJLyogV2FrZSBldmVudHMgb25seSBzdXBwb3J0ZWQgb24gcG9ydCBBIGZvciBkdWFsIGZpYmVyICovCi0JCWlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpIHsKLQkJCXdvbC0+c3VwcG9ydGVkID0gMDsKLQkJCXdvbC0+d29sb3B0cyAgID0gMDsKLQkJCXJldHVybjsKLQkJfQotCQkvKiBGYWxsIFRocm91Z2ggKi8KLQorCQlicmVhazsKIAlkZWZhdWx0OgotCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwKLQkJCQkgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUM7Ci0JCXdvbC0+d29sb3B0cyA9IDA7Ci0KLWRvX2RlZmF1bHRzOgotCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19FWCkKLQkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOwotCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19NQykKLQkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01DQVNUOwotCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19CQykKLQkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX0JDQVNUOwotCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19NQUcpCi0JCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKLQkJcmV0dXJuOworCQlicmVhazsKIAl9CisKKwlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19FWCkKKwkJd29sLT53b2xvcHRzIHw9IFdBS0VfVUNBU1Q7CisJaWYgKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01DQVNUOworCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX0JDKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19NQUcpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCisJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNzI2LDUyICsxNzc3LDM2IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlzd2l0Y2ggKGFkYXB0ZXItPmh3LmRldmljZV9pZCkgewotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQyOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0NPUFBFUjoKKwlpZiAod29sLT53b2xvcHRzICYgKFdBS0VfUEhZIHwgV0FLRV9BUlAgfCBXQUtFX01BR0lDU0VDVVJFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGUxMDAwX3dvbF9leGNsdXNpb24oYWRhcHRlciwgd29sKSkKIAkJcmV0dXJuIHdvbC0+d29sb3B0cyA/IC1FT1BOT1RTVVBQIDogMDsKIAorCXN3aXRjaCAoaHctPmRldmljZV9pZCkgewogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKLQkJLyogZGV2aWNlIGlkIDEwQjUgcG9ydC1BIHN1cHBvcnRzIHdvbCAqLwotCQlpZiAoIWFkYXB0ZXItPmtzcDNfcG9ydF9hKQotCQkJcmV0dXJuIHdvbC0+d29sb3B0cyA/IC1FT1BOT1RTVVBQIDogMDsKLQogCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkgewogCQkJRFBSSU5USyhEUlYsIEVSUiwgIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0ICIKIAkJICAgICAgICAiZGlyZWN0ZWQgKHVuaWNhc3QpIGZyYW1lIHdha2UtdXAgcGFja2V0c1xuIik7CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KLQotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2RUJfRklCRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX0ZJQkVSOgotCQkvKiBXYWtlIGV2ZW50cyBvbmx5IHN1cHBvcnRlZCBvbiBwb3J0IEEgZm9yIGR1YWwgZmliZXIgKi8KLQkJaWYgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkKLQkJCXJldHVybiB3b2wtPndvbG9wdHMgPyAtRU9QTk9UU1VQUCA6IDA7Ci0JCS8qIEZhbGwgVGhyb3VnaCAqLwotCisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWlmICh3b2wtPndvbG9wdHMgJiAoV0FLRV9QSFkgfCBXQUtFX0FSUCB8IFdBS0VfTUFHSUNTRUNVUkUpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JCWFkYXB0ZXItPndvbCA9IDA7Ci0KLQkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCi0JCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19FWDsKLQkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUNBU1QpCi0JCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQzsKLQkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfQkNBU1QpCi0JCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19CQzsKLQkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCi0JCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQUc7CisJCWJyZWFrOwogCX0KIAorCS8qIHRoZXNlIHNldHRpbmdzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIHdoYXQgd2UgY3VycmVudGx5IGhhdmUgKi8KKwlhZGFwdGVyLT53b2wgPSAwOworCisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCisJCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX0VYOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQorCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQzsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkKKwkJYWRhcHRlci0+d29sIHw9IEUxMDAwX1dVRkNfQkM7CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX01BRzsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODk1LDggKzE5MzAsOCBAQAogCS5nZXRfcmVncyAgICAgICAgICAgICAgID0gZTEwMDBfZ2V0X3JlZ3MsCiAJLmdldF93b2wgICAgICAgICAgICAgICAgPSBlMTAwMF9nZXRfd29sLAogCS5zZXRfd29sICAgICAgICAgICAgICAgID0gZTEwMDBfc2V0X3dvbCwKLQkuZ2V0X21zZ2xldmVsCSAgICAgICAgPSBlMTAwMF9nZXRfbXNnbGV2ZWwsCi0JLnNldF9tc2dsZXZlbAkgICAgICAgID0gZTEwMDBfc2V0X21zZ2xldmVsLAorCS5nZXRfbXNnbGV2ZWwgICAgICAgICAgID0gZTEwMDBfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgICAgICAgICAgID0gZTEwMDBfc2V0X21zZ2xldmVsLAogCS5ud2F5X3Jlc2V0ICAgICAgICAgICAgID0gZTEwMDBfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9lZXByb21fbGVuICAgICAgICAgPSBlMTAwMF9nZXRfZWVwcm9tX2xlbiwKQEAgLTE5MDQsMTcgKzE5MzksMTcgQEAKIAkuc2V0X2VlcHJvbSAgICAgICAgICAgICA9IGUxMDAwX3NldF9lZXByb20sCiAJLmdldF9yaW5ncGFyYW0gICAgICAgICAgPSBlMTAwMF9nZXRfcmluZ3BhcmFtLAogCS5zZXRfcmluZ3BhcmFtICAgICAgICAgID0gZTEwMDBfc2V0X3JpbmdwYXJhbSwKLQkuZ2V0X3BhdXNlcGFyYW0JCT0gZTEwMDBfZ2V0X3BhdXNlcGFyYW0sCi0JLnNldF9wYXVzZXBhcmFtCQk9IGUxMDAwX3NldF9wYXVzZXBhcmFtLAotCS5nZXRfcnhfY3N1bQkJPSBlMTAwMF9nZXRfcnhfY3N1bSwKLQkuc2V0X3J4X2NzdW0JCT0gZTEwMDBfc2V0X3J4X2NzdW0sCi0JLmdldF90eF9jc3VtCQk9IGUxMDAwX2dldF90eF9jc3VtLAotCS5zZXRfdHhfY3N1bQkJPSBlMTAwMF9zZXRfdHhfY3N1bSwKLQkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKLQkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3BhdXNlcGFyYW0gICAgICAgICA9IGUxMDAwX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbSAgICAgICAgID0gZTEwMDBfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtICAgICAgICAgICAgPSBlMTAwMF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gICAgICAgICAgICA9IGUxMDAwX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSAgICAgICAgICAgID0gZTEwMDBfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtICAgICAgICAgICAgPSBlMTAwMF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnICAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgICAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCiAjaWZkZWYgTkVUSUZfRl9UU08KLQkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCi0JLnNldF90c28JCT0gZTEwMDBfc2V0X3RzbywKKwkuZ2V0X3RzbyAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyAgICAgICAgICAgICAgICA9IGUxMDAwX3NldF90c28sCiAjZW5kaWYKIAkuc2VsZl90ZXN0X2NvdW50ICAgICAgICA9IGUxMDAwX2RpYWdfdGVzdF9jb3VudCwKIAkuc2VsZl90ZXN0ICAgICAgICAgICAgICA9IGUxMDAwX2RpYWdfdGVzdCwKQEAgLTE5MjIsNyArMTk1Nyw3IEBACiAJLnBoeXNfaWQgICAgICAgICAgICAgICAgPSBlMTAwMF9waHlzX2lkLAogCS5nZXRfc3RhdHNfY291bnQgICAgICAgID0gZTEwMDBfZ2V0X3N0YXRzX2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gZTEwMDBfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9wZXJtX2FkZHIJCT0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAorCS5nZXRfcGVybV9hZGRyICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAogfTsKIAogdm9pZCBlMTAwMF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IGIzYjkxOTEuLmE2ZjhmNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMzEsNiArMzEsNyBAQAogICogU2hhcmVkIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGFuZCBjb25maWd1cmluZyB0aGUgTUFDCiAgKi8KIAorCiAjaW5jbHVkZSAiZTEwMDBfaHcuaCIKIAogc3RhdGljIGludDMyX3QgZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMTY2LDEwICsxNjcsMTAgQEAKIHsKICAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfdHlwZSIpOwogCi0gICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwX3VuZGVmaW5lZCkKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX3VuZGVmaW5lZCkKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CiAKLSAgICBzd2l0Y2goaHctPnBoeV9pZCkgeworICAgIHN3aXRjaCAoaHctPnBoeV9pZCkgewogICAgIGNhc2UgTTg4RTEwMDBfRV9QSFlfSUQ6CiAgICAgY2FzZSBNODhFMTAwMF9JX1BIWV9JRDoKICAgICBjYXNlIE04OEUxMDExX0lfUEhZX0lEOgpAQCAtMTc3LDEwICsxNzgsMTAgQEAKICAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X204ODsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJR1AwMUUxMDAwX0lfUEhZX0lEOgotICAgICAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwKLSAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8Ci0gICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAotICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSB8fAorICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKKyAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgewogICAgICAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lncDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDcsNiArMjA4LDcgQEAKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJR1AgcGh5IGluaXQgc2NyaXB0IC0gaW5pdGlhbGl6ZXMgdGhlIEdiRSBQSFkKICAqCkBAIC0yMjAsNyArMjIyLDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2luaXRfc2NyaXB0Iik7CiAKLSAgICBpZihody0+cGh5X2luaXRfc2NyaXB0KSB7CisgICAgaWYgKGh3LT5waHlfaW5pdF9zY3JpcHQpIHsKICAgICAgICAgbXNlY19kZWxheSgyMCk7CiAKICAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0CkBAIC0yMzYsNyArMjM4LDcgQEAKIAogICAgICAgICBtc2VjX2RlbGF5KDUpOwogCi0gICAgICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICAgICAgY2FzZSBlMTAwMF84MjU0MToKICAgICAgICAgY2FzZSBlMTAwMF84MjU0NzoKICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NSwgMHgwMDAxKTsKQEAgLTI3MywyMiArMjc1LDIyIEBACiAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCiAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgcGh5X3NhdmVkX2RhdGEpOwogCi0gICAgICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgeworICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CiAgICAgICAgICAgICB1aW50MTZfdCBmdXNlZCwgZmluZSwgY29hcnNlOwogCiAgICAgICAgICAgICAvKiBNb3ZlIHRvIGFuYWxvZyByZWdpc3RlcnMgcGFnZSAqLwogICAgICAgICAgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUywgJmZ1c2VkKTsKIAotICAgICAgICAgICAgaWYoIShmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgIGlmICghKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEKSkgewogICAgICAgICAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9TVEFUVVMsICZmdXNlZCk7CiAKICAgICAgICAgICAgICAgICBmaW5lID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfTUFTSzsKICAgICAgICAgICAgICAgICBjb2Fyc2UgPSBmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0s7CiAKLSAgICAgICAgICAgICAgICBpZihjb2Fyc2UgPiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29hcnNlID4gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvYXJzZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKICAgICAgICAgICAgICAgICAgICAgZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY29hcnNlID09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvYXJzZSA9PSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpCiAgICAgICAgICAgICAgICAgICAgIGZpbmUgLT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwOwogCiAgICAgICAgICAgICAgICAgZnVzZWQgPSAoZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1BPTFlfTUFTSykgfApAQCAtMzg3LDYgKzM4OSw3IEBACiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9DT1BQRVI6CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgogICAgICAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NzE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcyRUlfQ09QUEVSOgpAQCAtNDE4LDcgKzQyMSw3IEBACiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX01BQ19UWVBFOwogICAgIH0KIAotICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewogICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKICAgICAgICAgaHctPnN3Zndod19zZW1hcGhvcmVfcHJlc2VudCA9IFRSVUU7CiAgICAgICAgIGh3LT5hc2ZfZmlybXdhcmVfcHJlc2VudCA9IFRSVUU7CkBAIC00NTYsNyArNDU5LDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X21lZGlhX3R5cGUiKTsKIAotICAgIGlmKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0MykgeworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDMpIHsKICAgICAgICAgLyogdGJpX2NvbXBhdGliaWxpdHkgaXMgb25seSB2YWxpZCBvbiA4MjU0MyAqLwogICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKICAgICB9CkBAIC01MTYsMTYgKzUxOSwxNiBAQAogICAgIERFQlVHRlVOQygiZTEwMDBfcmVzZXRfaHciKTsKIAogICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIGRpc2FibGUgTVdJIGJlZm9yZSBpc3N1aW5nIGEgZGV2aWNlIHJlc2V0ICovCi0gICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CiAgICAgICAgIERFQlVHT1VUKCJEaXNhYmxpbmcgTVdJIG9uIDgyNTQyIHJldiAyLjBcbiIpOwogICAgICAgICBlMTAwMF9wY2lfY2xlYXJfbXdpKGh3KTsKICAgICB9CiAKLSAgICBpZihody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpX2V4cHJlc3MpIHsKKyAgICBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzKSB7CiAgICAgICAgIC8qIFByZXZlbnQgdGhlIFBDSS1FIGJ1cyBmcm9tIHN0aWNraW5nIGlmIHRoZXJlIGlzIG5vIFRMUCBjb25uZWN0aW9uCiAgICAgICAgICAqIG9uIHRoZSBsYXN0IFRMUCByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdoZW4gTUFDIGlzIHJlc2V0LgogICAgICAgICAgKi8KLSAgICAgICAgaWYoZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoaHcpICE9IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKGUxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyKGh3KSAhPSBFMTAwMF9TVUNDRVNTKSB7CiAgICAgICAgICAgICBERUJVR09VVCgiUENJLUUgTWFzdGVyIGRpc2FibGUgcG9sbGluZyBoYXMgZmFpbGVkLlxuIik7CiAgICAgICAgIH0KICAgICB9CkBAIC01NTMsMTQgKzU1NiwxNCBAQAogICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CiAKICAgICAvKiBNdXN0IHJlc2V0IHRoZSBQSFkgYmVmb3JlIHJlc2V0dGluZyB0aGUgTUFDICovCi0gICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOwogICAgICAgICBtc2VjX2RlbGF5KDUpOwogICAgIH0KIAogICAgIC8qIE11c3QgYWNxdWlyZSB0aGUgTURJTyBvd25lcnNoaXAgYmVmb3JlIE1BQyByZXNldC4KICAgICAgKiBPd25lcnNoaXAgZGVmYXVsdHMgdG8gZmlybXdhcmUgYWZ0ZXIgYSByZXNldC4gKi8KLSAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CiAgICAgICAgIHRpbWVvdXQgPSAxMDsKIAogICAgICAgICBleHRjbmZfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFWFRDTkZfQ1RSTCk7CkBAIC01NzAsMTQgKzU3MywxNCBAQAogICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOwogICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOwogCi0gICAgICAgICAgICBpZihleHRjbmZfY3RybCAmIEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQKQorICAgICAgICAgICAgaWYgKGV4dGNuZl9jdHJsICYgRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVApCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgZXh0Y25mX2N0cmwgfD0gRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVA7CiAKICAgICAgICAgICAgIG1zZWNfZGVsYXkoMik7CiAgICAgICAgICAgICB0aW1lb3V0LS07Ci0gICAgICAgIH0gd2hpbGUodGltZW91dCk7CisgICAgICAgIH0gd2hpbGUgKHRpbWVvdXQpOwogICAgIH0KIAogICAgIC8qIFdvcmthcm91bmQgZm9yIElDSDggYml0IGNvcnJ1cHRpb24gaXNzdWUgaW4gRklGTyBtZW1vcnkgKi8KQEAgLTU5NSw3ICs1OTgsNyBAQAogICAgICAqLwogICAgIERFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CiAKLSAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICAgICAgY2FzZSBlMTAwMF84MjU0NDoKICAgICAgICAgY2FzZSBlMTAwMF84MjU0MDoKICAgICAgICAgY2FzZSBlMTAwMF84MjU0NToKQEAgLTYzNCw3ICs2MzcsNyBAQAogICAgICAqIGRldmljZS4gIExhdGVyIGNvbnRyb2xsZXJzIHJlbG9hZCB0aGUgRUVQUk9NIGF1dG9tYXRpY2FsbHksIHNvIGp1c3Qgd2FpdAogICAgICAqIGZvciByZWxvYWQgdG8gY29tcGxldGUuCiAgICAgICovCi0gICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgogICAgICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKICAgICAgICAgY2FzZSBlMTAwMF84MjU0MzoKQEAgLTY2OSw3ICs2NzIsNyBAQAogICAgICAgICBjYXNlIGUxMDAwX2ljaDhsYW46CiAgICAgICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZShodyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBjb250aW51ZSBhY2Nlc3NpbmcgTUFDIHJlZ2lzdGVycy4gKi8KICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgwLDEzICs2ODMsMTMgQEAKICAgICB9CiAKICAgICAvKiBEaXNhYmxlIEhXIEFSUHMgb24gQVNGIGVuYWJsZWQgYWRhcHRlcnMgKi8KLSAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJiBody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKICAgICAgICAgbWFuYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKICAgICAgICAgbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBNQU5DLCBtYW5jKTsKICAgICB9CiAKLSAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgeworICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgewogICAgICAgICBlMTAwMF9waHlfaW5pdF9zY3JpcHQoaHcpOwogCiAgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCkBAIC03MDQsOCArNzA3LDggQEAKICAgICBpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSKTsKIAogICAgIC8qIElmIE1XSSB3YXMgcHJldmlvdXNseSBlbmFibGVkLCByZWVuYWJsZSBpdC4gKi8KLSAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7Ci0gICAgICAgIGlmKGh3LT5wY2lfY21kX3dvcmQgJiBDTURfTUVNX1dSVF9JTlZBTElEQVRFKQorICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisgICAgICAgIGlmIChody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKICAgICAgICAgICAgIGUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKICAgICB9CiAKQEAgLTc0NSw5ICs3NDgsMjAgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOwogCisgICAgLyogZm9yY2UgZnVsbCBETUEgY2xvY2sgZnJlcXVlbmN5IGZvciAxMC8xMDAgb24gSUNIOCBBMC1CMCAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQVJDMCk7CisgICAgICAgIHJlZ19kYXRhIHw9IDB4MzAwMDAwMDA7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVEFSQzAsIHJlZ19kYXRhKTsKKworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICByZWdfZGF0YSAmPSB+MHg4MDAwMDAwMDsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTVEFUVVMsIHJlZ19kYXRhKTsKKyAgICB9CisKICAgICAvKiBJbml0aWFsaXplIElkZW50aWZpY2F0aW9uIExFRCAqLwogICAgIHJldF92YWwgPSBlMTAwMF9pZF9sZWRfaW5pdChodyk7Ci0gICAgaWYocmV0X3ZhbCkgeworICAgIGlmIChyZXRfdmFsKSB7CiAgICAgICAgIERFQlVHT1VUKCJFcnJvciBJbml0aWFsaXppbmcgSWRlbnRpZmljYXRpb24gTEVEXG4iKTsKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQpAQCAtNzY1LDcgKzc3OSw3IEBACiAgICAgfQogCiAgICAgLyogRm9yIDgyNTQyIChyZXYgMi4wKSwgZGlzYWJsZSBNV0kgYW5kIHB1dCB0aGUgcmVjZWl2ZXIgaW50byByZXNldCAqLwotICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgewogICAgICAgICBERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKICAgICAgICAgZTEwMDBfcGNpX2NsZWFyX213aShodyk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgRTEwMDBfUkNUTF9SU1QpOwpAQCAtNzc5LDExICs3OTMsMTEgQEAKICAgICBlMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKIAogICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIHRha2UgdGhlIHJlY2VpdmVyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlIE1XSSAqLwotICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgewogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIDApOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CiAgICAgICAgIG1zZWNfZGVsYXkoMSk7Ci0gICAgICAgIGlmKGh3LT5wY2lfY21kX3dvcmQgJiBDTURfTUVNX1dSVF9JTlZBTElEQVRFKQorICAgICAgICBpZiAoaHctPnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lOVkFMSURBVEUpCiAgICAgICAgICAgICBlMTAwMF9wY2lfc2V0X213aShodyk7CiAgICAgfQogCkBAIC03OTIsNyArODA2LDcgQEAKICAgICBtdGFfc2l6ZSA9IEUxMDAwX01DX1RCTF9TSVpFOwogICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKICAgICAgICAgbXRhX3NpemUgPSBFMTAwMF9NQ19UQkxfU0laRV9JQ0g4TEFOOwotICAgIGZvcihpID0gMDsgaSA8IG10YV9zaXplOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXRhX3NpemU7IGkrKykgewogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CiAgICAgICAgIC8qIHVzZSB3cml0ZSBmbHVzaCB0byBwcmV2ZW50IE1lbW9yeSBXcml0ZSBCbG9jayAoTVdCKSBmcm9tCiAgICAgICAgICAqIG9jY3VyaW5nIHdoZW4gYWNjZXNzaW5nIG91ciByZWdpc3RlciBzcGFjZSAqLwpAQCAtODA0LDE4ICs4MTgsMTggQEAKICAgICAgKiBnaXZlcyBlcXVhbCBwcmlvcml0eSB0byB0cmFuc21pdHMgYW5kIHJlY2VpdmVzLiAgVmFsaWQgb25seSBvbgogICAgICAqIDgyNTQyIGFuZCA4MjU0MyBzaWxpY29uLgogICAgICAqLwotICAgIGlmKGh3LT5kbWFfZmFpcm5lc3MgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzKSB7CisgICAgaWYgKGh3LT5kbWFfZmFpcm5lc3MgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzKSB7CiAgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCB8IEUxMDAwX0NUUkxfUFJJT1IpOwogICAgIH0KIAotICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewogICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CiAgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgUENJLVggcHJvYmxlbSB3aGVuIEJJT1Mgc2V0cyBNTVJCQyBpbmNvcnJlY3RseS4gKi8KLSAgICAgICAgaWYoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpIHsKKyAgICAgICAgaWYgKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSB7CiAgICAgICAgICAgICBlMTAwMF9yZWFkX3BjaV9jZmcoaHcsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgJnBjaXhfY21kX3dvcmQpOwogICAgICAgICAgICAgZTEwMDBfcmVhZF9wY2lfY2ZnKGh3LCBQQ0lYX1NUQVRVU19SRUdJU1RFUl9ISSwKICAgICAgICAgICAgICAgICAmcGNpeF9zdGF0X2hpX3dvcmQpOwpAQCAtODIzLDkgKzgzNyw5IEBACiAgICAgICAgICAgICAgICAgUENJWF9DT01NQU5EX01NUkJDX1NISUZUOwogICAgICAgICAgICAgc3RhdF9tbXJiYyA9IChwY2l4X3N0YXRfaGlfd29yZCAmIFBDSVhfU1RBVFVTX0hJX01NUkJDX01BU0spID4+CiAgICAgICAgICAgICAgICAgUENJWF9TVEFUVVNfSElfTU1SQkNfU0hJRlQ7Ci0gICAgICAgICAgICBpZihzdGF0X21tcmJjID09IFBDSVhfU1RBVFVTX0hJX01NUkJDXzRLKQorICAgICAgICAgICAgaWYgKHN0YXRfbW1yYmMgPT0gUENJWF9TVEFUVVNfSElfTU1SQkNfNEspCiAgICAgICAgICAgICAgICAgc3RhdF9tbXJiYyA9IFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLOwotICAgICAgICAgICAgaWYoY21kX21tcmJjID4gc3RhdF9tbXJiYykgeworICAgICAgICAgICAgaWYgKGNtZF9tbXJiYyA+IHN0YXRfbW1yYmMpIHsKICAgICAgICAgICAgICAgICBwY2l4X2NtZF93b3JkICY9IH5QQ0lYX0NPTU1BTkRfTU1SQkNfTUFTSzsKICAgICAgICAgICAgICAgICBwY2l4X2NtZF93b3JkIHw9IHN0YXRfbW1yYmMgPDwgUENJWF9DT01NQU5EX01NUkJDX1NISUZUOwogICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BjaV9jZmcoaHcsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKQEAgLTg0Myw3ICs4NTcsNyBAQAogICAgIHJldF92YWwgPSBlMTAwMF9zZXR1cF9saW5rKGh3KTsKIAogICAgIC8qIFNldCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciB3cml0ZS1iYWNrIHBvbGljeSAqLwotICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CiAgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgVFhEQ1RMKTsKICAgICAgICAgY3RybCA9IChjdHJsICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8IEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0I7CiAgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CkBAIC04OTQsMTQgKzkwOCwxMyBAQAogICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKICAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUWERDVEwxKTsKICAgICAgICAgY3RybCA9IChjdHJsICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8IEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0I7Ci0gICAgICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKICAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0M7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhEQ1RMMSwgY3RybCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAogCi0KICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CiAgICAgICAgIHVpbnQzMl90IGdjciA9IEUxMDAwX1JFQURfUkVHKGh3LCBHQ1IpOwogICAgICAgICBnY3IgfD0gRTEwMDBfR0NSX0wxX0FDVF9XSVRIT1VUX0wwU19SWDsKQEAgLTk0NSwxMCArOTU4LDEwIEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlIik7CiAKLSAgICBpZihody0+bWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykKKyAgICBpZiAoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpCiAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogCi0gICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKICAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgogICAgICAgICBicmVhazsKQEAgLTk2MSwxMSArOTc0LDExIEBACiAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIH0KIAotICAgIGlmKGVlcHJvbV9kYXRhICE9IEVFUFJPTV9SRVNFUlZFRF9XT1JEKSB7CisgICAgaWYgKGVlcHJvbV9kYXRhICE9IEVFUFJPTV9SRVNFUlZFRF9XT1JEKSB7CiAgICAgICAgIC8qIEFkanVzdCBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBvbmx5LiAqLwogICAgICAgICBlZXByb21fZGF0YSAmPSBFRVBST01fU0VSREVTX0FNUExJVFVERV9NQVNLOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0VYVF9DVFJMLCBlZXByb21fZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCkBAIC0xMDMzLDEwICsxMDQ2LDEwIEBACiAgICAgICogaW4gY2FzZSB3ZSBnZXQgZGlzY29ubmVjdGVkIGFuZCB0aGVuIHJlY29ubmVjdGVkIGludG8gYSBkaWZmZXJlbnQKICAgICAgKiBodWIgb3Igc3dpdGNoIHdpdGggZGlmZmVyZW50IEZsb3cgQ29udHJvbCBjYXBhYmlsaXRpZXMuCiAgICAgICovCi0gICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKICAgICAgICAgaHctPmZjICY9ICh+ZTEwMDBfZmNfdHhfcGF1c2UpOwogCi0gICAgaWYoKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSAmJiAoaHctPnJlcG9ydF90eF9lYXJseSA9PSAxKSkKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSAmJiAoaHctPnJlcG9ydF90eF9lYXJseSA9PSAxKSkKICAgICAgICAgaHctPmZjICY9ICh+ZTEwMDBfZmNfcnhfcGF1c2UpOwogCiAgICAgaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOwpAQCAtMTA1MSwxMiArMTA2NCwxMiBAQAogICAgICAqIG9yIGUxMDAwX3BoeV9zZXR1cCgpIGlzIGNhbGxlZC4KICAgICAgKi8KICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKSB7Ci0JCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLAotCQkJCQkJCQkJMSwgJmVlcHJvbV9kYXRhKTsKLQkJaWYgKHJldF92YWwpIHsKLQkJCURFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7Ci0JCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0JCX0KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQogICAgICAgICBjdHJsX2V4dCA9ICgoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1NXUERJT19FWFQpIDw8CiAgICAgICAgICAgICAgICAgICAgIFNXRFBJT19fRVhUX1NISUZUKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOwpAQCAtMTA4OSwxNCArMTEwMiwxNCBAQAogICAgICAqIGFiaWxpdHkgdG8gdHJhbnNtaXQgcGF1c2UgZnJhbWVzIGluIG5vdCBlbmFibGVkLCB0aGVuIHRoZXNlCiAgICAgICogcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIDAuCiAgICAgICovCi0gICAgaWYoIShody0+ZmMgJiBlMTAwMF9mY190eF9wYXVzZSkpIHsKKyAgICBpZiAoIShody0+ZmMgJiBlMTAwMF9mY190eF9wYXVzZSkpIHsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKICAgICAgICAgICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYoaHctPmZjX3NlbmRfeG9uKSB7CisgICAgICAgIGlmIChody0+ZmNfc2VuZF94b24pIHsKICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEwsIChody0+ZmNfbG93X3dhdGVyIHwgRTEwMDBfRkNSVExfWE9ORSkpOwogICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgaHctPmZjX2hpZ2hfd2F0ZXIpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTE0MywxMSArMTE1NiwxMSBAQAogICAgICAqIHRoZSBFRVBST00uCiAgICAgICovCiAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKLSAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQorICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQogICAgICAgICBzaWduYWwgPSAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpID8gRTEwMDBfQ1RSTF9TV0RQSU4xIDogMDsKIAogICAgIHJldF92YWwgPSBlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZShodyk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiByZXNldCAqLwpAQCAtMTE1NSw3ICsxMTY4LDcgQEAKIAogICAgIC8qIEFkanVzdCBWQ08gc3BlZWQgdG8gaW1wcm92ZSBCRVIgcGVyZm9ybWFuY2UgKi8KICAgICByZXRfdmFsID0gZTEwMDBfc2V0X3Zjb19zcGVlZChodyk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOwpAQCAtMTIyNiwxNSArMTIzOSwxNSBAQAogICAgICAqIGxlc3MgdGhhbiA1MDAgbWlsbGlzZWNvbmRzIGV2ZW4gaWYgdGhlIG90aGVyIGVuZCBpcyBkb2luZyBpdCBpbiBTVykuCiAgICAgICogRm9yIGludGVybmFsIHNlcmRlcywgd2UganVzdCBhc3N1bWUgYSBzaWduYWwgaXMgcHJlc2VudCwgdGhlbiBwb2xsLgogICAgICAqLwotICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CiAgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKSAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSB7CiAgICAgICAgIERFQlVHT1VUKCJMb29raW5nIGZvciBMaW5rXG4iKTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoTElOS19VUF9USU1FT1VUIC8gMTApOyBpKyspIHsKICAgICAgICAgICAgIG1zZWNfZGVsYXkoMTApOwogICAgICAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7Ci0gICAgICAgICAgICBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIGJyZWFrOworICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYoaSA9PSAoTElOS19VUF9USU1FT1VUIC8gMTApKSB7CisgICAgICAgIGlmIChpID09IChMSU5LX1VQX1RJTUVPVVQgLyAxMCkpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJOZXZlciBnb3QgYSB2YWxpZCBsaW5rIGZyb20gYXV0by1uZWchISFcbiIpOwogICAgICAgICAgICAgaHctPmF1dG9uZWdfZmFpbGVkID0gMTsKICAgICAgICAgICAgIC8qIEF1dG9OZWcgZmFpbGVkIHRvIGFjaGlldmUgYSBsaW5rLCBzbyB3ZSdsbCBjYWxsCkBAIC0xMjQzLDcgKzEyNTYsNyBAQAogICAgICAgICAgICAgICogbm9uLWF1dG9uZWdvdGlhdGluZyBsaW5rIHBhcnRuZXJzLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGxpbmtcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAgICAgfQpAQCAtMTI3Nyw3ICsxMjkwLDcgQEAKICAgICAgKiB0aGUgUEhZIHNwZWVkIGFuZCBkdXBsZXggY29uZmlndXJhdGlvbiBpcy4gSW4gYWRkaXRpb24sIHdlIG5lZWQgdG8KICAgICAgKiBwZXJmb3JtIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIFBIWSB0byB0YWtlIGl0IG91dCBvZiByZXNldC4KICAgICAgKi8KLSAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgewogICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU0xVOwogICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CkBAIC0xMjg1LDEzICsxMjk4LDEzIEBACiAgICAgICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFggfCBFMTAwMF9DVFJMX1NMVSk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIH0KIAogICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgUEhZICovCiAgICAgcmV0X3ZhbCA9IGUxMDAwX2RldGVjdF9naWdfcGh5KGh3KTsKLSAgICBpZihyZXRfdmFsKSB7CisgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgREVCVUdPVVQoIkVycm9yLCBkaWQgbm90IGRldGVjdCB2YWxpZCBwaHkuXG4iKTsKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQpAQCAtMTI5OSwxOSArMTMxMiwxOSBAQAogCiAgICAgLyogU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUgKGlmIG5lY2Vzc2FyeSkgKi8KICAgICByZXRfdmFsID0gZTEwMDBfc2V0X3BoeV9tb2RlKGh3KTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpIHx8CisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpIHx8CiAgICAgICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKICAgICAgICAgcGh5X2RhdGEgfD0gMHgwMDAwMDAwODsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKICAgICB9CiAKLSAgICBpZihody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDMgfHwKLSAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8Ci0gICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKKyAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzIHx8CisgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKKyAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKICAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gRkFMU0U7CiAKICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwpAQCAtMTM0MSw3ICsxMzU0LDcgQEAKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCi0gICAgLyogV2FpdCAxMG1zIGZvciBNQUMgdG8gY29uZmlndXJlIFBIWSBmcm9tIGVlcHJvbSBzZXR0aW5ncyAqLworICAgIC8qIFdhaXQgMTVtcyBmb3IgTUFDIHRvIGNvbmZpZ3VyZSBQSFkgZnJvbSBlZXByb20gc2V0dGluZ3MgKi8KICAgICBtc2VjX2RlbGF5KDE1KTsKICAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKICAgICAvKiBDb25maWd1cmUgYWN0aXZpdHkgTEVEIGFmdGVyIFBIWSByZXNldCAqLwpAQCAtMTM1MSwxMSArMTM2NCwxNCBAQAogICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRfY3RybCk7CiAgICAgfQogCi0gICAgLyogZGlzYWJsZSBscGx1IGQzIGR1cmluZyBkcml2ZXIgaW5pdCAqLwotICAgIHJldF92YWwgPSBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShodywgRkFMU0UpOwotICAgIGlmIChyZXRfdmFsKSB7Ci0gICAgICAgIERFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEM1xuIik7Ci0gICAgICAgIHJldHVybiByZXRfdmFsOworICAgIC8qIFRoZSBOVk0gc2V0dGluZ3Mgd2lsbCBjb25maWd1cmUgTFBMVSBpbiBEMyBmb3IgSUdQMiBhbmQgSUdQMyBQSFlzICovCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIC8qIGRpc2FibGUgbHBsdSBkMyBkdXJpbmcgZHJpdmVyIGluaXQgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9kM19scGx1X3N0YXRlKGh3LCBGQUxTRSk7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgRGlzYWJsaW5nIExQTFUgRDNcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBkaXNhYmxlIGxwbHUgZDAgZHVyaW5nIGRyaXZlciBpbml0ICovCkBAIC0xMzkzLDQ1ICsxNDA5LDQ1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KLSAgICBpZihody0+YXV0b25lZykgeworICAgIGlmIChody0+YXV0b25lZykgewogICAgICAgICBlMTAwMF9tc190eXBlIHBoeV9tc19zZXR0aW5nID0gaHctPm1hc3Rlcl9zbGF2ZTsKIAotICAgICAgICBpZihody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkKKyAgICAgICAgaWYgKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlKQogICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7CiAKLSAgICAgICAgaWYoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQpCisgICAgICAgIGlmIChody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKICAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOwogCiAgICAgICAgIC8qIHdoZW4gYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudCBpcyBvbmx5IDEwMDBNYnBzIHRoZW4gd2UKICAgICAgICAgICAqIHNob3VsZCBkaXNhYmxlIFNtYXJ0U3BlZWQgYW5kIGVuYWJsZSBBdXRvIE1hc3RlclNsYXZlCiAgICAgICAgICAgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCi0gICAgICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworICAgICAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CiAgICAgICAgICAgICAvKiBEaXNhYmxlIFNtYXJ0U3BlZWQgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAgICAgLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0KIAogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCkBAIC0xNDU1LDcgKzE0NzEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCkBAIC0xNDc2LDEyICsxNDkyLDEyIEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX2dncF9zZXR1cCIpOwogCi0gICAgaWYoIWh3LT5waHlfcmVzZXRfZGlzYWJsZSkgeworICAgIGlmICghaHctPnBoeV9yZXNldF9kaXNhYmxlKSB7CiAKICAgICAgICAgLyogRW5hYmxlIENSUyBvbiBUWCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19NU0NSX0FTU0VSVF9DUlNfT05fVFg7CkBAIC0xNDkwLDcgKzE1MDYsNyBAQAogCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgLyogT3B0aW9uczoKQEAgLTE1MDEsNyArMTUxNyw3IEBACiAgICAgICAgICAqICAgMyAtIEF1dG8gZm9yIDEwMDBCYXNlLVQgb25seSAoTURJLVggZm9yIDEwLzEwMEJhc2UtVCBtb2RlcykKICAgICAgICAgICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICBwaHlfZGF0YSAmPSB+R0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX01BU0s7CkBAIC0xNTI2LDExICsxNTQyLDExIEBACiAgICAgICAgICAqICAgMSAtIEVuYWJsZWQKICAgICAgICAgICovCiAgICAgICAgIHBoeV9kYXRhICY9IH5HRzgyNTYzX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfRElTQUJMRTsKLSAgICAgICAgaWYoaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9PSAxKQorICAgICAgICBpZiAoaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9PSAxKQogICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX0RJU0FCTEU7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKIAotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KQEAgLTE1ODYsOSArMTYwMiw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5HRzgyNTYzX0tNQ1JfUEFTU19GQUxTRV9DQVJSSUVSOwotCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisKICAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CkBAIC0xNjIzLDEyICsxNjM5LDEyIEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cCIpOwogCi0gICAgaWYoaHctPnBoeV9yZXNldF9kaXNhYmxlKQorICAgIGlmIChody0+cGh5X3Jlc2V0X2Rpc2FibGUpCiAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogCiAgICAgLyogRW5hYmxlIENSUyBvbiBUWC4gVGhpcyBtdXN0IGJlIHNldCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLwogICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CkBAIC0xNjY1LDcgKzE2ODEsNyBAQAogICAgICAqICAgMSAtIEVuYWJsZWQKICAgICAgKi8KICAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKLSAgICBpZihody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID09IDEpCisgICAgaWYgKGh3LT5kaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPT0gMSkKICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOwogICAgIGlmIChyZXRfdmFsKQpAQCAtMTcwNSw3ICsxNzIxLDcgQEAKIAogICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KICAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKLSAgICBpZihyZXRfdmFsKSB7CisgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQpAQCAtMTczNSw3ICsxNzUxLDcgQEAKICAgICAvKiBJZiBhdXRvbmVnX2FkdmVydGlzZWQgaXMgemVybywgd2UgYXNzdW1lIGl0IHdhcyBub3QgZGVmYXVsdGVkCiAgICAgICogYnkgdGhlIGNhbGxpbmcgY29kZSBzbyB3ZSBzZXQgdG8gYWR2ZXJ0aXNlIGZ1bGwgY2FwYWJpbGl0eS4KICAgICAgKi8KLSAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCisgICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gMCkKICAgICAgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQ7CiAKICAgICAvKiBJRkUgcGh5IG9ubHkgc3VwcG9ydHMgMTAvMTAwICovCkBAIC0xNzQ0LDcgKzE3NjAsNyBAQAogCiAgICAgREVCVUdPVVQoIlJlY29uZmlndXJpbmcgYXV0by1uZWcgYWR2ZXJ0aXNlbWVudCBwYXJhbXNcbiIpOwogICAgIHJldF92YWwgPSBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhodyk7Ci0gICAgaWYocmV0X3ZhbCkgeworICAgIGlmIChyZXRfdmFsKSB7CiAgICAgICAgIERFQlVHT1VUKCJFcnJvciBTZXR0aW5nIHVwIEF1dG8tTmVnb3RpYXRpb25cbiIpOwogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICB9CkBAIC0xNzU0LDIwICsxNzcwLDIwIEBACiAgICAgICogdGhlIEF1dG8gTmVnIFJlc3RhcnQgYml0IGluIHRoZSBQSFkgY29udHJvbCByZWdpc3Rlci4KICAgICAgKi8KICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIHBoeV9kYXRhIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CiAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAvKiBEb2VzIHRoZSB1c2VyIHdhbnQgdG8gd2FpdCBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUgaGVyZSwgb3IKICAgICAgKiBjaGVjayBhdCBhIGxhdGVyIHRpbWUgKGZvciBleGFtcGxlLCBjYWxsYmFjayByb3V0aW5lKS4KICAgICAgKi8KLSAgICBpZihody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlKSB7CisgICAgaWYgKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dhaXRfYXV0b25lZyhodyk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CkBAIC0xNzc4LDcgKzE3OTQsNiBAQAogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29uZmlnIHRoZSBNQUMgYW5kIHRoZSBQSFkgYWZ0ZXIgbGluayBpcyB1cC4KICogICAxKSBTZXQgdXAgdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CkBAIC0xNzk3LDI1ICsxODEyLDI1IEBACiAgICAgaW50MzJfdCByZXRfdmFsOwogICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfcG9zdGNvbmZpZyIpOwogCi0gICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgewogICAgICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfbWFjX3RvX3BoeShodyk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBNQUMgdG8gUEhZIHNldHRpbmdzXG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CiAgICAgfQogICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7Ci0gICAgaWYocmV0X3ZhbCkgeworICAgIGlmIChyZXRfdmFsKSB7CiAgICAgICAgIERFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBGbG93IENvbnRyb2xcbiIpOwogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICB9CiAKICAgICAvKiBDb25maWcgRFNQIHRvIGltcHJvdmUgR2lnYSBsaW5rIHF1YWxpdHkgKi8KLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBEU1AgYWZ0ZXIgbGluayB1cFxuIik7CiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQpAQCAtMTg2MSw3ICsxODc2LDcgQEAKIAogICAgIC8qIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgUEhZIGFuZCBzZXQgUEhZIG1vZGUgaWYgbmVjZXNzYXJ5LiAqLwogICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoaHcpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKQEAgLTE4ODIsMzAgKzE4OTcsMzAgQEAKICAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAogICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAoaHcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cChodyk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2dncF9zZXR1cChodyk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCi0gICAgaWYoaHctPmF1dG9uZWcpIHsKKyAgICBpZiAoaHctPmF1dG9uZWcpIHsKICAgICAgICAgLyogU2V0dXAgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQKICAgICAgICAgICAqIGFuZCBwZXJmb3JtIGF1dG9uZWdvdGlhdGlvbiAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyhodyk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogUEhZIHdpbGwgYmUgc2V0IHRvIDEwSCwgMTBGLCAxMDBILG9yIDEwMEYKICAgICAgICAgICAqIGRlcGVuZGluZyBvbiB2YWx1ZSBmcm9tIGZvcmNlZF9zcGVlZF9kdXBsZXguICovCiAgICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXhcbiIpOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChodyk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBGb3JjaW5nIFNwZWVkIGFuZCBEdXBsZXhcbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0KQEAgLTE5MTQsMTggKzE5MjksMTggQEAKICAgICAvKiBDaGVjayBsaW5rIHN0YXR1cy4gV2FpdCB1cCB0byAxMDAgbWljcm9zZWNvbmRzIGZvciBsaW5rIHRvIGJlY29tZQogICAgICAqIHZhbGlkLgogICAgICAqLwotICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGlmKHBoeV9kYXRhICYgTUlJX1NSX0xJTktfU1RBVFVTKSB7CisgICAgICAgIGlmIChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgewogICAgICAgICAgICAgLyogQ29uZmlnIHRoZSBNQUMgYW5kIFBIWSBhZnRlciBsaW5rIGlzIHVwICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29wcGVyX2xpbmtfcG9zdGNvbmZpZyhodyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgIERFQlVHT1VUKCJWYWxpZCBsaW5rIGVzdGFibGlzaGVkISEhXG4iKTsKQEAgLTIwMjcsNyArMjA0Miw3IEBACiAKICAgICAvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsICZtaWlfYXV0b25lZ19hZHZfcmVnKTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lmZSkgewpAQCAtMjA1NSwzNiArMjA3MCwzNiBAQAogICAgIERFQlVHT1VUMSgiYXV0b25lZ19hZHZlcnRpc2VkICV4XG4iLCBody0+YXV0b25lZ19hZHZlcnRpc2VkKTsKIAogICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEhhbGYgRHVwbGV4PyAqLwotICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfSEFMRikgeworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKICAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOwogICAgIH0KIAogICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEZ1bGwgRHVwbGV4PyAqLwotICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfRlVMTCkgeworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0ZVTEwpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEZ1bGwgZHVwbGV4XG4iKTsKICAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9GRF9DQVBTOwogICAgIH0KIAogICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBIYWxmIER1cGxleD8gKi8KLSAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9IQUxGKSB7CisgICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0hBTEYpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBIYWxmIGR1cGxleFxuIik7CiAgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9IRF9DQVBTOwogICAgIH0KIAogICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBGdWxsIER1cGxleD8gKi8KLSAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9GVUxMKSB7CisgICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0ZVTEwpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBGdWxsIGR1cGxleFxuIik7CiAgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9GRF9DQVBTOwogICAgIH0KIAogICAgIC8qIFdlIGRvIG5vdCBhbGxvdyB0aGUgUGh5IHRvIGFkdmVydGlzZSAxMDAwIE1iIEhhbGYgRHVwbGV4ICovCi0gICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0hBTEYpIHsKKyAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0hBTEYpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDAwbWIgSGFsZiBkdXBsZXggcmVxdWVzdGVkLCByZXF1ZXN0IGRlbmllZCFcbiIpOwogICAgIH0KIAogICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMDAgTWIgRnVsbCBEdXBsZXg/ICovCi0gICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKKyAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKICAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDAwbWIgRnVsbCBkdXBsZXhcbiIpOwogICAgICAgICBtaWlfMTAwMHRfY3RybF9yZWcgfD0gQ1JfMTAwMFRfRkRfQ0FQUzsKICAgICAgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CkBAIC0yMTQ2LDcgKzIxNjEsNyBAQAogICAgIH0KIAogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsIG1paV9hdXRvbmVnX2Fkdl9yZWcpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgREVCVUdPVVQxKCJBdXRvLU5lZyBBZHZlcnRpc2luZyAleFxuIiwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CkBAIC0yMTk0LDcgKzIyMDksNyBAQAogCiAgICAgLyogUmVhZCB0aGUgTUlJIENvbnRyb2wgUmVnaXN0ZXIuICovCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZtaWlfY3RybF9yZWcpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogV2UgbmVlZCB0byBkaXNhYmxlIGF1dG9uZWcgaW4gb3JkZXIgdG8gZm9yY2UgbGluayBhbmQgZHVwbGV4LiAqLwpAQCAtMjIwMiw4ICsyMjE3LDggQEAKICAgICBtaWlfY3RybF9yZWcgJj0gfk1JSV9DUl9BVVRPX05FR19FTjsKIAogICAgIC8qIEFyZSB3ZSBmb3JjaW5nIEZ1bGwgb3IgSGFsZiBEdXBsZXg/ICovCi0gICAgaWYoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2Z1bGwgfHwKLSAgICAgICBody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsKSB7CisgICAgaWYgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CisgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHsKICAgICAgICAgLyogV2Ugd2FudCB0byBmb3JjZSBmdWxsIGR1cGxleCBzbyB3ZSBTRVQgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4gdGhlCiAgICAgICAgICAqIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgogICAgICAgICAgKi8KQEAgLTIyMjAsNyArMjIzNSw3IEBACiAgICAgfQogCiAgICAgLyogQXJlIHdlIGZvcmNpbmcgMTAwTWJwcz8/PyAqLwotICAgIGlmKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CisgICAgaWYgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CiAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2hhbGYpIHsKICAgICAgICAgLyogU2V0IHRoZSAxMDBNYiBiaXQgYW5kIHR1cm4gb2ZmIHRoZSAxMDAwTWIgYW5kIDEwTWIgYml0cy4gKi8KICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CkBAIC0yMjQzLDcgKzIyNTgsNyBAQAogICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHx8CiAgICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgdG8gZm9yY2UgTURJIG1hbnVhbGx5LiBNODhFMTAwMCByZXF1aXJlcyBNREkKQEAgLTIyNTEsNyArMjI2Niw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICBERUJVR09VVDEoIk04OEUxMDAwIFBTQ1I6ICV4IFxuIiwgcGh5X2RhdGEpOwpAQCAtMjI3NSwyMCArMjI5MCwyMCBAQAogICAgICAgICAgKiBmb3JjZWQgd2hlbmV2ZXIgc3BlZWQgb3IgZHVwbGV4IGFyZSBmb3JjZWQuCiAgICAgICAgICAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CiAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CiAKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIH0KIAogICAgIC8qIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIFBIWSBNSUkgY29udHJvbCByZWdpc3Rlci4gKi8KICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIG1paV9jdHJsX3JlZyk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICB1ZGVsYXkoMSk7CkBAIC0yMzAwLDUwICsyMzE1LDUwIEBACiAgICAgICogb25seSBpZiB0aGUgdXNlciBoYXMgc2V0IHdhaXRfYXV0b25lZ19jb21wbGV0ZSB0byAxLCB3aGljaCBpcwogICAgICAqIHRoZSBkZWZhdWx0LgogICAgICAqLwotICAgIGlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKyAgICBpZiAoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgewogICAgICAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUuICovCiAgICAgICAgIERFQlVHT1VUKCJXYWl0aW5nIGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IGxpbmsuXG4iKTsKICAgICAgICAgbWlpX3N0YXR1c19yZWcgPSAwOwogCiAgICAgICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCi0gICAgICAgIGZvcihpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnIENvbXBsZXRlIGJpdAogICAgICAgICAgICAgICogdG8gYmUgc2V0LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICBpZihtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgICAgICBpZiAobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpIGJyZWFrOwogICAgICAgICAgICAgbXNlY19kZWxheSgxMDApOwogICAgICAgICB9Ci0gICAgICAgIGlmKChpID09IDApICYmCisgICAgICAgIGlmICgoaSA9PSAwKSAmJgogICAgICAgICAgICAoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB8fAogICAgICAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykpKSB7CiAgICAgICAgICAgICAvKiBXZSBkaWRuJ3QgZ2V0IGxpbmsuICBSZXNldCB0aGUgRFNQIGFuZCB3YWl0IGFnYWluIGZvciBsaW5rLiAqLwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldF9kc3AoaHcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIFBIWSBEU1BcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIFRoaXMgbG9vcCB3aWxsIGVhcmx5LW91dCBpZiB0aGUgbGluayBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAgKi8KLSAgICAgICAgZm9yKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgewotICAgICAgICAgICAgaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpIGJyZWFrOworICAgICAgICBmb3IgKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgaWYgKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0xJTktfU1RBVFVTKSBicmVhazsKICAgICAgICAgICAgIG1zZWNfZGVsYXkoMTAwKTsKICAgICAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnIENvbXBsZXRlIGJpdAogICAgICAgICAgICAgICogdG8gYmUgc2V0LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CiAgICAgfQpAQCAtMjM1NCwzMiArMjM2OSwzMSBAQAogICAgICAgICAgKiBkZWZhdWx0cyBiYWNrIHRvIGEgMi41TUh6IGNsb2NrIHdoZW4gdGhlIFBIWSBpcyByZXNldC4KICAgICAgICAgICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgLyogSW4gYWRkaXRpb24sIGJlY2F1c2Ugb2YgdGhlIHMvdyByZXNldCBhYm92ZSwgd2UgbmVlZCB0byBlbmFibGUgQ1JTIG9uCiAgICAgICAgICAqIFRYLiAgVGhpcyBtdXN0IGJlIHNldCBmb3IgYm90aCBmdWxsIGFuZCBoYWxmIGR1cGxleCBvcGVyYXRpb24uCiAgICAgICAgICAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKLSAgICAgICAgICAgKCFody0+YXV0b25lZykgJiYKLSAgICAgICAgICAgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwgfHwKLSAgICAgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2hhbGYpKSB7CisgICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKKyAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsIHx8CisgICAgICAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKSB7CkBAIC0yNDcwLDEwICsyNDg0LDEwIEBACiAgICAgICogcmVnaXN0ZXJzIGRlcGVuZGluZyBvbiBuZWdvdGlhdGVkIHZhbHVlcy4KICAgICAgKi8KICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKLSAgICBpZihwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfRFBMWCkKKyAgICBpZiAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpCiAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKICAgICBlbHNlCiAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfRkQ7CkBAIC0yNDgzLDkgKzI0OTcsOSBAQAogICAgIC8qIFNldCB1cCBzcGVlZCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgZGVwZW5kaW5nIG9uCiAgICAgICogbmVnb3RpYXRlZCB2YWx1ZXMuCiAgICAgICovCi0gICAgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKQorICAgIGlmICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCiAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwMDsKLSAgICBlbHNlIGlmKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfU1BFRUQpID09IE04OEUxMDAwX1BTU1JfMTAwTUJTKQorICAgIGVsc2UgaWYgKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfU1BFRUQpID09IE04OEUxMDAwX1BTU1JfMTAwTUJTKQogICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKIAogICAgIC8qIFdyaXRlIHRoZSBjb25maWd1cmVkIHZhbHVlcyBiYWNrIHRvIHRoZSBEZXZpY2UgQ29udHJvbCBSZWcuICovCkBAIC0yNTUzLDcgKzI1NjcsNyBAQAogICAgIH0KIAogICAgIC8qIERpc2FibGUgVFggRmxvdyBDb250cm9sIGZvciA4MjU0MiAocmV2IDIuMCkgKi8KLSAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQogICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKIAogICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CkBAIC0yNTg3LDExICsyNjAxLDEyIEBACiAgICAgICogc28gd2UgaGFkIHRvIGZvcmNlIGxpbmsuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gZm9yY2UgdGhlCiAgICAgICogY29uZmlndXJhdGlvbiBvZiB0aGUgTUFDIHRvIG1hdGNoIHRoZSAiZmMiIHBhcmFtZXRlci4KICAgICAgKi8KLSAgICBpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAotICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAotICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmICghaHctPmF1dG9uZWcpKSkgeworICAgIGlmICgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAorICAgICAgICAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorICAgICAgICAgKGh3LT5hdXRvbmVnX2ZhaWxlZCkpIHx8CisgICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmICghaHctPmF1dG9uZWcpKSkgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KTsKLSAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CkBAIC0yNjAyLDE5ICsyNjE3LDE5IEBACiAgICAgICogaGFzIGNvbXBsZXRlZCwgYW5kIGlmIHNvLCBob3cgdGhlIFBIWSBhbmQgbGluayBwYXJ0bmVyIGhhcwogICAgICAqIGZsb3cgY29udHJvbCBjb25maWd1cmVkLgogICAgICAqLwotICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgaHctPmF1dG9uZWcpIHsKKyAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+YXV0b25lZykgewogICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCBjaGVjayB0byBzZWUgaWYgQXV0b05lZwogICAgICAgICAgKiBoYXMgY29tcGxldGVkLiAgV2UgcmVhZCB0aGlzIHR3aWNlIGJlY2F1c2UgdGhpcyByZWcgaGFzCiAgICAgICAgICAqIHNvbWUgInN0aWNreSIgKGxhdGNoZWQpIGJpdHMuCiAgICAgICAgICAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGlmKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKyAgICAgICAgaWYgKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKICAgICAgICAgICAgIC8qIFRoZSBBdXRvTmVnIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCwgc28gd2Ugbm93IG5lZWQgdG8KICAgICAgICAgICAgICAqIHJlYWQgYm90aCB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCiAgICAgICAgICAgICAgKiAoQWRkcmVzcyA0KSBhbmQgdGhlIEF1dG9fTmVnb3RpYXRpb24gQmFzZSBQYWdlIEFiaWxpdHkKQEAgLTI2MjMsMTEgKzI2MzgsMTEgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlpX253YXlfYWR2X3JlZyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2xwX2FiaWxpdHlfcmVnKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgLyogVHdvIGJpdHMgaW4gdGhlIEF1dG8gTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgpAQCAtMjY2NCwxNSArMjY3OSwxNSBAQAogICAgICAgICAgICAgICogICAxICAgfCAgIERDICAgIHwgICAxICAgfCAgIERDICAgIHwgZTEwMDBfZmNfZnVsbAogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSkgeworICAgICAgICAgICAgaWYgKChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpKSB7CiAgICAgICAgICAgICAgICAgLyogTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgUlggT05MWQogICAgICAgICAgICAgICAgICAqIG9mIHBhdXNlIGZyYW1lcy4gIEluIHRoaXMgY2FzZSwgd2UgaGFkIHRvIGFkdmVydGlzZQogICAgICAgICAgICAgICAgICAqIEZVTEwgZmxvdyBjb250cm9sIGJlY2F1c2Ugd2UgY291bGQgbm90IGFkdmVydGlzZSBSWAogICAgICAgICAgICAgICAgICAqIE9OTFkuIEhlbmNlLCB3ZSBtdXN0IG5vdyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0bwogICAgICAgICAgICAgICAgICAqIHR1cm4gT0ZGICB0aGUgVFJBTlNNSVNTSU9OIG9mIFBBVVNFIGZyYW1lcy4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZihody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfZnVsbCkgewogICAgICAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19mdWxsOwogICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gRlVMTC5cbiIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNjg4LDEwICsyNzAzLDEwIEBACiAgICAgICAgICAgICAgKiAgIDAgICB8ICAgIDEgICAgfCAgIDEgICB8ICAgIDEgICAgfCBlMTAwMF9mY190eF9wYXVzZQogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZWxzZSBpZighKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCEobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgewogICAgICAgICAgICAgICAgIGh3LT5mYyA9IGUxMDAwX2ZjX3R4X3BhdXNlOwogICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBUWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOwogICAgICAgICAgICAgfQpAQCAtMjcwMywxMCArMjcxOCwxMCBAQAogICAgICAgICAgICAgICogICAxICAgfCAgICAxICAgIHwgICAwICAgfCAgICAxICAgIHwgZTEwMDBfZmNfcnhfcGF1c2UKICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGVsc2UgaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKLSAgICAgICAgICAgICAgICAgICAgIShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX0FTTV9ESVIpKSB7CisgICAgICAgICAgICBlbHNlIGlmICgobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgICEobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKICAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19yeF9wYXVzZTsKICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKICAgICAgICAgICAgIH0KQEAgLTI3MzAsOSArMjc0NSw5IEBACiAgICAgICAgICAgICAgKiBiZSBhc2tlZCB0byBkZWxheSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyB0aGFuIGFza2luZwogICAgICAgICAgICAgICogb3VyIGxpbmsgcGFydG5lciB0byBwYXVzZSB0cmFuc21pc3Npb24gb2YgZnJhbWVzLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlbHNlIGlmKChody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfbm9uZSB8fAotICAgICAgICAgICAgICAgICAgICAgaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX3R4X3BhdXNlKSB8fAotICAgICAgICAgICAgICAgICAgICBody0+ZmNfc3RyaWN0X2llZWUpIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKChody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfbm9uZSB8fAorICAgICAgICAgICAgICAgICAgICAgIGh3LT5vcmlnaW5hbF9mYyA9PSBlMTAwMF9mY190eF9wYXVzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICBody0+ZmNfc3RyaWN0X2llZWUpIHsKICAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19ub25lOwogICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBOT05FLlxuIik7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjc0NSwxOSArMjc2MCwxOSBAQAogICAgICAgICAgICAgICogZW5hYmxlZCBwZXIgSUVFRSA4MDIuMyBzcGVjLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKGR1cGxleCA9PSBIQUxGX0RVUExFWCkKKyAgICAgICAgICAgIGlmIChkdXBsZXggPT0gSEFMRl9EVVBMRVgpCiAgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKIAogICAgICAgICAgICAgLyogTm93IHdlIGNhbGwgYSBzdWJyb3V0aW5lIHRvIGFjdHVhbGx5IGZvcmNlIHRoZSBNQUMKICAgICAgICAgICAgICAqIGNvbnRyb2xsZXIgdG8gdXNlIHRoZSBjb3JyZWN0IGZsb3cgY29udHJvbCBzZXR0aW5ncy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2ZvcmNlX21hY19mYyhodyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBmb3JjaW5nIGZsb3cgY29udHJvbCBzZXR0aW5nc1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICB9CkBAIC0yNzk2LDEzICsyODExLDEzIEBACiAgICAgICogc2V0IHdoZW4gdGhlIG9wdGljcyBkZXRlY3QgYSBzaWduYWwuIE9uIG9sZGVyIGFkYXB0ZXJzLCBpdCB3aWxsIGJlCiAgICAgICogY2xlYXJlZCB3aGVuIHRoZXJlIGlzIGEgc2lnbmFsLiAgVGhpcyBhcHBsaWVzIHRvIGZpYmVyIG1lZGlhIG9ubHkuCiAgICAgICovCi0gICAgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHx8Ci0gICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkgeworICAgIGlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKyAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkgewogICAgICAgICByeGN3ID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJYQ1cpOwogCi0gICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKICAgICAgICAgICAgIHNpZ25hbCA9IChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgPyBFMTAwMF9DVFJMX1NXRFBJTjEgOiAwOwotICAgICAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKQorICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkKICAgICAgICAgICAgICAgICBody0+Z2V0X2xpbmtfc3RhdHVzID0gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODEzLDIwICsyODI4LDIwIEBACiAgICAgICogcmVjZWl2ZSBhIExpbmsgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgb3Igd2UgaGF2ZSBSeCBTZXF1ZW5jZQogICAgICAqIEVycm9ycy4KICAgICAgKi8KLSAgICBpZigoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmIGh3LT5nZXRfbGlua19zdGF0dXMpIHsKKyAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+Z2V0X2xpbmtfc3RhdHVzKSB7CiAgICAgICAgIC8qIEZpcnN0IHdlIHdhbnQgdG8gc2VlIGlmIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIHJlcG9ydHMKICAgICAgICAgICogbGluay4gIElmIHNvLCB0aGVuIHdlIHdhbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHNwZWVkL2R1cGxleAogICAgICAgICAgKiBvZiB0aGUgUEhZLgogICAgICAgICAgKiBSZWFkIHRoZSByZWdpc3RlciB0d2ljZSBzaW5jZSB0aGUgbGluayBiaXQgaXMgc3RpY2t5LgogICAgICAgICAgKi8KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKICAgICAgICAgICAgIGh3LT5nZXRfbGlua19zdGF0dXMgPSBGQUxTRTsKICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZXJlIHdhcyBEb3duU2hpZnQsIG11c3QgYmUgY2hlY2tlZCBpbW1lZGlhdGVseSBhZnRlcgogICAgICAgICAgICAgICogbGluay11cCAqLwpAQCAtMjg0MCwxMCArMjg1NSwxMCBAQAogICAgICAgICAgICAgICogaGFwcGVuIGR1ZSB0byB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgd29ya2Fyb3VuZC4KICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKLSAgICAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmCi0gICAgICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfZnVsbCB8fAotICAgICAgICAgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2hhbGYpKSB7CisgICAgICAgICAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpICYmCisgICAgICAgICAgICAgICAgKCFody0+YXV0b25lZykgJiYKKyAgICAgICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfZnVsbCB8fAorICAgICAgICAgICAgICAgICBody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9oYWxmKSkgewogICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChodyk7CiAgICAgICAgICAgICAgICAgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CkBAIC0yODYwLDcgKzI4NzUsNyBAQAogICAgICAgICAvKiBJZiB3ZSBhcmUgZm9yY2luZyBzcGVlZC9kdXBsZXgsIHRoZW4gd2Ugc2ltcGx5IHJldHVybiBzaW5jZQogICAgICAgICAgKiB3ZSBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB3aGV0aGVyIHdlIGhhdmUgbGluayBvciBub3QuCiAgICAgICAgICAqLwotICAgICAgICBpZighaHctPmF1dG9uZWcpIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICAgICAgaWYgKCFody0+YXV0b25lZykgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwogCiAgICAgICAgIC8qIG9wdGltaXplIHRoZSBkc3Agc2V0dGluZ3MgZm9yIHRoZSBpZ3AgcGh5ICovCiAgICAgICAgIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIFRSVUUpOwpAQCAtMjg3MywxMSArMjg4OCwxMSBAQAogICAgICAgICAgKiBzcGVlZC9kdXBsZXggb24gdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CiAgICAgICAgICAqIHNldHRpbmdzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQorICAgICAgICBpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQogICAgICAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICB9CkBAIC0yODg4LDcgKzI5MDMsNyBAQAogICAgICAgICAgKiBoYXZlIGhhZCB0byByZS1hdXRvbmVnIHdpdGggYSBkaWZmZXJlbnQgbGluayBwYXJ0bmVyLgogICAgICAgICAgKi8KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKLSAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQpAQCAtMjkwMCw3ICsyOTE1LDcgQEAKICAgICAgICAgICogYXQgZ2lnYWJpdCBzcGVlZCwgdGhlbiBUQkkgY29tcGF0aWJpbGl0eSBpcyBub3QgbmVlZGVkLiAgSWYgd2UgYXJlCiAgICAgICAgICAqIGF0IGdpZ2FiaXQgc3BlZWQsIHdlIHR1cm4gb24gVEJJIGNvbXBhdGliaWxpdHkuCiAgICAgICAgICAqLwotICAgICAgICBpZihody0+dGJpX2NvbXBhdGliaWxpdHlfZW4pIHsKKyAgICAgICAgaWYgKGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbikgewogICAgICAgICAgICAgdWludDE2X3Qgc3BlZWQsIGR1cGxleDsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKICAgICAgICAgICAgIGlmIChyZXRfdmFsKSB7CkBAIC0yOTExLDcgKzI5MjYsNyBAQAogICAgICAgICAgICAgICAgIC8qIElmIGxpbmsgc3BlZWQgaXMgbm90IHNldCB0byBnaWdhYml0IHNwZWVkLCB3ZSBkbyBub3QgbmVlZAogICAgICAgICAgICAgICAgICAqIHRvIGVuYWJsZSBUQkkgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZihody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoaHctPnRiaV9jb21wYXRpYmlsaXR5X29uKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIHByZXZpb3VzbHkgd2VyZSBpbiB0aGUgbW9kZSwgdHVybiBpdCBvZmYuICovCiAgICAgICAgICAgICAgICAgICAgIHJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CiAgICAgICAgICAgICAgICAgICAgIHJjdGwgJj0gfkUxMDAwX1JDVExfU0JQOwpAQCAtMjkyNCw3ICsyOTM5LDcgQEAKICAgICAgICAgICAgICAgICAgKiBwYWNrZXRzLiBTb21lIGZyYW1lcyBoYXZlIGFuIGFkZGl0aW9uYWwgYnl0ZSBvbiB0aGUgZW5kIGFuZAogICAgICAgICAgICAgICAgICAqIHdpbGwgbG9vayBsaWtlIENSQyBlcnJvcnMgdG8gdG8gdGhlIGhhcmR3YXJlLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoIWh3LT50YmlfY29tcGF0aWJpbGl0eV9vbikgewogICAgICAgICAgICAgICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICByY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOwogICAgICAgICAgICAgICAgICAgICByY3RsIHw9IEUxMDAwX1JDVExfU0JQOwpAQCAtMjk0MCwxMiArMjk1NSwxMiBAQAogICAgICAqIGF1dG8tbmVnb3RpYXRpb24gdGltZSB0byBjb21wbGV0ZSwgaW4gY2FzZSB0aGUgY2FibGUgd2FzIGp1c3QgcGx1Z2dlZAogICAgICAqIGluLiBUaGUgYXV0b25lZ19mYWlsZWQgZmxhZyBkb2VzIHRoaXMuCiAgICAgICovCi0gICAgZWxzZSBpZigoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSAmJgorICAgIGVsc2UgaWYgKCgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCiAgICAgICAgICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSkgfHwKLSAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgotICAgICAgICAgICAgKCEoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKSkgJiYKLSAgICAgICAgICAgICghKHJ4Y3cgJiBFMTAwMF9SWENXX0MpKSkgewotICAgICAgICBpZihody0+YXV0b25lZ19mYWlsZWQgPT0gMCkgeworICAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorICAgICAgICAgICAgICAoIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpKSAmJgorICAgICAgICAgICAgICAoIShyeGN3ICYgRTEwMDBfUlhDV19DKSkpIHsKKyAgICAgICAgaWYgKGh3LT5hdXRvbmVnX2ZhaWxlZCA9PSAwKSB7CiAgICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAxOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTI5NjEsNyArMjk3Niw3IEBACiAKICAgICAgICAgLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBhZnRlciBmb3JjaW5nIGxpbmsgdXAuICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0KQEAgLTI5NzEsOSArMjk4Niw5IEBACiAgICAgICogRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgaW4gYW4gYXR0ZW1wdCB0byBhdXRvLW5lZ290aWF0ZSB3aXRoIG91ciBsaW5rCiAgICAgICogcGFydG5lci4KICAgICAgKi8KLSAgICBlbHNlIGlmKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKLSAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgotICAgICAgICAgICAgKGN0cmwgJiBFMTAwMF9DVFJMX1NMVSkgJiYgKHJ4Y3cgJiBFMTAwMF9SWENXX0MpKSB7CisgICAgZWxzZSBpZiAoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorICAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorICAgICAgICAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfU0xVKSAmJiAocnhjdyAmIEUxMDAwX1JYQ1dfQykpIHsKICAgICAgICAgREVCVUdPVVQoIlJYaW5nIC9DLywgZW5hYmxlIEF1dG9OZWcgYW5kIHN0b3AgZm9yY2luZyBsaW5rLlxuIik7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgaHctPnR4Y3cpOwogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIChjdHJsICYgfkUxMDAwX0NUUkxfU0xVKSk7CkBAIC0yOTgzLDEyICsyOTk4LDEyIEBACiAgICAgLyogSWYgd2UgZm9yY2UgbGluayBmb3Igbm9uLWF1dG8tbmVnb3RpYXRpb24gc3dpdGNoLCBjaGVjayBsaW5rIHN0YXR1cwogICAgICAqIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsIHNlcmRlcyBtZWRpYSB0eXBlLgogICAgICAqLwotICAgIGVsc2UgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgotICAgICAgICAgICAgIShFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKKyAgICBlbHNlIGlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmCisgICAgICAgICAgICAgIShFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKICAgICAgICAgLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreS4gKi8KICAgICAgICAgdWRlbGF5KDEwKTsKLSAgICAgICAgaWYoRTEwMDBfUlhDV19TWU5DSCAmIEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKSkgewotICAgICAgICAgICAgaWYoIShyeGN3ICYgRTEwMDBfUlhDV19JVikpIHsKKyAgICAgICAgaWYgKEUxMDAwX1JYQ1dfU1lOQ0ggJiBFMTAwMF9SRUFEX1JFRyhodywgUlhDVykpIHsKKyAgICAgICAgICAgIGlmICghKHJ4Y3cgJiBFMTAwMF9SWENXX0lWKSkgewogICAgICAgICAgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgREVCVUdPVVQoIlNFUkRFUzogTGluayBpcyB1cC5cbiIpOwogICAgICAgICAgICAgfQpAQCAtMjk5Nyw4ICszMDEyLDggQEAKICAgICAgICAgICAgIERFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgZG93bi5cbiIpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKLSAgICAgICAoRTEwMDBfVFhDV19BTkUgJiBFMTAwMF9SRUFEX1JFRyhodywgVFhDVykpKSB7CisgICAgaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKKyAgICAgICAgKEUxMDAwX1RYQ1dfQU5FICYgRTEwMDBfUkVBRF9SRUcoaHcsIFRYQ1cpKSkgewogICAgICAgICBody0+c2VyZGVzX2xpbmtfZG93biA9ICEoRTEwMDBfU1RBVFVTX0xVICYgRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykpOwogICAgIH0KICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKQEAgLTMwMjIsMTIgKzMwMzcsMTIgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgiKTsKIAotICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKICAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7Ci0gICAgICAgIGlmKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkgewogICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwMDsKICAgICAgICAgICAgIERFQlVHT1VUKCIxMDAwIE1icywgIik7Ci0gICAgICAgIH0gZWxzZSBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCkgewogICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwOwogICAgICAgICAgICAgREVCVUdPVVQoIjEwMCBNYnMsICIpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzAzNSw3ICszMDUwLDcgQEAKICAgICAgICAgICAgIERFQlVHT1VUKCIxMCBNYnMsICIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0ZEKSB7CisgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpIHsKICAgICAgICAgICAgICpkdXBsZXggPSBGVUxMX0RVUExFWDsKICAgICAgICAgICAgIERFQlVHT1VUKCJGdWxsIER1cGxleFxuIik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zMDUyLDE4ICszMDY3LDE4IEBACiAgICAgICogaWYgaXQgaXMgb3BlcmF0aW5nIGF0IGhhbGYgZHVwbGV4LiAgSGVyZSB3ZSBzZXQgdGhlIGR1cGxleCBzZXR0aW5ncyB0bwogICAgICAqIG1hdGNoIHRoZSBkdXBsZXggaW4gdGhlIGxpbmsgcGFydG5lcidzIGNhcGFiaWxpdGllcy4KICAgICAgKi8KLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCAmJiBody0+c3BlZWRfZG93bmdyYWRlZCkgeworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCAmJiBody0+c3BlZWRfZG93bmdyYWRlZCkgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19FWFAsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgaWYoIShwaHlfZGF0YSAmIE5XQVlfRVJfTFBfTldBWV9DQVBTKSkKKyAgICAgICAgaWYgKCEocGh5X2RhdGEgJiBOV0FZX0VSX0xQX05XQVlfQ0FQUykpCiAgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0xQX0FCSUxJVFksICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICBpZigoKnNwZWVkID09IFNQRUVEXzEwMCAmJiAhKHBoeV9kYXRhICYgTldBWV9MUEFSXzEwMFRYX0ZEX0NBUFMpKSB8fAorICAgICAgICAgICAgaWYgKCgqc3BlZWQgPT0gU1BFRURfMTAwICYmICEocGh5X2RhdGEgJiBOV0FZX0xQQVJfMTAwVFhfRkRfQ0FQUykpIHx8CiAgICAgICAgICAgICAgICAoKnNwZWVkID09IFNQRUVEXzEwICYmICEocGh5X2RhdGEgJiBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMpKSkKICAgICAgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CiAgICAgICAgIH0KQEAgLTMxMDQsMTcgKzMxMTksMTcgQEAKICAgICBERUJVR09VVCgiV2FpdGluZyBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUuXG4iKTsKIAogICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCi0gICAgZm9yKGkgPSBQSFlfQVVUT19ORUdfVElNRTsgaSA+IDA7IGktLSkgeworICAgIGZvciAoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7CiAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCiAgICAgICAgICAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCiAgICAgICAgICAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICBpZihwaHlfZGF0YSAmIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFKSB7CisgICAgICAgIGlmIChwaHlfZGF0YSAmIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFKSB7CiAgICAgICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKICAgICAgICAgfQogICAgICAgICBtc2VjX2RlbGF5KDEwMCk7CkBAIC0zMTg3LDE0ICszMjAyLDE2IEBACiAgICAgLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCiAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CiAKLSAgICB3aGlsZShtYXNrKSB7CisgICAgd2hpbGUgKG1hc2spIHsKICAgICAgICAgLyogQSAiMSIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMSIgYW5kCiAgICAgICAgICAqIHRoZW4gcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jay4gQSAiMCIgaXMKICAgICAgICAgICogc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMCIgYW5kIHRoZW4KICAgICAgICAgICogcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIGNsb2NrLgogICAgICAgICAgKi8KLSAgICAgICAgaWYoZGF0YSAmIG1hc2spIGN0cmwgfD0gRTEwMDBfQ1RSTF9NRElPOwotICAgICAgICBlbHNlIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKKyAgICAgICAgaWYgKGRhdGEgJiBtYXNrKQorICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX01ESU87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKIAogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CkBAIC0zMjQ1LDEyICszMjYyLDEzIEBACiAgICAgZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOwogICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKIAotICAgIGZvcihkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZm9yIChkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CiAgICAgICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKICAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKICAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNoaWZ0ZWQgaW4gYSAiMSIuICovCi0gICAgICAgIGlmKGN0cmwgJiBFMTAwMF9DVFJMX01ESU8pIGRhdGEgfD0gMTsKKyAgICAgICAgaWYgKGN0cmwgJiBFMTAwMF9DVFJMX01ESU8pCisgICAgICAgICAgICBkYXRhIHw9IDE7CiAgICAgICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKICAgICB9CiAKQEAgLTMyNzYsNyArMzI5NCw3IEBACiAgICAgaWYgKCFody0+c3dmd19zeW5jX3ByZXNlbnQpCiAgICAgICAgIHJldHVybiBlMTAwMF9nZXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodyk7CiAKLSAgICB3aGlsZSh0aW1lb3V0KSB7CisgICAgd2hpbGUgKHRpbWVvdXQpIHsKICAgICAgICAgICAgIGlmIChlMTAwMF9nZXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOwogCkBAIC0zMzY1LDcgKzMzODMsNyBAQAogICAgICAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJlZ19hZGRyKTsKLSAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0KQEAgLTM0MTAsMTIgKzM0MjgsMTIgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnX2V4Iik7CiAKLSAgICBpZihyZWdfYWRkciA+IE1BWF9QSFlfUkVHX0FERFJFU1MpIHsKKyAgICBpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CiAgICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOwogICAgIH0KIAotICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CiAgICAgICAgIC8qIFNldCB1cCBPcC1jb2RlLCBQaHkgQWRkcmVzcywgYW5kIHJlZ2lzdGVyIGFkZHJlc3MgaW4gdGhlIE1ESQogICAgICAgICAgKiBDb250cm9sIHJlZ2lzdGVyLiAgVGhlIE1BQyB3aWxsIHRha2UgY2FyZSBvZiBpbnRlcmZhY2luZyB3aXRoIHRoZQogICAgICAgICAgKiBQSFkgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgZGF0YS4KQEAgLTM0MjcsMTYgKzM0NDUsMTYgQEAKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBNRElDLCBtZGljKTsKIAogICAgICAgICAvKiBQb2xsIHRoZSByZWFkeSBiaXQgdG8gc2VlIGlmIHRoZSBNREkgcmVhZCBjb21wbGV0ZWQgKi8KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICAgICAgICAgdWRlbGF5KDUwKTsKICAgICAgICAgICAgIG1kaWMgPSBFMTAwMF9SRUFEX1JFRyhodywgTURJQyk7Ci0gICAgICAgICAgICBpZihtZGljICYgRTEwMDBfTURJQ19SRUFEWSkgYnJlYWs7CisgICAgICAgICAgICBpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisgICAgICAgIGlmICghKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgewogICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBSZWFkIGRpZCBub3QgY29tcGxldGVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOwogICAgICAgICB9Ci0gICAgICAgIGlmKG1kaWMgJiBFMTAwMF9NRElDX0VSUk9SKSB7CisgICAgICAgIGlmIChtZGljICYgRTEwMDBfTURJQ19FUlJPUikgewogICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBFcnJvclxuIik7CiAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAgICAgICAgIH0KQEAgLTM1MDUsNyArMzUyMyw3IEBACiAgICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpOwotICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CiAgICAgICAgICAgICBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShodywgc3dmdyk7CiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQpAQCAtMzU1MCwxMiArMzU2OCwxMiBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnX2V4Iik7CiAKLSAgICBpZihyZWdfYWRkciA+IE1BWF9QSFlfUkVHX0FERFJFU1MpIHsKKyAgICBpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CiAgICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOwogICAgIH0KIAotICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CiAgICAgICAgIC8qIFNldCB1cCBPcC1jb2RlLCBQaHkgQWRkcmVzcywgcmVnaXN0ZXIgYWRkcmVzcywgYW5kIGRhdGEgaW50ZW5kZWQKICAgICAgICAgICogZm9yIHRoZSBQSFkgcmVnaXN0ZXIgaW4gdGhlIE1ESSBDb250cm9sIHJlZ2lzdGVyLiAgVGhlIE1BQyB3aWxsIHRha2UKICAgICAgICAgICogY2FyZSBvZiBpbnRlcmZhY2luZyB3aXRoIHRoZSBQSFkgdG8gc2VuZCB0aGUgZGVzaXJlZCBkYXRhLgpAQCAtMzU2OCwxMiArMzU4NiwxMiBAQAogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIE1ESUMsIG1kaWMpOwogCiAgICAgICAgIC8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLwotICAgICAgICBmb3IoaSA9IDA7IGkgPCA2NDA7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQxOyBpKyspIHsKICAgICAgICAgICAgIHVkZWxheSg1KTsKICAgICAgICAgICAgIG1kaWMgPSBFMTAwMF9SRUFEX1JFRyhodywgTURJQyk7Ci0gICAgICAgICAgICBpZihtZGljICYgRTEwMDBfTURJQ19SRUFEWSkgYnJlYWs7CisgICAgICAgICAgICBpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisgICAgICAgIGlmICghKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgewogICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBXcml0ZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKICAgICAgICAgfQpAQCAtMzY4NSw3ICszNzAzLDcgQEAKIAogICAgIERFQlVHT1VUKCJSZXNldHRpbmcgUGh5Li4uXG4iKTsKIAotICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CiAgICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSAmJgogICAgICAgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpIHsKICAgICAgICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007CkBAIC0zNzMzLDcgKzM3NTEsNyBAQAogICAgIH0KICAgICB1ZGVsYXkoMTUwKTsKIAotICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CiAgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCiAgICAgICAgIGxlZF9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CiAgICAgICAgIGxlZF9jdHJsICY9IElHUF9BQ1RJVklUWV9MRURfTUFTSzsKQEAgLTM3NDMsMTQgKzM3NjEsMTMgQEAKIAogICAgIC8qIFdhaXQgZm9yIEZXIHRvIGZpbmlzaCBQSFkgY29uZmlndXJhdGlvbi4gKi8KICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3BoeV9jZmdfZG9uZShodyk7CisgICAgaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9zZW1hcGhvcmUoaHcpOwogCi0gICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pICYmCi0gICAgICAgICAgICAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykpIHsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9pbml0X2xjZF9mcm9tX252bShodyk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQorICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pICYmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8zKSkKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2luaXRfbGNkX2Zyb21fbnZtKGh3KTsKKwogICAgIHJldHVybiByZXRfdmFsOwogfQogCkBAIC0zNzgxLDI1ICszNzk4LDI1IEBACiAgICAgY2FzZSBlMTAwMF84MjU3MjoKICAgICBjYXNlIGUxMDAwX2ljaDhsYW46CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9kYXRhIHw9IE1JSV9DUl9SRVNFVDsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgdWRlbGF5KDEpOwogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCB8fCBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKQorICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCB8fCBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKQogICAgICAgICBlMTAwMF9waHlfaW5pdF9zY3JpcHQoaHcpOwogCiAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CkBAIC0zODc3LDggKzM4OTQsOCBAQAogICAgIGlmIChody0+a21ybl9sb2NrX2xvc3Nfd29ya2Fyb3VuZF9kaXNhYmxlZCkKICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKLSAgICAvKiBNYWtlIHN1cmUgbGluayBpcyB1cCBiZWZvcmUgcHJvY2VlZGluZy4gSWYgbm90IGp1c3QgcmV0dXJuLgotICAgICAqIEF0dGVtcHRpbmcgdGhpcyB3aGlsZSBsaW5rIGlzIG5lZ290aWF0aW5nIGZvdWxzIHVwIGxpbmsKKyAgICAvKiBNYWtlIHN1cmUgbGluayBpcyB1cCBiZWZvcmUgcHJvY2VlZGluZy4gIElmIG5vdCBqdXN0IHJldHVybi4KKyAgICAgKiBBdHRlbXB0aW5nIHRoaXMgd2hpbGUgbGluayBpcyBuZWdvdGlhdGluZyBmb3VsZWQgdXAgbGluawogICAgICAqIHN0YWJpbGl0eSAqLwogICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKQEAgLTM5NTUsMzQgKzM5NzIsMzQgQEAKICAgICBody0+cGh5X2lkID0gKHVpbnQzMl90KSAocGh5X2lkX2hpZ2ggPDwgMTYpOwogICAgIHVkZWxheSgyMCk7CiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMiwgJnBoeV9pZF9sb3cpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgaHctPnBoeV9pZCB8PSAodWludDMyX3QpIChwaHlfaWRfbG93ICYgUEhZX1JFVklTSU9OX01BU0spOwogICAgIGh3LT5waHlfcmV2aXNpb24gPSAodWludDMyX3QpIHBoeV9pZF9sb3cgJiB+UEhZX1JFVklTSU9OX01BU0s7CiAKLSAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICBjYXNlIGUxMDAwXzgyNTQzOgotICAgICAgICBpZihody0+cGh5X2lkID09IE04OEUxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGlmIChody0+cGh5X2lkID09IE04OEUxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBlMTAwMF84MjU0MDoKICAgICBjYXNlIGUxMDAwXzgyNTQ1OgogICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CiAgICAgY2FzZSBlMTAwMF84MjU0NjoKICAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgotICAgICAgICBpZihody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGlmIChody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgZTEwMDBfODI1NDE6CiAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKICAgICBjYXNlIGUxMDAwXzgyNTQ3OgogICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6Ci0gICAgICAgIGlmKGh3LT5waHlfaWQgPT0gSUdQMDFFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBJR1AwMUUxMDAwX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgZTEwMDBfODI1NzM6Ci0gICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTExMTFfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gTTg4RTExMTFfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKICAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gR0c4MjU2M19FX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOwpAQCAtNDAyMSwxNCArNDAzOCwxNCBAQAogICAgIGRvIHsKICAgICAgICAgaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfZ2c4MjU2MykgewogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDI5LCAweDAwMWQpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwYzEpOwotICAgICAgICBpZihyZXRfdmFsKSBicmVhazsKKyAgICAgICAgaWYgKHJldF92YWwpIGJyZWFrOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMzAsIDB4MDAwMCk7Ci0gICAgICAgIGlmKHJldF92YWwpIGJyZWFrOworICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7CiAgICAgICAgIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOwotICAgIH0gd2hpbGUoMCk7CisgICAgfSB3aGlsZSAoMCk7CiAKICAgICByZXR1cm4gcmV0X3ZhbDsKIH0KQEAgLTQwNjAsMjMgKzQwNzcsMjMgQEAKIAogICAgIC8qIENoZWNrIHBvbGFyaXR5IHN0YXR1cyAqLwogICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19wb2xhcml0eShodywgJnBvbGFyaXR5KTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OwogCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX01ESVgpID4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUOwogCi0gICAgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgaWYgKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQogICAgICAgIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDAwTUJQUykgewogICAgICAgICAvKiBMb2NhbC9SZW1vdGUgUmVjZWl2ZXIgSW5mb3JtYXRpb24gYXJlIG9ubHkgdmFsaWQgYXQgMTAwMCBNYnBzICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgcGh5X2luZm8tPmxvY2FsX3J4ID0gKHBoeV9kYXRhICYgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTKSA+PgpAQCAtNDA4NiwxOSArNDEwMywxOSBAQAogCiAgICAgICAgIC8qIEdldCBjYWJsZSBsZW5ndGggKi8KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9jYWJsZV9sZW5ndGgoaHcsICZtaW5fbGVuZ3RoLCAmbWF4X2xlbmd0aCk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgLyogVHJhbnNsYXRlIHRvIG9sZCBtZXRob2QgKi8KICAgICAgICAgYXZlcmFnZSA9IChtYXhfbGVuZ3RoICsgbWluX2xlbmd0aCkgLyAyOwogCi0gICAgICAgIGlmKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkKKyAgICAgICAgaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkKICAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfNTA7Ci0gICAgICAgIGVsc2UgaWYoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwKQorICAgICAgICBlbHNlIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODApCiAgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwOwotICAgICAgICBlbHNlIGlmKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTApCisgICAgICAgIGVsc2UgaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTApCiAgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMDsKLSAgICAgICAgZWxzZSBpZihhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwKQorICAgICAgICBlbHNlIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwKQogICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzE0MDsKQEAgLTQxNzQsNyArNDE5MSw3IEBACiAgICAgcGh5X2luZm8tPmRvd25zaGlmdCA9IChlMTAwMF9kb3duc2hpZnQpaHctPnNwZWVkX2Rvd25ncmFkZWQ7CiAKICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPQpAQCAtNDE4NiwxMiArNDIwMywxMiBAQAogCiAgICAgLyogQ2hlY2sgcG9sYXJpdHkgc3RhdHVzICovCiAgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OwogCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgcGh5X2luZm8tPm1kaXhfbW9kZSA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfTURJWCkgPj4KQEAgLTQyMTQsNyArNDIzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IChwaHlfZGF0YSAmIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUykgPj4KQEAgLTQyNTEsMjAgKzQyNjgsMjAgQEAKICAgICBwaHlfaW5mby0+bG9jYWxfcnggPSBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfdW5kZWZpbmVkOwogICAgIHBoeV9pbmZvLT5yZW1vdGVfcnggPSBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfdW5kZWZpbmVkOwogCi0gICAgaWYoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKyAgICBpZiAoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKICAgICAgICAgREVCVUdPVVQoIlBIWSBpbmZvIGlzIG9ubHkgdmFsaWQgZm9yIGNvcHBlciBtZWRpYVxuIik7CiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKICAgICB9CiAKICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmKChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgIT0gTUlJX1NSX0xJTktfU1RBVFVTKSB7CisgICAgaWYgKChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgIT0gTUlJX1NSX0xJTktfU1RBVFVTKSB7CiAgICAgICAgIERFQlVHT1VUKCJQSFkgaW5mbyBpcyBvbmx5IHZhbGlkIGlmIGxpbmsgaXMgdXBcbiIpOwogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CiAgICAgfQpAQCAtNDI4NCw3ICs0MzAxLDcgQEAKIHsKICAgICBERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5ncyIpOwogCi0gICAgaWYoIWh3LT5hdXRvbmVnICYmIChody0+bWRpeCA9PSAwIHx8IGh3LT5tZGl4ID09IDMpKSB7CisgICAgaWYgKCFody0+YXV0b25lZyAmJiAoaHctPm1kaXggPT0gMCB8fCBody0+bWRpeCA9PSAzKSkgewogICAgICAgICBERUJVR09VVCgiSW52YWxpZCBNREkgc2V0dGluZyBkZXRlY3RlZFxuIik7CiAgICAgICAgIGh3LT5tZGl4ID0gMTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwpAQCAtNDMzMSw3ICs0MzQ4LDcgQEAKICAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CiAgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOwotICAgICAgICBpZihlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7CisgICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7CiAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQzOTksNyArNDQxNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IFRSVUU7CiAgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBUUlVFOwotICAgICAgICBpZihlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IEZBTFNFKSB7CisgICAgICAgIGlmIChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IEZBTFNFKSB7CiAgICAgICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fZmxhc2g7CiAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDIwNDg7CiAKQEAgLTQ0NjAsMTcgKzQ0NzcsMTcgQEAKICAgICAgICAgLyogZWVwcm9tX3NpemUgd2lsbCBiZSBhbiBlbnVtIFswLi44XSB0aGF0IG1hcHMgdG8gZWVwcm9tIHNpemVzIDEyOEIgdG8KICAgICAgICAgICogMzJLQiAoaW5jcmVtZW50ZWQgYnkgcG93ZXJzIG9mIDIpLgogICAgICAgICAgKi8KLSAgICAgICAgaWYoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKICAgICAgICAgICAgIC8qIFNldCB0byBkZWZhdWx0IHZhbHVlIGZvciBpbml0aWFsIGVlcHJvbSByZWFkLiAqLwogICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgICAgIGVlcHJvbV9zaXplID0gKGVlcHJvbV9zaXplICYgRUVQUk9NX1NJWkVfTUFTSykgPj4gRUVQUk9NX1NJWkVfU0hJRlQ7CiAgICAgICAgICAgICAvKiAyNTZCIGVlcHJvbSBzaXplIHdhcyBub3Qgc3VwcG9ydGVkIGluIGVhcmxpZXIgaGFyZHdhcmUsIHNvIHdlCiAgICAgICAgICAgICAgKiBidW1wIGVlcHJvbV9zaXplIHVwIG9uZSB0byBlbnN1cmUgdGhhdCAiMSIgKHdoaWNoIG1hcHMgdG8gMjU2QikKICAgICAgICAgICAgICAqIGlzIG5ldmVyIHRoZSByZXN1bHQgdXNlZCBpbiB0aGUgc2hpZnRpbmcgbG9naWMgYmVsb3cuICovCi0gICAgICAgICAgICBpZihlZXByb21fc2l6ZSkKKyAgICAgICAgICAgIGlmIChlZXByb21fc2l6ZSkKICAgICAgICAgICAgICAgICBlZXByb21fc2l6ZSsrOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZWVwcm9tX3NpemUgPSAodWludDE2X3QpKChlZWNkICYgRTEwMDBfRUVDRF9TSVpFX0VYX01BU0spID4+CkBAIC00NTU1LDcgKzQ1NzIsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ESTsKIAotICAgICAgICBpZihkYXRhICYgbWFzaykKKyAgICAgICAgaWYgKGRhdGEgJiBtYXNrKQogICAgICAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0RJOwogCiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CkBAIC00NTY4LDcgKzQ1ODUsNyBAQAogCiAgICAgICAgIG1hc2sgPSBtYXNrID4+IDE7CiAKLSAgICB9IHdoaWxlKG1hc2spOworICAgIH0gd2hpbGUgKG1hc2spOwogCiAgICAgLyogV2UgbGVhdmUgdGhlICJESSIgYml0IHNldCB0byAiMCIgd2hlbiB3ZSBsZWF2ZSB0aGlzIHJvdXRpbmUuICovCiAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ESTsKQEAgLTQ2MDAsMTQgKzQ2MTcsMTQgQEAKICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ETyB8IEUxMDAwX0VFQ0RfREkpOwogICAgIGRhdGEgPSAwOwogCi0gICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CiAgICAgICAgIGUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOwogCiAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CiAKICAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkpOwotICAgICAgICBpZihlZWNkICYgRTEwMDBfRUVDRF9ETykKKyAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0RPKQogICAgICAgICAgICAgZGF0YSB8PSAxOwogCiAgICAgICAgIGUxMDAwX2xvd2VyX2VlX2NsayhodywgJmVlY2QpOwpAQCAtNDYzOCwxNyArNDY1NSwxNyBAQAogCiAgICAgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MykgewogICAgICAgICAvKiBSZXF1ZXN0IEVFUFJPTSBBY2Nlc3MgKi8KLSAgICAgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CiAgICAgICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfUkVROwogICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKICAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7Ci0gICAgICAgICAgICB3aGlsZSgoIShlZWNkICYgRTEwMDBfRUVDRF9HTlQpKSAmJgorICAgICAgICAgICAgd2hpbGUgKCghKGVlY2QgJiBFMTAwMF9FRUNEX0dOVCkpICYmCiAgICAgICAgICAgICAgICAgICAoaSA8IEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUykpIHsKICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgdWRlbGF5KDUpOwogICAgICAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighKGVlY2QgJiBFMTAwMF9FRUNEX0dOVCkpIHsKKyAgICAgICAgICAgIGlmICghKGVlY2QgJiBFMTAwMF9FRUNEX0dOVCkpIHsKICAgICAgICAgICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1JFUTsKICAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOwogICAgICAgICAgICAgICAgIERFQlVHT1VUKCJDb3VsZCBub3QgYWNxdWlyZSBFRVBST00gZ3JhbnRcbiIpOwpAQCAtNDY5MSw3ICs0NzA4LDcgQEAKIAogICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CiAKLSAgICBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewogICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfU0spOwogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CkBAIC00NzE0LDcgKzQ3MzEsNyBAQAogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CiAgICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOwotICAgIH0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgIH0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKICAgICAgICAgLyogVG9nZ2xlIENTIHRvIGZsdXNoIGNvbW1hbmRzICovCiAgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKQEAgLTQ3NDgsNyArNDc2NSw3IEBACiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CiAKICAgICAgICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7Ci0gICAgfSBlbHNlIGlmKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgfSBlbHNlIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewogICAgICAgICAvKiBjbGVhbnVwIGVlcHJvbSAqLwogCiAgICAgICAgIC8qIENTIG9uIE1pY3Jvd2lyZSBpcyBhY3RpdmUtaGlnaCAqLwpAQCAtNDc3MCw3ICs0Nzg3LDcgQEAKICAgICB9CiAKICAgICAvKiBTdG9wIHJlcXVlc3RpbmcgRUVQUk9NIGFjY2VzcyAqLwotICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CiAgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfUkVROwogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOwogICAgIH0KQEAgLTQ4MDgsMTIgKzQ4MjUsMTIgQEAKICAgICAgICAgcmV0cnlfY291bnQgKz0gNTsKIAogICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7Ci0gICAgfSB3aGlsZShyZXRyeV9jb3VudCA8IEVFUFJPTV9NQVhfUkVUUllfU1BJKTsKKyAgICB9IHdoaWxlIChyZXRyeV9jb3VudCA8IEVFUFJPTV9NQVhfUkVUUllfU1BJKTsKIAogICAgIC8qIEFUTUVMIFNQSSB3cml0ZSB0aW1lIGNvdWxkIHZhcnkgZnJvbSAwLTIwbVNlYyBvbiAzLjNWIGRldmljZXMgKGFuZAogICAgICAqIG9ubHkgMC01bVNlYyBvbiA1ViBkZXZpY2VzKQogICAgICAqLwotICAgIGlmKHJldHJ5X2NvdW50ID49IEVFUFJPTV9NQVhfUkVUUllfU1BJKSB7CisgICAgaWYgKHJldHJ5X2NvdW50ID49IEVFUFJPTV9NQVhfUkVUUllfU1BJKSB7CiAgICAgICAgIERFQlVHT1VUKCJTUEkgRUVQUk9NIFN0YXR1cyBlcnJvclxuIik7CiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKICAgICB9CkBAIC00ODQ0LDcgKzQ4NjEsNyBAQAogICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKICAgICAgKiBlbm91Z2ggd29yZHMuCiAgICAgICovCi0gICAgaWYoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8CisgICAgaWYgKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAogICAgICAgICh3b3JkcyA9PSAwKSkgewogICAgICAgICBERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwpAQCAtNDg1Miw3ICs0ODY5LDcgQEAKIAogICAgIC8qIEZMQVNIIHJlYWRzIHdpdGhvdXQgYWNxdWlyaW5nIHRoZSBzZW1hcGhvcmUgYXJlIHNhZmUgKi8KICAgICBpZiAoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSA9PSBUUlVFICYmCi0gICAgaHctPmVlcHJvbS51c2VfZWVyZCA9PSBGQUxTRSkgeworICAgICAgICBody0+ZWVwcm9tLnVzZV9lZXJkID09IEZBTFNFKSB7CiAgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAgICAgICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ4NzksNyArNDg5Niw3IEBACiAgICAgICAgIHVpbnQxNl90IHdvcmRfaW47CiAgICAgICAgIHVpbnQ4X3QgcmVhZF9vcGNvZGUgPSBFRVBST01fUkVBRF9PUENPREVfU1BJOwogCi0gICAgICAgIGlmKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSB7CisgICAgICAgIGlmIChlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KGh3KSkgewogICAgICAgICAgICAgZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOwogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgICAgICB9CkBAIC00ODg3LDcgKzQ5MDQsNyBAQAogICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CiAKICAgICAgICAgLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCi0gICAgICAgIGlmKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisgICAgICAgIGlmICgoZWVwcm9tLT5hZGRyZXNzX2JpdHMgPT0gOCkgJiYgKG9mZnNldCA+PSAxMjgpKQogICAgICAgICAgICAgcmVhZF9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CiAKICAgICAgICAgLyogU2VuZCB0aGUgUkVBRCBjb21tYW5kIChvcGNvZGUgKyBhZGRyKSAgKi8KQEAgLTQ5MDMsNyArNDkyMCw3IEBACiAgICAgICAgICAgICB3b3JkX2luID0gZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhodywgMTYpOwogICAgICAgICAgICAgZGF0YVtpXSA9ICh3b3JkX2luID4+IDgpIHwgKHdvcmRfaW4gPDwgOCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICB9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CiAgICAgICAgICAgICAvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLwogICAgICAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9SRUFEX09QQ09ERV9NSUNST1dJUkUsCkBAIC00OTQ4LDcgKzQ5NjUsNyBAQAogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFUkQsIGVlcmQpOwogICAgICAgICBlcnJvciA9IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoaHcsIEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpOwogCi0gICAgICAgIGlmKGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGF0YVtpXSA9IChFMTAwMF9SRUFEX1JFRyhodywgRUVSRCkgPj4gRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBKTsKQEAgLTQ5ODUsNyArNTAwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfRUVQUk9NX1JXX1JFR19TVEFSVDsKIAogICAgICAgICBlcnJvciA9IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoaHcsIEUxMDAwX0VFUFJPTV9QT0xMX1dSSVRFKTsKLSAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00OTkzLDcgKzUwMTAsNyBAQAogCiAgICAgICAgIGVycm9yID0gZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShodywgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUpOwogCi0gICAgICAgIGlmKGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC01MDE0LDEzICs1MDMxLDEzIEBACiAgICAgdWludDMyX3QgaSwgcmVnID0gMDsKICAgICBpbnQzMl90IGRvbmUgPSBFMTAwMF9FUlJfRUVQUk9NOwogCi0gICAgZm9yKGkgPSAwOyBpIDwgYXR0ZW1wdHM7IGkrKykgewotICAgICAgICBpZihlZXJkID09IEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpCisgICAgZm9yIChpID0gMDsgaSA8IGF0dGVtcHRzOyBpKyspIHsKKyAgICAgICAgaWYgKGVlcmQgPT0gRTEwMDBfRUVQUk9NX1BPTExfUkVBRCkKICAgICAgICAgICAgIHJlZyA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRVJEKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmVnID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFV1IpOwogCi0gICAgICAgIGlmKHJlZyAmIEUxMDAwX0VFUFJPTV9SV19SRUdfRE9ORSkgeworICAgICAgICBpZiAocmVnICYgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FKSB7CiAgICAgICAgICAgICBkb25lID0gRTEwMDBfU1VDQ0VTUzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC01MDUyLDcgKzUwNjksNyBAQAogICAgICAgICBlZWNkID0gKChlZWNkID4+IDE1KSAmIDB4MDMpOwogCiAgICAgICAgIC8qIElmIGJvdGggYml0cyBhcmUgc2V0LCBkZXZpY2UgaXMgRmxhc2ggdHlwZSAqLwotICAgICAgICBpZihlZWNkID09IDB4MDMpIHsKKyAgICAgICAgaWYgKGVlY2QgPT0gMHgwMykgewogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQpAQCAtNTExNyw3ICs1MTM0LDcgQEAKICAgICAgICAgY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7CiAgICAgfQogCi0gICAgaWYoY2hlY2tzdW0gPT0gKHVpbnQxNl90KSBFRVBST01fU1VNKQorICAgIGlmIChjaGVja3N1bSA9PSAodWludDE2X3QpIEVFUFJPTV9TVU0pCiAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogICAgIGVsc2UgewogICAgICAgICBERUJVR09VVCgiRUVQUk9NIENoZWNrc3VtIEludmFsaWRcbiIpOwpAQCAtNTE0MiwxNSArNTE1OSwxNSBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CiAKLSAgICBmb3IoaSA9IDA7IGkgPCBFRVBST01fQ0hFQ0tTVU1fUkVHOyBpKyspIHsKLSAgICAgICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEVFUFJPTV9DSEVDS1NVTV9SRUc7IGkrKykgeworICAgICAgICBpZiAoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CiAgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrc3VtICs9IGVlcHJvbV9kYXRhOwogICAgIH0KICAgICBjaGVja3N1bSA9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSAtIGNoZWNrc3VtOwotICAgIGlmKGUxMDAwX3dyaXRlX2VlcHJvbShodywgRUVQUk9NX0NIRUNLU1VNX1JFRywgMSwgJmNoZWNrc3VtKSA8IDApIHsKKyAgICBpZiAoZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCBFRVBST01fQ0hFQ0tTVU1fUkVHLCAxLCAmY2hlY2tzdW0pIDwgMCkgewogICAgICAgICBERUJVR09VVCgiRUVQUk9NIFdyaXRlIEVycm9yXG4iKTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgIH0gZWxzZSBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9mbGFzaCkgewpAQCAtNTE5MiwxNCArNTIwOSwxNCBAQAogICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKICAgICAgKiBlbm91Z2ggd29yZHMuCiAgICAgICovCi0gICAgaWYoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8CisgICAgaWYgKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAogICAgICAgICh3b3JkcyA9PSAwKSkgewogICAgICAgICBERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgIH0KIAogICAgIC8qIDgyNTczIHdyaXRlcyBvbmx5IHRocm91Z2ggZWV3ciAqLwotICAgIGlmKGVlcHJvbS0+dXNlX2Vld3IgPT0gVFJVRSkKKyAgICBpZiAoZWVwcm9tLT51c2VfZWV3ciA9PSBUUlVFKQogICAgICAgICByZXR1cm4gZTEwMDBfd3JpdGVfZWVwcm9tX2Vld3IoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOwogCiAgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21faWNoOCkKQEAgLTUyMDksNyArNTIyNiw3IEBACiAgICAgaWYgKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CiAKLSAgICBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewogICAgICAgICBzdGF0dXMgPSBlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBlMTAwMF93cml0ZV9lZXByb21fc3BpKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKQEAgLTUyNDUsNyArNTI2Miw3IEBACiAgICAgd2hpbGUgKHdpZHggPCB3b3JkcykgewogICAgICAgICB1aW50OF90IHdyaXRlX29wY29kZSA9IEVFUFJPTV9XUklURV9PUENPREVfU1BJOwogCi0gICAgICAgIGlmKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIGlmIChlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KGh3KSkgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogCiAgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKIApAQCAtNTI1Niw3ICs1MjczLDcgQEAKICAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOwogCiAgICAgICAgIC8qIFNvbWUgU1BJIGVlcHJvbXMgdXNlIHRoZSA4dGggYWRkcmVzcyBiaXQgZW1iZWRkZWQgaW4gdGhlIG9wY29kZSAqLwotICAgICAgICBpZigoZWVwcm9tLT5hZGRyZXNzX2JpdHMgPT0gOCkgJiYgKG9mZnNldCA+PSAxMjgpKQorICAgICAgICBpZiAoKGVlcHJvbS0+YWRkcmVzc19iaXRzID09IDgpICYmIChvZmZzZXQgPj0gMTI4KSkKICAgICAgICAgICAgIHdyaXRlX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKIAogICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICg4LWJpdCBvcGNvZGUgKyBhZGRyKSAqLwpAQCAtNTI3OCw3ICs1Mjk1LDcgQEAKICAgICAgICAgICAgICAqIG9wZXJhdGlvbiwgd2hpbGUgdGhlIHNtYWxsZXIgZWVwcm9tcyBhcmUgY2FwYWJsZSBvZiBhbiA4LWJ5dGUKICAgICAgICAgICAgICAqIFBBR0UgV1JJVEUgb3BlcmF0aW9uLiAgQnJlYWsgdGhlIGlubmVyIGxvb3AgdG8gcGFzcyBuZXcgYWRkcmVzcwogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZigoKChvZmZzZXQgKyB3aWR4KSoyKSAlIGVlcHJvbS0+cGFnZV9zaXplKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKCgob2Zmc2V0ICsgd2lkeCkqMikgJSBlZXByb20tPnBhZ2Vfc2l6ZSkgPT0gMCkgewogICAgICAgICAgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTUzNDQsMTIgKzUzNjEsMTIgQEAKICAgICAgICAgICogc2lnbmFsIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIGJ5IHJhaXNpbmcgdGhlIERPIHNpZ25hbC4KICAgICAgICAgICogSWYgRE8gZG9lcyBub3QgZ28gaGlnaCBpbiAxMCBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgogICAgICAgICAgKi8KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CiAgICAgICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOwotICAgICAgICAgICAgaWYoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pIGJyZWFrOworICAgICAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0RPKSBicmVhazsKICAgICAgICAgICAgIHVkZWxheSg1MCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYoaSA9PSAyMDApIHsKKyAgICAgICAgaWYgKGkgPT0gMjAwKSB7CiAgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgICAgICB9CkBAIC01NTQwLDQwICs1NTU3LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmVhZHMgdGhlIGFkYXB0ZXIncyBwYXJ0IG51bWJlciBmcm9tIHRoZSBFRVBST00KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogcGFydF9udW0gLSBBZGFwdGVyJ3MgcGFydCBudW1iZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QKLWUxMDAwX3JlYWRfcGFydF9udW0oc3RydWN0IGUxMDAwX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBhcnRfbnVtKQotewotICAgIHVpbnQxNl90IG9mZnNldCA9IEVFUFJPTV9QQkFfQllURV8xOwotICAgIHVpbnQxNl90IGVlcHJvbV9kYXRhOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX3BhcnRfbnVtIik7Ci0KLSAgICAvKiBHZXQgd29yZCAwIGZyb20gRUVQUk9NICovCi0gICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIG9mZnNldCwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKLSAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgIH0KLSAgICAvKiBTYXZlIHdvcmQgMCBpbiB1cHBlciBoYWxmIG9mIHBhcnRfbnVtICovCi0gICAgKnBhcnRfbnVtID0gKHVpbnQzMl90KSAoZWVwcm9tX2RhdGEgPDwgMTYpOwotCi0gICAgLyogR2V0IHdvcmQgMSBmcm9tIEVFUFJPTSAqLwotICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCArK29mZnNldCwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKLSAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgIH0KLSAgICAvKiBTYXZlIHdvcmQgMSBpbiBsb3dlciBoYWxmIG9mIHBhcnRfbnVtICovCi0gICAgKnBhcnRfbnVtIHw9IGVlcHJvbV9kYXRhOwotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgTUFDIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NIGFuZCBpbnZlcnRzIHRoZSBMU0IgZm9yIHRoZQogICogc2Vjb25kIGZ1bmN0aW9uIG9mIGR1YWwgZnVuY3Rpb24gZGV2aWNlcwogICoKQEAgLTU1ODcsOSArNTU3MCw5IEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfbWFjX2FkZHIiKTsKIAotICAgIGZvcihpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpICs9IDIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkgKz0gMikgewogICAgICAgICBvZmZzZXQgPSBpID4+IDE7Ci0gICAgICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgb2Zmc2V0LCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgewogICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKICAgICAgICAgfQpAQCAtNTYwNCwxMiArNTU4NywxMiBAQAogICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CiAgICAgY2FzZSBlMTAwMF84MjU3MToKICAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotICAgICAgICBpZihFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisgICAgICAgIGlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCiAgICAgICAgICAgICBody0+cGVybV9tYWNfYWRkcls1XSBePSAweDAxOwogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBmb3IoaSA9IDA7IGkgPCBOT0RFX0FERFJFU1NfU0laRTsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBOT0RFX0FERFJFU1NfU0laRTsgaSsrKQogICAgICAgICBody0+bWFjX2FkZHJbaV0gPSBody0+cGVybV9tYWNfYWRkcltpXTsKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KQEAgLTU2NDgsNyArNTYzMSw3IEBACiAKICAgICAvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCiAgICAgREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7Ci0gICAgZm9yKGkgPSAxOyBpIDwgcmFyX251bTsgaSsrKSB7CisgICAgZm9yIChpID0gMTsgaSA8IHJhcl9udW07IGkrKykgewogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKChpIDw8IDEpICsgMSksIDApOwpAQCAtNTY5OSw3ICs1NjgyLDcgQEAKICAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSkgJiYgKGh3LT5sYWFfaXNfcHJlc2VudCA9PSBUUlVFKSkKICAgICAgICAgbnVtX3Jhcl9lbnRyeSAtPSAxOwogCi0gICAgZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IG51bV9yYXJfZW50cnk7IGkrKykgeworICAgIGZvciAoaSA9IHJhcl91c2VkX2NvdW50OyBpIDwgbnVtX3Jhcl9lbnRyeTsgaSsrKSB7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpLCAwKTsKICAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOwogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGkgPDwgMSkgKyAxKSwgMCk7CkBAIC01NzExLDEzICs1Njk0LDEzIEBACiAgICAgbnVtX210YV9lbnRyeSA9IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOwogICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKICAgICAgICAgbnVtX210YV9lbnRyeSA9IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTX0lDSDhMQU47Ci0gICAgZm9yKGkgPSAwOyBpIDwgbnVtX210YV9lbnRyeTsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9tdGFfZW50cnk7IGkrKykgewogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKICAgICB9CiAKICAgICAvKiBBZGQgdGhlIG5ldyBhZGRyZXNzZXMgKi8KLSAgICBmb3IoaSA9IDA7IGkgPCBtY19hZGRyX2NvdW50OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWNfYWRkcl9jb3VudDsgaSsrKSB7CiAgICAgICAgIERFQlVHT1VUKCIgQWRkaW5nIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIik7CiAgICAgICAgIERFQlVHT1VUNygiIE1DIEFkZHIgIyVkID0lLjJYICUuMlggJS4yWCAlLjJYICUuMlggJS4yWFxuIiwgaSwKICAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCldLApAQCAtNTg0OSw3ICs1ODMyLDcgQEAKICAgICAgKiBpbiB0aGUgTVRBLCBzYXZlIG9mZiB0aGUgcHJldmlvdXMgZW50cnkgYmVmb3JlIHdyaXRpbmcgYW5kCiAgICAgICogcmVzdG9yZSB0aGUgb2xkIHZhbHVlIGFmdGVyIHdyaXRpbmcuCiAgICAgICovCi0gICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChoYXNoX3JlZyAmIDB4MSkgPT0gMSkpIHsKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChoYXNoX3JlZyAmIDB4MSkgPT0gMSkpIHsKICAgICAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIChoYXNoX3JlZyAtIDEpKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnLCBtdGEpOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CkBAIC01OTk5LDcgKzU5ODIsNyBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9pZF9sZWRfaW5pdCIpOwogCi0gICAgaWYoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDApIHsKKyAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDApIHsKICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKICAgICB9CkBAIC02MDA5LDcgKzU5OTIsNyBAQAogICAgIGh3LT5sZWRjdGxfbW9kZTEgPSBody0+bGVkY3RsX2RlZmF1bHQ7CiAgICAgaHctPmxlZGN0bF9tb2RlMiA9IGh3LT5sZWRjdGxfZGVmYXVsdDsKIAotICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSURfTEVEX1NFVFRJTkdTLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lEX0xFRF9TRVRUSU5HUywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgIH0KQEAgLTYwMjYsNyArNjAwOSw3IEBACiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgdGVtcCA9IChlZXByb21fZGF0YSA+PiAoaSA8PCAyKSkgJiBsZWRfbWFzazsKLSAgICAgICAgc3dpdGNoKHRlbXApIHsKKyAgICAgICAgc3dpdGNoICh0ZW1wKSB7CiAgICAgICAgIGNhc2UgSURfTEVEX09OMV9ERUYyOgogICAgICAgICBjYXNlIElEX0xFRF9PTjFfT04yOgogICAgICAgICBjYXNlIElEX0xFRF9PTjFfT0ZGMjoKQEAgLTYwNDMsNyArNjAyNiw3IEBACiAgICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2godGVtcCkgeworICAgICAgICBzd2l0Y2ggKHRlbXApIHsKICAgICAgICAgY2FzZSBJRF9MRURfREVGMV9PTjI6CiAgICAgICAgIGNhc2UgSURfTEVEX09OMV9PTjI6CiAgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT04yOgpAQCAtNjA3Nyw3ICs2MDYwLDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGVkIik7CiAKLSAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKICAgICBjYXNlIGUxMDAwXzgyNTQzOgpAQCAtNjA5MSwxNiArNjA3NCwxNiBAQAogICAgICAgICAvKiBUdXJuIG9mZiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgZW5hYmxlZCkgKi8KICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3LT5waHlfc3BkX2RlZmF1bHQpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoaHctPnBoeV9zcGRfZGVmYXVsdCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5JR1AwMUUxMDAwX0dNSUlfU1BEKSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIC8qIEZhbGwgVGhyb3VnaCAqLwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKICAgICAgICAgICAgIGxlZGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOwogICAgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IExFRENUTCBzZXR0aW5ncyAqLwogICAgICAgICAgICAgaHctPmxlZGN0bF9kZWZhdWx0ID0gbGVkY3RsOwpAQCAtNjExMSw3ICs2MDk0LDcgQEAKICAgICAgICAgICAgIGxlZGN0bCB8PSAoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiA8PAogICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKTsKICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRjdGwpOwotICAgICAgICB9IGVsc2UgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpCisgICAgICAgIH0gZWxzZSBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpCiAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgaHctPmxlZGN0bF9tb2RlMSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTYxMTksNiArNjEwMiw3IEBACiAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVXNlZCBvbiA4MjU3MSBhbmQgbGF0ZXIgU2kgdGhhdCBoYXMgTEVEIGJsaW5rIGJpdHMuCiAgKiBDYWxsZXJzIG11c3QgdXNlIHRoZWlyIG93biB0aW1lciBhbmQgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYWxsZWQKQEAgLTYxNjksNyArNjE1Myw3IEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2NsZWFudXBfbGVkIik7CiAKLSAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKICAgICBjYXNlIGUxMDAwXzgyNTQzOgpAQCAtNjE4Myw3ICs2MTY3LDcgQEAKICAgICAgICAgLyogVHVybiBvbiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgcHJldmlvdXNseSBlbmFibGVkKSAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5waHlfc3BkX2RlZmF1bHQpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KICAgICBkZWZhdWx0OgpAQCAtNjIxMSw3ICs2MTk1LDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfbGVkX29uIik7CiAKLSAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKICAgICBjYXNlIGUxMDAwXzgyNTQzOgpAQCAtNjIyMCw3ICs2MjA0LDcgQEAKICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKICAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLwogICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CiAgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKQEAgLTYyMzEsNyArNjIxNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgewogICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KICAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKICAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOwpAQCAtNjI2Miw3ICs2MjQ2LDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfbGVkX29mZiIpOwogCi0gICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CiAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CiAgICAgY2FzZSBlMTAwMF84MjU0MzoKQEAgLTYyNzEsNyArNjI1NSw3IEBACiAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOwogICAgICAgICBicmVhazsKICAgICBjYXNlIGUxMDAwXzgyNTQ0OgotICAgICAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CiAgICAgICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KICAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKICAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOwpAQCAtNjI4Miw3ICs2MjY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CiAgICAgICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCiAgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKICAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOwpAQCAtNjMwNiw3ICs2MjkwLDcgQEAKICAqCiAgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKK3ZvaWQKIGUxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAgICAgdm9sYXRpbGUgdWludDMyX3QgdGVtcDsKQEAgLTYzNjksNyArNjM1Myw3IEBACiAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNUFRDKTsKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEJQVEMpOwogCi0gICAgaWYoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHJldHVybjsKKyAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHJldHVybjsKIAogICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQUxHTkVSUkMpOwogICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhFUlJDKTsKQEAgLTYzNzgsMTMgKzYzNjIsMTMgQEAKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RDKTsKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RGQyk7CiAKLSAgICBpZihody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDQpIHJldHVybjsKKyAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ0KSByZXR1cm47CiAKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1HVFBSQyk7CiAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNR1RQREMpOwogICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTUdUUFRDKTsKIAotICAgIGlmKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikgcmV0dXJuOworICAgIGlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHJldHVybjsKIAogICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUFDKTsKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhPQyk7CkBAIC02NDE1LDggKzYzOTksOCBAQAogewogICAgIERFQlVHRlVOQygiZTEwMDBfcmVzZXRfYWRhcHRpdmUiKTsKIAotICAgIGlmKGh3LT5hZGFwdGl2ZV9pZnMpIHsKLSAgICAgICAgaWYoIWh3LT5pZnNfcGFyYW1zX2ZvcmNlZCkgeworICAgIGlmIChody0+YWRhcHRpdmVfaWZzKSB7CisgICAgICAgIGlmICghaHctPmlmc19wYXJhbXNfZm9yY2VkKSB7CiAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKICAgICAgICAgICAgIGh3LT5pZnNfbWluX3ZhbCA9IElGU19NSU47CiAgICAgICAgICAgICBody0+aWZzX21heF92YWwgPSBJRlNfTUFYOwpAQCAtNjQ0MywxMiArNjQyNywxMiBAQAogewogICAgIERFQlVHRlVOQygiZTEwMDBfdXBkYXRlX2FkYXB0aXZlIik7CiAKLSAgICBpZihody0+YWRhcHRpdmVfaWZzKSB7Ci0gICAgICAgIGlmKChody0+Y29sbGlzaW9uX2RlbHRhICogaHctPmlmc19yYXRpbykgPiBody0+dHhfcGFja2V0X2RlbHRhKSB7Ci0gICAgICAgICAgICBpZihody0+dHhfcGFja2V0X2RlbHRhID4gTUlOX05VTV9YTUlUUykgeworICAgIGlmIChody0+YWRhcHRpdmVfaWZzKSB7CisgICAgICAgIGlmICgoaHctPmNvbGxpc2lvbl9kZWx0YSAqIGh3LT5pZnNfcmF0aW8pID4gaHctPnR4X3BhY2tldF9kZWx0YSkgeworICAgICAgICAgICAgaWYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPiBNSU5fTlVNX1hNSVRTKSB7CiAgICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gVFJVRTsKLSAgICAgICAgICAgICAgICBpZihody0+Y3VycmVudF9pZnNfdmFsIDwgaHctPmlmc19tYXhfdmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGh3LT5jdXJyZW50X2lmc192YWwgPT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA8IGh3LT5pZnNfbWF4X3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCA9IGh3LT5pZnNfbWluX3ZhbDsKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCArPSBody0+aWZzX3N0ZXBfc2l6ZTsKQEAgLTY0NTYsNyArNjQ0MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaHctPmluX2lmc19tb2RlICYmIChody0+dHhfcGFja2V0X2RlbHRhIDw9IE1JTl9OVU1fWE1JVFMpKSB7CisgICAgICAgICAgICBpZiAoaHctPmluX2lmc19tb2RlICYmIChody0+dHhfcGFja2V0X2RlbHRhIDw9IE1JTl9OVU1fWE1JVFMpKSB7CiAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCA9IDA7CiAgICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBBSVQsIDApOwpAQCAtNjUwMyw0NiArNjQ4Nyw0NiBAQAogICAgICAqIFRoaXMgY291bGQgYmUgc2ltcGxpZmllZCBpZiBhbGwgZW52aXJvbm1lbnRzIHN1cHBvcnRlZAogICAgICAqIDY0LWJpdCBpbnRlZ2Vycy4KICAgICAgKi8KLSAgICBpZihjYXJyeV9iaXQgJiYgKChzdGF0cy0+Z29yY2wgJiAweDgwMDAwMDAwKSA9PSAwKSkKKyAgICBpZiAoY2FycnlfYml0ICYmICgoc3RhdHMtPmdvcmNsICYgMHg4MDAwMDAwMCkgPT0gMCkpCiAgICAgICAgIHN0YXRzLT5nb3JjaCsrOwogICAgIC8qIElzIHRoaXMgYSBicm9hZGNhc3Qgb3IgbXVsdGljYXN0PyAgQ2hlY2sgYnJvYWRjYXN0IGZpcnN0LAogICAgICAqIHNpbmNlIHRoZSB0ZXN0IGZvciBhIG11bHRpY2FzdCBmcmFtZSB3aWxsIHRlc3QgcG9zaXRpdmUgb24KICAgICAgKiBhIGJyb2FkY2FzdCBmcmFtZS4KICAgICAgKi8KLSAgICBpZigobWFjX2FkZHJbMF0gPT0gKHVpbnQ4X3QpIDB4ZmYpICYmIChtYWNfYWRkclsxXSA9PSAodWludDhfdCkgMHhmZikpCisgICAgaWYgKChtYWNfYWRkclswXSA9PSAodWludDhfdCkgMHhmZikgJiYgKG1hY19hZGRyWzFdID09ICh1aW50OF90KSAweGZmKSkKICAgICAgICAgLyogQnJvYWRjYXN0IHBhY2tldCAqLwogICAgICAgICBzdGF0cy0+YnByYysrOwotICAgIGVsc2UgaWYoKm1hY19hZGRyICYgMHgwMSkKKyAgICBlbHNlIGlmICgqbWFjX2FkZHIgJiAweDAxKQogICAgICAgICAvKiBNdWx0aWNhc3QgcGFja2V0ICovCiAgICAgICAgIHN0YXRzLT5tcHJjKys7CiAKLSAgICBpZihmcmFtZV9sZW4gPT0gaHctPm1heF9mcmFtZV9zaXplKSB7CisgICAgaWYgKGZyYW1lX2xlbiA9PSBody0+bWF4X2ZyYW1lX3NpemUpIHsKICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgaGFyZHdhcmUgaGFzIG92ZXJjb3VudGVkIHRoZSBudW1iZXIgb2YKICAgICAgICAgICogb3ZlcnNpemUgZnJhbWVzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYoc3RhdHMtPnJvYyA+IDApCisgICAgICAgIGlmIChzdGF0cy0+cm9jID4gMCkKICAgICAgICAgICAgIHN0YXRzLT5yb2MtLTsKICAgICB9CiAKICAgICAvKiBBZGp1c3QgdGhlIGJpbiBjb3VudGVycyB3aGVuIHRoZSBleHRyYSBieXRlIHB1dCB0aGUgZnJhbWUgaW4gdGhlCiAgICAgICogd3JvbmcgYmluLiBSZW1lbWJlciB0aGF0IHRoZSBmcmFtZV9sZW4gd2FzIGFkanVzdGVkIGFib3ZlLgogICAgICAqLwotICAgIGlmKGZyYW1lX2xlbiA9PSA2NCkgeworICAgIGlmIChmcmFtZV9sZW4gPT0gNjQpIHsKICAgICAgICAgc3RhdHMtPnByYzY0Kys7CiAgICAgICAgIHN0YXRzLT5wcmMxMjctLTsKLSAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDEyNykgeworICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDEyNykgewogICAgICAgICBzdGF0cy0+cHJjMTI3Kys7CiAgICAgICAgIHN0YXRzLT5wcmMyNTUtLTsKLSAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDI1NSkgeworICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDI1NSkgewogICAgICAgICBzdGF0cy0+cHJjMjU1Kys7CiAgICAgICAgIHN0YXRzLT5wcmM1MTEtLTsKLSAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDUxMSkgeworICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDUxMSkgewogICAgICAgICBzdGF0cy0+cHJjNTExKys7CiAgICAgICAgIHN0YXRzLT5wcmMxMDIzLS07Ci0gICAgfSBlbHNlIGlmKGZyYW1lX2xlbiA9PSAxMDIzKSB7CisgICAgfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gMTAyMykgewogICAgICAgICBzdGF0cy0+cHJjMTAyMysrOwogICAgICAgICBzdGF0cy0+cHJjMTUyMi0tOwotICAgIH0gZWxzZSBpZihmcmFtZV9sZW4gPT0gMTUyMikgeworICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDE1MjIpIHsKICAgICAgICAgc3RhdHMtPnByYzE1MjIrKzsKICAgICB9CiB9CkBAIC02NTgyLDEwICs2NTY2LDEwIEBACiAgICAgICAgIGh3LT5idXNfdHlwZSA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJWF9NT0RFKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c190eXBlX3BjaXggOiBlMTAwMF9idXNfdHlwZV9wY2k7CiAKLSAgICAgICAgaWYoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUikgeworICAgICAgICBpZiAoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUikgewogICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfYnVzX3NwZWVkXzY2IDogZTEwMDBfYnVzX3NwZWVkXzEyMDsKLSAgICAgICAgfSBlbHNlIGlmKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2kpIHsKKyAgICAgICAgfSBlbHNlIGlmIChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpKSB7CiAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0k2NikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8zMzsKICAgICAgICAgfSBlbHNlIHsKQEAgLTY2ODAsMTEgKzY2NjQsMTEgQEAKICAgICAqbWluX2xlbmd0aCA9ICptYXhfbGVuZ3RoID0gMDsKIAogICAgIC8qIFVzZSBvbGQgbWV0aG9kIGZvciBQaHkgb2xkZXIgdGhhbiBJR1AgKi8KLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgewogCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICBjYWJsZV9sZW5ndGggPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCkgPj4KICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQ7CkBAIC02NzQzLDcgKzY3MjcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApIHsgLyogRm9yIElHUCBQSFkgKi8KKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7IC8qIEZvciBJR1AgUEhZICovCiAgICAgICAgIHVpbnQxNl90IGN1cl9hZ2NfdmFsdWU7CiAgICAgICAgIHVpbnQxNl90IG1pbl9hZ2NfdmFsdWUgPSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRTsKICAgICAgICAgdWludDE2X3QgYWdjX3JlZ19hcnJheVtJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQpAQCAtNjc1MiwxMCArNjczNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19DLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19EfTsKICAgICAgICAgLyogUmVhZCB0aGUgQUdDIHJlZ2lzdGVycyBmb3IgYWxsIGNoYW5uZWxzICovCi0gICAgICAgIGZvcihpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKIAogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgYWdjX3JlZ19hcnJheVtpXSwgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgY3VyX2FnY192YWx1ZSA9IHBoeV9kYXRhID4+IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVDsKQEAgLTY4MDUsNyArNjc4OSw3IEBACiAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotCSAgICAvKiBHZXR0aW5nIGJpdHMgMTU6OSwgd2hpY2ggcmVwcmVzZW50IHRoZSBjb21iaW5hdGlvbiBvZiBjb3Vyc2UgYW5kCisgICAgICAgICAgICAvKiBHZXR0aW5nIGJpdHMgMTU6OSwgd2hpY2ggcmVwcmVzZW50IHRoZSBjb21iaW5hdGlvbiBvZiBjb3Vyc2UgYW5kCiAgICAgICAgICAgICAgKiBmaW5lIGdhaW4gdmFsdWVzLiAgVGhlIHJlc3VsdCBpcyBhIG51bWJlciB0aGF0IGNhbiBiZSBwdXQgaW50bwogICAgICAgICAgICAgICogdGhlIGxvb2t1cCB0YWJsZSB0byBvYnRhaW4gdGhlIGFwcHJveGltYXRlIGNhYmxlIGxlbmd0aC4gKi8KICAgICAgICAgICAgIGN1cl9hZ2NfaW5kZXggPSAocGh5X2RhdGEgPj4gSUdQMDJFMTAwMF9BR0NfTEVOR1RIX1NISUZUKSAmCkBAIC02ODcwLDcgKzY4NTQsNyBAQAogICAgICAgICAvKiByZXR1cm4gdGhlIFBvbGFyaXR5IGJpdCBpbiB0aGUgU3RhdHVzIHJlZ2lzdGVyLiAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgKnBvbGFyaXR5ID0gKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkpID4+CiAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZX1NISUZUOwpAQCAtNjg4MCwxOCArNjg2NCwxOCBAQAogICAgICAgICAvKiBSZWFkIHRoZSBTdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHNwZWVkICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgLyogSWYgc3BlZWQgaXMgMTAwMCBNYnBzLCBtdXN0IHJlYWQgdGhlIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyB0bwogICAgICAgICAgKiBmaW5kIHRoZSBwb2xhcml0eSBzdGF0dXMgKi8KLSAgICAgICAgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgIGlmICgocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KICAgICAgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CiAKICAgICAgICAgICAgIC8qIFJlYWQgdGhlIEdJRyBpbml0aWFsaXphdGlvbiBQQ1MgcmVnaXN0ZXIgKDB4MDBCNCkgKi8KICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHBvbGFyaXR5IGJpdHMgKi8KQEAgLTY5NDAsNyArNjkyNCw3IEBACiAgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfTElOS19IRUFMVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICBody0+c3BlZWRfZG93bmdyYWRlZCA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUExIUl9TU19ET1dOR1JBREUpID8gMSA6IDA7CkBAIC02OTQ4LDcgKzY5MzIsNyBAQAogICAgICAgICAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RPV05TSElGVCkgPj4KQEAgLTY5ODgsNDIgKzY5NzIsNDIgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZSIpOwogCi0gICAgaWYoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZ3ApCisgICAgaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwKQogICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAotICAgIGlmKGxpbmtfdXApIHsKKyAgICBpZiAobGlua191cCkgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7Ci0gICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHNwZWVkID09IFNQRUVEXzEwMDApIHsKKyAgICAgICAgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApIHsKIAogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9jYWJsZV9sZW5ndGgoaHcsICZtaW5fbGVuZ3RoLCAmbWF4X2xlbmd0aCk7CiAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgaWYoKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZCkgJiYKKyAgICAgICAgICAgIGlmICgoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkKSAmJgogICAgICAgICAgICAgICAgIG1pbl9sZW5ndGggPj0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkgewogCi0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWDsKIAogICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgZHNwX3JlZ19hcnJheVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZigoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkKSAmJgorICAgICAgICAgICAgaWYgKChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQpICYmCiAgICAgICAgICAgICAgICAobWluX2xlbmd0aCA8IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApKSB7CiAKICAgICAgICAgICAgICAgICB1aW50MTZfdCBmZmVfaWRsZV9lcnJfdGltZW91dCA9IEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwOwpAQCAtNzAzMiw3MCArNzAxNiw3MCBAQAogICAgICAgICAgICAgICAgIC8qIGNsZWFyIHByZXZpb3VzIGlkbGUgZXJyb3IgY291bnRzICovCiAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBmZmVfaWRsZV9lcnJfdGltZW91dDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZmZV9pZGxlX2Vycl90aW1lb3V0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwMDApOwogICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgICAgICAgICAgaWRsZV9lcnJzICs9IChwaHlfZGF0YSAmIFNSXzEwMDBUX0lETEVfRVJST1JfQ05UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoaWRsZV9lcnJzID4gU1JfMTAwMFRfUEhZX0VYQ0VTU0lWRV9JRExFX0VSUl9DT1VOVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaWRsZV9lcnJzID4gU1JfMTAwMFRfUEhZX0VYQ0VTU0lWRV9JRExFX0VSUl9DT1VOVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9DTV9DUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmKGlkbGVfZXJycykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkbGVfZXJycykKICAgICAgICAgICAgICAgICAgICAgICAgIGZmZV9pZGxlX2Vycl90aW1lb3V0ID0gRkZFX0lETEVfRVJSX0NPVU5UX1RJTUVPVVRfMTAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkKSB7CisgICAgICAgIGlmIChody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkgewogICAgICAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0CiAgICAgICAgICAgICAgKiB0aGUgZW5kIG9mIHRoZSByb3V0aW5lcy4gKi8KICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIDB4MkY1QiwgJnBoeV9zYXZlZF9kYXRhKTsKIAotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CiAKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgbXNlY19kZWxheV9pcnEoMjApOwogCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX0ZPUkNFX0dJR0EpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVg7CiAgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gIElHUDAxRTEwMDBfUEhZX0VEQUNfU0lHTl9FWFRfOV9CSVRTOwogCiAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsZHNwX3JlZ19hcnJheVtpXSwgcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgIG1zZWNfZGVsYXlfaXJxKDIwKTsKQEAgLTcxMDMsNDAgKzcwODcsNDAgQEAKICAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZihody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkgeworICAgICAgICBpZiAoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUpIHsKICAgICAgICAgICAgIC8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAogICAgICAgICAgICAgICogdGhlIGVuZCBvZiB0aGUgcm91dGluZXMuICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgUEhZIHRyYW5zbWl0dGVyICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOwogCi0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgIG1zZWNfZGVsYXlfaXJxKDIwKTsKIAogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICBtc2VjX2RlbGF5X2lycSgyMCk7CkBAIC03MTQ0LDcgKzcxMjgsNyBAQAogICAgICAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIHBoeV9zYXZlZF9kYXRhKTsKIAotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKQEAgLTcxNjksMjAgKzcxNTMsMjAgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3BoeV9tb2RlIik7CiAKLSAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ1X3Jldl8zKSAmJgotICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMykgJiYKKyAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSkgewogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9QSFlfQ0xBU1NfV09SRCwgMSwgJmVlcHJvbV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBpZiAocmV0X3ZhbCkgewogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0KIAotICAgICAgICBpZigoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpICYmCi0gICAgICAgICAgIChlZXByb21fZGF0YSAmIEVFUFJPTV9QSFlfQ0xBU1NfQSkpIHsKKyAgICAgICAgaWYgKChlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgJiYKKyAgICAgICAgICAgIChlZXByb21fZGF0YSAmIEVFUFJPTV9QSFlfQ0xBU1NfQSkpIHsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwQik7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDgxMDQpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICBody0+cGh5X3Jlc2V0X2Rpc2FibGUgPSBGQUxTRTsKQEAgLTcyMzMsMTYgKzcyMTcsMTYgQEAKICAgICAgICAgcGh5X2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgUEhZX0NUUkwpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCi0gICAgaWYoIWFjdGl2ZSkgewotICAgICAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKLSAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fAorICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CiAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKQEAgLTcyNjQsMTMgKzcyNDgsMTMgQEAKICAgICAgICAgaWYgKGh3LT5zbWFydF9zcGVlZCA9PSBlMTAwMF9zbWFydF9zcGVlZF9vbikgewogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgewogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCkBAIC03MjgxLDE5ICs3MjY1LDE5IEBACiAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQogCi0gICAgfSBlbHNlIGlmKChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQpIHx8Ci0gICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwX0FMTCApIHx8Ci0gICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwpKSB7CisgICAgfSBlbHNlIGlmICgoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUKSB8fAorICAgICAgICAgICAgICAgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICkgfHwKKyAgICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwpKSB7CiAKLSAgICAgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKICAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgewogICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKQEAgLTczMTAsMTIgKzcyOTQsMTIgQEAKIAogICAgICAgICAvKiBXaGVuIExQTFUgaXMgZW5hYmxlZCB3ZSBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIH0KQEAgLTczNDUsMTQgKzczMjksMTQgQEAKICAgICB1aW50MTZfdCBwaHlfZGF0YTsKICAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9kMF9scGx1X3N0YXRlIik7CiAKLSAgICBpZihody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpCisgICAgaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKICAgICAgICAgcGh5X2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgUEhZX0NUUkwpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCkBAIC03Mzc0LDEzICs3MzU4LDEzIEBACiAgICAgICAgIGlmIChody0+c21hcnRfc3BlZWQgPT0gZTEwMDBfc21hcnRfc3BlZWRfb24pIHsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9IGVsc2UgaWYgKGh3LT5zbWFydF9zcGVlZCA9PSBlMTAwMF9zbWFydF9zcGVlZF9vZmYpIHsKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLApAQCAtNzM5MSw3ICs3Mzc1LDcgQEAKICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwogICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CiAKQEAgLTc0MTAsMTIgKzczOTQsMTIgQEAKIAogICAgICAgICAvKiBXaGVuIExQTFUgaXMgZW5hYmxlZCB3ZSBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkICovCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIH0KQEAgLTc0MzYsNyArNzQyMCw3IEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX3NldF92Y29fc3BlZWQiKTsKIAotICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewogICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CiAgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKICAgICAgICBicmVhazsKQEAgLTc0NDcsMzkgKzc0MzEsMzkgQEAKICAgICAvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDUsIGJpdCA4IHRvIDAgKi8KIAogICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJmRlZmF1bHRfcGFnZSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDUpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAmcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDg7CiAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgcGh5X2RhdGEpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogU2V0IFBIWSByZWdpc3RlciAzMCwgcGFnZSA0LCBiaXQgMTEgdG8gMSAqLwogCiAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA0KTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgJnBoeV9kYXRhKTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDExOwogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIHBoeV9kYXRhKTsKLSAgICBpZihyZXRfdmFsKQorICAgIGlmIChyZXRfdmFsKQogICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIGRlZmF1bHRfcGFnZSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKQEAgLTc1NTgsNyArNzU0Miw3IEBACiB7CiAgICAgdWludDhfdCAqdG1wOwogICAgIHVpbnQ4X3QgKmJ1ZnB0ciA9IGJ1ZmZlcjsKLSAgICB1aW50MzJfdCBkYXRhOworICAgIHVpbnQzMl90IGRhdGEgPSAwOwogICAgIHVpbnQxNl90IHJlbWFpbmluZywgaSwgaiwgcHJldl9ieXRlczsKIAogICAgIC8qIHN1bSA9IG9ubHkgc3VtIG9mIHRoZSBkYXRhIGFuZCBpdCBpcyBub3QgY2hlY2tzdW0gKi8KQEAgLTc2MzgsNyArNzYyMiw3IEBACiAKICAgICBidWZmZXIgPSAodWludDhfdCAqKSBoZHI7CiAgICAgaSA9IGxlbmd0aDsKLSAgICB3aGlsZShpLS0pCisgICAgd2hpbGUgKGktLSkKICAgICAgICAgc3VtICs9IGJ1ZmZlcltpXTsKIAogICAgIGhkci0+Y2hlY2tzdW0gPSAwIC0gc3VtOwpAQCAtNzY2MSw4ICs3NjQ1LDcgQEAKICAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludDMyX3QKLWUxMDAwX21uZ193cml0ZV9jb21taXQoCi0gICAgc3RydWN0IGUxMDAwX2h3ICogaHcpCitlMTAwMF9tbmdfd3JpdGVfY29tbWl0KHN0cnVjdCBlMTAwMF9odyAqIGh3KQogewogICAgIHVpbnQzMl90IGhpY3I7CiAKQEAgLTc4MzQsMzEgKzc4MTcsMzEgQEAKICAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCiAKICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGRik7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDApOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBOTyBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCi0gICAgZm9yKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworICAgIGZvciAoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CiAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIExpbmsgU3RhdHVzIGJpdAogICAgICAgICAgKiB0byBiZSBjbGVhci4KICAgICAgICAgICovCiAKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGlmKChtaWlfc3RhdHVzX3JlZyAmIH5NSUlfU1JfTElOS19TVEFUVVMpID09IDApIGJyZWFrOworICAgICAgICBpZiAoKG1paV9zdGF0dXNfcmVnICYgfk1JSV9TUl9MSU5LX1NUQVRVUykgPT0gMCkgYnJlYWs7CiAgICAgICAgIG1zZWNfZGVsYXlfaXJxKDEwMCk7CiAgICAgfQogCkBAIC03ODY4LDQwICs3ODUxLDQwIEBACiAgICAgLyogTm93IHdlIHdpbGwgcmUtZW5hYmxlIHRoIHRyYW5zbWl0dGVyIG9uIHRoZSBQSFkgKi8KIAogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAxOSk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgbXNlY19kZWxheV9pcnEoNTApOwogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGMCk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgbXNlY19kZWxheV9pcnEoNTApOwogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkYwMCk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgbXNlY19kZWxheV9pcnEoNTApOwogICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4MDAwMCk7Ci0gICAgaWYocmV0X3ZhbCkKKyAgICBpZiAocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDApOwotICAgIGlmKHJldF92YWwpCisgICAgaWYgKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCi0gICAgZm9yKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworICAgIGZvciAoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CiAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIExpbmsgU3RhdHVzIGJpdAogICAgICAgICAgKiB0byBiZSBzZXQuCiAgICAgICAgICAqLwogCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7Ci0gICAgICAgIGlmKHJldF92YWwpCisgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZihtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CiAgICAgICAgIG1zZWNfZGVsYXlfaXJxKDEwMCk7CiAgICAgfQogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwpAQCAtNzk4MCwxNSArNzk2MywxNSBAQAogCiAgICAgZTEwMDBfc2V0X3BjaV9leHByZXNzX21hc3Rlcl9kaXNhYmxlKGh3KTsKIAotICAgIHdoaWxlKHRpbWVvdXQpIHsKLSAgICAgICAgaWYoIShFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19HSU9fTUFTVEVSX0VOQUJMRSkpCisgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgaWYgKCEoRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfR0lPX01BU1RFUl9FTkFCTEUpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHVkZWxheSgxMDApOwogICAgICAgICB0aW1lb3V0LS07CiAgICAgfQogCi0gICAgaWYoIXRpbWVvdXQpIHsKKyAgICBpZiAoIXRpbWVvdXQpIHsKICAgICAgICAgREVCVUdPVVQoIk1hc3RlciByZXF1ZXN0cyBhcmUgcGVuZGluZy5cbiIpOwogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9NQVNURVJfUkVRVUVTVFNfUEVORElORzsKICAgICB9CkBAIC04MDI5LDcgKzgwMTIsNyBAQAogICAgICAgICAgICAgdGltZW91dC0tOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoIXRpbWVvdXQpIHsKKyAgICAgICAgaWYgKCF0aW1lb3V0KSB7CiAgICAgICAgICAgICBERUJVR09VVCgiQXV0byByZWFkIGJ5IEhXIGZyb20gRUVQUk9NIGhhcyBub3QgY29tcGxldGVkLlxuIik7CiAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9SRVNFVDsKICAgICAgICAgfQpAQCAtODExMCw3ICs4MDkzLDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUiKTsKIAotICAgIGlmKCFody0+ZWVwcm9tX3NlbWFwaG9yZV9wcmVzZW50KQorICAgIGlmICghaHctPmVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudCkKICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CkBAIC04MTIxLDIwICs4MTA0LDIwIEBACiAKICAgICAvKiBHZXQgdGhlIEZXIHNlbWFwaG9yZS4gKi8KICAgICB0aW1lb3V0ID0gaHctPmVlcHJvbS53b3JkX3NpemUgKyAxOwotICAgIHdoaWxlKHRpbWVvdXQpIHsKKyAgICB3aGlsZSAodGltZW91dCkgewogICAgICAgICBzd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNXU00pOwogICAgICAgICBzd3NtIHw9IEUxMDAwX1NXU01fU1dFU01CSTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTV1NNLCBzd3NtKTsKICAgICAgICAgLyogaWYgd2UgbWFuYWdlZCB0byBzZXQgdGhlIGJpdCB3ZSBnb3QgdGhlIHNlbWFwaG9yZS4gKi8KICAgICAgICAgc3dzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV1NNKTsKLSAgICAgICAgaWYoc3dzbSAmIEUxMDAwX1NXU01fU1dFU01CSSkKKyAgICAgICAgaWYgKHN3c20gJiBFMTAwMF9TV1NNX1NXRVNNQkkpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICB1ZGVsYXkoNTApOwogICAgICAgICB0aW1lb3V0LS07CiAgICAgfQogCi0gICAgaWYoIXRpbWVvdXQpIHsKKyAgICBpZiAoIXRpbWVvdXQpIHsKICAgICAgICAgLyogUmVsZWFzZSBzZW1hcGhvcmVzICovCiAgICAgICAgIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKGh3KTsKICAgICAgICAgREVCVUdPVVQoIkRyaXZlciBjYW4ndCBhY2Nlc3MgdGhlIEVlcHJvbSAtIFNXRVNNQkkgYml0IGlzIHNldC5cbiIpOwpAQCAtODE1OSw3ICs4MTQyLDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUiKTsKIAotICAgIGlmKCFody0+ZWVwcm9tX3NlbWFwaG9yZV9wcmVzZW50KQorICAgIGlmICghaHctPmVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgc3dzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV1NNKTsKQEAgLTgxOTIsMTYgKzgxNzUsMTYgQEAKICAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgwMDAzZXMybGFuKQogICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAotICAgIHdoaWxlKHRpbWVvdXQpIHsKKyAgICB3aGlsZSAodGltZW91dCkgewogICAgICAgICBzd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNXU00pOwogICAgICAgICAvKiBJZiBTTUJJIGJpdCBjbGVhcmVkLCBpdCBpcyBub3cgc2V0IGFuZCB3ZSBob2xkIHRoZSBzZW1hcGhvcmUgKi8KLSAgICAgICAgaWYoIShzd3NtICYgRTEwMDBfU1dTTV9TTUJJKSkKKyAgICAgICAgaWYgKCEoc3dzbSAmIEUxMDAwX1NXU01fU01CSSkpCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgbXNlY19kZWxheV9pcnEoMSk7CiAgICAgICAgIHRpbWVvdXQtLTsKICAgICB9CiAKLSAgICBpZighdGltZW91dCkgeworICAgIGlmICghdGltZW91dCkgewogICAgICAgICBERUJVR09VVCgiRHJpdmVyIGNhbid0IGFjY2VzcyBkZXZpY2UgLSBTTUJJIGJpdCBpcyBzZXQuXG4iKTsKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUkVTRVQ7CiAgICAgfQpAQCAtODI3Nyw3ICs4MjYwLDcgQEAKICAgICBjYXNlIGUxMDAwXzgyNTczOgogICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CiAgICAgICAgIGZ3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgRldTTSk7Ci0gICAgICAgIGlmKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spICE9IDApCisgICAgICAgIGlmICgoZndzbSAmIEUxMDAwX0ZXU01fTU9ERV9NQVNLKSAhPSAwKQogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCmluZGV4IDM3NWI5NTUuLmExNzBlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApAQCAtMzM2LDkgKzMzNiw5IEBACiAjZGVmaW5lIEUxMDAwX0hJX01BWF9NTkdfREFUQV9MRU5HVEggICAgMHg2RjggICAvKiBIb3N0IEludGVyZmFjZSBkYXRhIGxlbmd0aCAqLwogCiAjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPTU1BTkRfVElNRU9VVCAgMTAgICAgICAvKiBUaW1lIGluIG1zIHRvIHByb2Nlc3MgTU5HIGNvbW1hbmQgKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX09GRlNFVAkweDZGMCAgIC8qIENvb2tpZSBvZmZzZXQgKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX0xFTkdUSAkweDEwICAgIC8qIENvb2tpZSBsZW5ndGggKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0lBTVRfTU9ERQkJMHgzCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9PRkZTRVQgICAgMHg2RjAgICAvKiBDb29raWUgb2Zmc2V0ICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEggICAgMHgxMCAgICAvKiBDb29raWUgbGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX01OR19JQU1UX01PREUgICAgICAgICAgICAgMHgzCiAjZGVmaW5lIEUxMDAwX01OR19JQ0hfSUFNVF9NT0RFICAgICAgICAgMHgyCiAjZGVmaW5lIEUxMDAwX0lBTVRfU0lHTkFUVVJFICAgICAgICAgICAgMHg1NDRENDE0OSAvKiBJbnRlbChSKSBBY3RpdmUgTWFuYWdlbWVudCBUZWNobm9sb2d5IHNpZ25hdHVyZSAqLwogCkBAIC0zODUsNyArMzg1LDcgQEAKICNlbmRpZgogCiBpbnQzMl90IGUxMDAwX21uZ193cml0ZV9kaGNwX2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqYnVmZmVyLAotCQkJCQkJCXVpbnQxNl90IGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKTsKIGJvb2xlYW5fdCBlMTAwMF9jaGVja19tbmdfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGJvb2xlYW5fdCBlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIApAQCAtNDcwLDYgKzQ3MCw3IEBACiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX0NPUFBFUiAgICAgIDB4MTA1RQogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUiAgICAgICAweDEwNUYKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTICAgICAgMHgxMDYwCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSIDB4MTBBNAogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzJFSV9DT1BQRVIgICAgICAweDEwN0QKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUlfRklCRVIgICAgICAgMHgxMDdFCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJX1NFUkRFUyAgICAgIDB4MTA3RgpAQCAtNTIzLDcgKzUyNCw3IEBACiAKIAogLyogODAyLjFxIFZMQU4gUGFja2V0IFNpemVzICovCi0jZGVmaW5lIFZMQU5fVEFHX1NJWkUgICAgICAgICAgICAgICAgICAgICA0ICAgICAvKiA4MDIuM2FjIHRhZyAobm90IERNQWVkKSAqLworI2RlZmluZSBWTEFOX1RBR19TSVpFICA0ICAgICAvKiA4MDIuM2FjIHRhZyAobm90IERNQWVkKSAqLwogCiAvKiBFdGhlcnR5cGUgZmllbGQgdmFsdWVzICovCiAjZGVmaW5lIEVUSEVSTkVUX0lFRUVfVkxBTl9UWVBFIDB4ODEwMCAgLyogODAyLjNhYyBwYWNrZXQgKi8KQEAgLTY5Nyw2ICs2OTgsNyBAQAogICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX0NYRSB8ICAgICAgICAgICAgXAogICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1JYRSkKIAorCiAvKiBUcmFuc21pdCBEZXNjcmlwdG9yICovCiBzdHJ1Y3QgZTEwMDBfdHhfZGVzYyB7CiAgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLwpAQCAtMjA4Niw3ICsyMDg4LDcgQEAKICNkZWZpbmUgRTEwMDBfTUFOQ19FTl9JUF9BRERSX0ZJTFRFUiAgICAweDAwNDAwMDAwIC8qIEVuYWJsZSBJUCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWx0ZXJpbmcgKi8KICNkZWZpbmUgRTEwMDBfTUFOQ19FTl9YU1VNX0ZJTFRFUiAgIDB4MDA4MDAwMDAgLyogRW5hYmxlIGNoZWNrc3VtIGZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0JSX0VOICAgICAgICAgICAgMHgwMTAwMDAwMCAvKiBFbmFibGUgYnJvYWRjYXN0IGZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0JSX0VOICAgICAgICAgMHgwMTAwMDAwMCAvKiBFbmFibGUgYnJvYWRjYXN0IGZpbHRlcmluZyAqLwogI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9SRVEgICAgICAgMHgwMTAwMDAwMCAvKiBTTUJ1cyBSZXF1ZXN0ICovCiAjZGVmaW5lIEUxMDAwX01BTkNfU01CX0dOVCAgICAgICAweDAyMDAwMDAwIC8qIFNNQnVzIEdyYW50ICovCiAjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19JTiAgICAweDA0MDAwMDAwIC8qIFNNQnVzIENsb2NrIEluICovCkBAIC0yMTcyLDcgKzIxNzQsNyBAQAogCiAjZGVmaW5lIEUxMDAwX01EQUxJR04gICAgICAgICAgNDA5NgogCi0vKiBQQ0ktRXggcmVnaXN0ZXJzICovCisvKiBQQ0ktRXggcmVnaXN0ZXJzKi8KIAogLyogUENJLUV4IENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRTEwMDBfR0NSX1JYRF9OT19TTk9PUCAgICAgICAgICAweDAwMDAwMDAxCkBAIC0yMjI0LDcgKzIyMjYsNyBAQAogI2RlZmluZSBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFICAweDEwIC8qIEVFUFJPTSBlcmFzdC93cml0ZSBkaXNhYmxlICovCiAKIC8qIEVFUFJPTSBDb21tYW5kcyAtIFNQSSAqLwotI2RlZmluZSBFRVBST01fTUFYX1JFVFJZX1NQSSAgICA1MDAwIC8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KKyNkZWZpbmUgRUVQUk9NX01BWF9SRVRSWV9TUEkgICAgICAgIDUwMDAgLyogTWF4IHdhaXQgb2YgNW1zLCBmb3IgUkRZIHNpZ25hbCAqLwogI2RlZmluZSBFRVBST01fUkVBRF9PUENPREVfU1BJICAgICAgMHgwMyAgLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCiAjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfU1BJICAgICAweDAyICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCiAjZGVmaW5lIEVFUFJPTV9BOF9PUENPREVfU1BJICAgICAgICAweDA4ICAvKiBvcGNvZGUgYml0LTMgPSBhZGRyZXNzIGJpdC04ICovCkBAIC0zMDgyLDEwICszMDg0LDEwIEBACiAKIC8qIERTUCBEaXN0YW5jZSBSZWdpc3RlciAoUGFnZSA1LCBSZWdpc3RlciAyNikgKi8KICNkZWZpbmUgR0c4MjU2M19EU1BEX0NBQkxFX0xFTkdUSCAgICAgICAgICAgICAgIDB4MDAwNyAvKiAwID0gPDUwTTsKLQkJCQkJCQkgICAgICAxID0gNTAtODBNOwotCQkJCQkJCSAgICAgIDIgPSA4MC0xMTBNOwotCQkJCQkJCSAgICAgIDMgPSAxMTAtMTQwTTsKLQkJCQkJCQkgICAgICA0ID0gPjE0ME0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gNTAtODBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSA4MC0xMTBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSAxMTAtMTQwTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gPjE0ME0gKi8KIAogLyogS3VtZXJhbiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKFBhZ2UgMTkzLCBSZWdpc3RlciAxNikgKi8KICNkZWZpbmUgR0c4MjU2M19LTUNSX1BIWV9MRURTX0VOICAgICAgICAgICAgICAgICAgICAweDAwMjAgLyogMT1QSFkgTEVEcywgMD1LdW1lcmFuIEluYmFuZCBMRURzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggNzI2ZjQzZC4uMWQ3Yzk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMzYsNyArMzYsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSSAiLU5BUEkiCiAjZW5kaWYKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMS45LWs0IkRSSVZFUk5BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMi43LWsyIkRSSVZFUk5BUEkKIGNoYXIgZTEwMDBfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogc3RhdGljIGNoYXIgZTEwMDBfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24uIjsKIApAQCAtNDgsNyArNDgsNiBAQAogICogICB7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZpY2VfaWQpfQogICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZTEwMDBfcGNpX3RibFtdID0gewotCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDApLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDEpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDQpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDgpLApAQCAtOTksNiArOTgsNyBAQAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOTgpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOTkpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOUEpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQTQpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQjUpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQjkpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQkEpLApAQCAtMjQ1LDcgKzI0NSw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgZTEwMDBfY29weXJpZ2h0KTsKIAotCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmZTEwMDBfZHJpdmVyKTsKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlMTAwMF9kcml2ZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ4NSw3ICs0ODUsNyBAQAogICoKICAqKi8KIAotc3RhdGljIHZvaWQgZTEwMDBfcG93ZXJfdXBfcGh5KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQordm9pZCBlMTAwMF9wb3dlcl91cF9waHkoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdWludDE2X3QgbWlpX3JlZyA9IDA7CiAKQEAgLTY4Miw5ICs2ODIsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhc2hfc3RhcnQsIGZsYXNoX2xlbjsKIAogCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOwotCXN0YXRpYyBpbnQgZTEwMDBfa3NwM19wb3J0X2EgPSAwOyAvKiBnbG9iYWwga3NwMyBwb3J0IGEgaW5kaWNhdGlvbiAqLworCXN0YXRpYyBpbnQgZ2xvYmFsX3F1YWRfcG9ydF9hID0gMDsgLyogZ2xvYmFsIGtzcDMgcG9ydCBhIGluZGljYXRpb24gKi8KIAlpbnQgaSwgZXJyLCBwY2lfdXNpbmdfZGFjOwotCXVpbnQxNl90IGVlcHJvbV9kYXRhOworCXVpbnQxNl90IGVlcHJvbV9kYXRhID0gMDsKIAl1aW50MTZfdCBlZXByb21fYXBtZV9tYXNrID0gRTEwMDBfRUVQUk9NX0FQTUU7CiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpCiAJCXJldHVybiBlcnI7CkBAIC02OTYsMjEgKzY5NiwyMCBAQAogCQlpZiAoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSAmJgogCQkgICAgKGVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpKSB7CiAJCQlFMTAwMF9FUlIoIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOwotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gZXJyX2RtYTsKIAkJfQogCQlwY2lfdXNpbmdfZGFjID0gMDsKIAl9CiAKIAlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgZTEwMDBfZHJpdmVyX25hbWUpKSkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfcGNpX3JlZzsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCisJZXJyID0gLUVOT01FTTsKIAluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGUxMDAwX2FkYXB0ZXIpKTsKLQlpZiAoIW5ldGRldikgewotCQllcnIgPSAtRU5PTUVNOworCWlmICghbmV0ZGV2KQogCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKLQl9CiAKIAlTRVRfTU9EVUxFX09XTkVSKG5ldGRldik7CiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKQEAgLTcyNSwxMSArNzI0LDEwIEBACiAJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBCQVJfMCk7CiAJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEJBUl8wKTsKIAorCWVyciA9IC1FSU87CiAJYWRhcHRlci0+aHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOwotCWlmICghYWRhcHRlci0+aHcuaHdfYWRkcikgewotCQllcnIgPSAtRUlPOworCWlmICghYWRhcHRlci0+aHcuaHdfYWRkcikKIAkJZ290byBlcnJfaW9yZW1hcDsKLQl9CiAKIAlmb3IgKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CiAJCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpID09IDApCkBAIC03NzQsNiArNzcyLDcgQEAKIAlpZiAoKGVyciA9IGUxMDAwX3N3X2luaXQoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zd19pbml0OwogCisJZXJyID0gLUVJTzsKIAkvKiBGbGFzaCBCQVIgbWFwcGluZyBtdXN0IGhhcHBlbiBhZnRlciBlMTAwMF9zd19pbml0CiAJICogYmVjYXVzZSBpdCBkZXBlbmRzIG9uIG1hY190eXBlICovCiAJaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJgpAQCAtNzgxLDI0ICs3ODAsMTMgQEAKIAkJZmxhc2hfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CiAJCWZsYXNoX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CiAJCWFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgPSBpb3JlbWFwKGZsYXNoX3N0YXJ0LCBmbGFzaF9sZW4pOwotCQlpZiAoIWFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MpIHsKLQkJCWVyciA9IC1FSU87CisJCWlmICghYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcykKIAkJCWdvdG8gZXJyX2ZsYXNobWFwOwotCQl9CiAJfQogCi0JaWYgKChlcnIgPSBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soJmFkYXB0ZXItPmh3KSkpCisJaWYgKGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKQogCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiUEhZIHJlc2V0IGlzIGJsb2NrZWQgZHVlIHRvIFNPTC9JREVSIHNlc3Npb24uXG4iKTsKIAotCS8qIGlmIGtzcDMsIGluZGljYXRlIGlmIGl0J3MgcG9ydCBhIGJlaW5nIHNldHVwICovCi0JaWYgKHBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzICYmCi0JCQllMTAwMF9rc3AzX3BvcnRfYSA9PSAwKQotCQlhZGFwdGVyLT5rc3AzX3BvcnRfYSA9IDE7Ci0JZTEwMDBfa3NwM19wb3J0X2ErKzsKLQkvKiBSZXNldCBmb3IgbXVsdGlwbGUgS1AzIGFkYXB0ZXJzICovCi0JaWYgKGUxMDAwX2tzcDNfcG9ydF9hID09IDQpCi0JCWUxMDAwX2tzcDNfcG9ydF9hID0gMDsKLQogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgewogCQluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CiAJCQkJICAgTkVUSUZfRl9IV19DU1VNIHwKQEAgLTgzMCw3ICs4MTgsNyBAQAogCiAJaWYgKGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcygmYWRhcHRlci0+aHcpKSB7CiAJCUUxMDAwX0VSUigiRUVQUk9NIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlPOworCQlnb3RvIGVycl9lZXByb207CiAJfQogCiAJLyogYmVmb3JlIHJlYWRpbmcgdGhlIEVFUFJPTSwgcmVzZXQgdGhlIGNvbnRyb2xsZXIgdG8KQEAgLTg0Miw3ICs4MzAsNiBAQAogCiAJaWYgKGUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSgmYWRhcHRlci0+aHcpIDwgMCkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJUaGUgRUVQUk9NIENoZWNrc3VtIElzIE5vdCBWYWxpZFxuIik7Ci0JCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX2VlcHJvbTsKIAl9CiAKQEAgLTg1NSwxMiArODQyLDkgQEAKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSW52YWxpZCBNQUMgQWRkcmVzc1xuIik7Ci0JCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX2VlcHJvbTsKIAl9CiAKLQllMTAwMF9yZWFkX3BhcnRfbnVtKCZhZGFwdGVyLT5odywgJihhZGFwdGVyLT5wYXJ0X251bSkpOwotCiAJZTEwMDBfZ2V0X2J1c19pbmZvKCZhZGFwdGVyLT5odyk7CiAKIAlpbml0X3RpbWVyKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyKTsKQEAgLTkyMSw3ICs5MDUsMzggQEAKIAkJYnJlYWs7CiAJfQogCWlmIChlZXByb21fZGF0YSAmIGVlcHJvbV9hcG1lX21hc2spCi0JCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX01BRzsKKwkJYWRhcHRlci0+ZWVwcm9tX3dvbCB8PSBFMTAwMF9XVUZDX01BRzsKKworCS8qIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGVlcHJvbSBzZXR0aW5ncywgYXBwbHkgdGhlIHNwZWNpYWwgY2FzZXMKKwkgKiB3aGVyZSB0aGUgZWVwcm9tIG1heSBiZSB3cm9uZyBvciB0aGUgYm9hcmQgc2ltcGx5IHdvbid0IHN1cHBvcnQKKwkgKiB3YWtlIG9uIGxhbiBvbiBhIHBhcnRpY3VsYXIgcG9ydCAqLworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFOgorCQlhZGFwdGVyLT5lZXByb21fd29sID0gMDsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVI6CisJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9uIHBvcnQgQSBmb3IgZHVhbCBmaWJlcgorCQkgKiByZWdhcmRsZXNzIG9mIGVlcHJvbSBzZXR0aW5nICovCisJCWlmIChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQorCQkJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgorCQkvKiBpZiBxdWFkIHBvcnQgYWRhcHRlciwgZGlzYWJsZSBXb0wgb24gYWxsIGJ1dCBwb3J0IEEgKi8KKwkJaWYgKGdsb2JhbF9xdWFkX3BvcnRfYSAhPSAwKQorCQkJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CisJCWVsc2UKKwkJCWFkYXB0ZXItPnF1YWRfcG9ydF9hID0gMTsKKwkJLyogUmVzZXQgZm9yIG11bHRpcGxlIHF1YWQgcG9ydCBhZGFwdGVycyAqLworCQlpZiAoKytnbG9iYWxfcXVhZF9wb3J0X2EgPT0gNCkKKwkJCWdsb2JhbF9xdWFkX3BvcnRfYSA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIGluaXRpYWxpemUgdGhlIHdvbCBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgZWVwcm9tIHNldHRpbmdzICovCisJYWRhcHRlci0+d29sID0gYWRhcHRlci0+ZWVwcm9tX3dvbDsKIAogCS8qIHByaW50IGJ1cyB0eXBlL3NwZWVkL3dpZHRoIGluZm8gKi8KIAl7CkBAIC05NjQsMTYgKzk3OSwzMyBAQAogCXJldHVybiAwOwogCiBlcnJfcmVnaXN0ZXI6CisJZTEwMDBfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOworZXJyX2VlcHJvbToKKwlpZiAoIWUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKQorCQllMTAwMF9waHlfaHdfcmVzZXQoJmFkYXB0ZXItPmh3KTsKKwogCWlmIChhZGFwdGVyLT5ody5mbGFzaF9hZGRyZXNzKQogCQlpb3VubWFwKGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MpOwogZXJyX2ZsYXNobWFwOgorI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKKwkJZGV2X3B1dCgmYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0pOworI2VuZGlmCisKKwlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKKwlrZnJlZShhZGFwdGVyLT5yeF9yaW5nKTsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCWtmcmVlKGFkYXB0ZXItPnBvbGxpbmdfbmV0ZGV2KTsKKyNlbmRpZgogZXJyX3N3X2luaXQ6Ci1lcnJfZWVwcm9tOgogCWlvdW5tYXAoYWRhcHRlci0+aHcuaHdfYWRkcik7CiBlcnJfaW9yZW1hcDoKIAlmcmVlX25ldGRldihuZXRkZXYpOwogZXJyX2FsbG9jX2V0aGVyZGV2OgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX3JlZzoKK2Vycl9kbWE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEyMDgsNyArMTI0MCw3IEBACiAKIAllcnIgPSBlMTAwMF9yZXF1ZXN0X2lycShhZGFwdGVyKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl91cDsKKwkJZ290byBlcnJfcmVxX2lycTsKIAogCWUxMDAwX3Bvd2VyX3VwX3BoeShhZGFwdGVyKTsKIApAQCAtMTIyOSw2ICsxMjYxLDkgQEAKIAlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAogZXJyX3VwOgorCWUxMDAwX3Bvd2VyX2Rvd25fcGh5KGFkYXB0ZXIpOworCWUxMDAwX2ZyZWVfaXJxKGFkYXB0ZXIpOworZXJyX3JlcV9pcnE6CiAJZTEwMDBfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogZXJyX3NldHVwX3J4OgogCWUxMDAwX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKQEAgLTEzODEsMTAgKzE0MTYsNiBAQAogICogCQkJCSAgKERlc2NyaXB0b3JzKSBmb3IgYWxsIHF1ZXVlcwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgotICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdpdGggYW4gZXJyb3IsIHRoZW4gaXQncyBwb3NzaWJsZSBvbmUgb3IKLSAqIG1vcmUgb2YgdGhlIHJpbmdzIGlzIHBvcHVsYXRlZCAod2hpbGUgdGhlIHJlc3QgYXJlIG5vdCkuICBJdCBpcyB0aGUKLSAqIGNhbGxlcnMgZHV0eSB0byBjbGVhbiB0aG9zZSBvcnBoYW5lZCByaW5ncy4KLSAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCiAgKiovCiAKQEAgLTEzOTgsNiArMTQyOSw5IEBACiAJCWlmIChlcnIpIHsKIAkJCURQUklOVEsoUFJPQkUsIEVSUiwKIAkJCQkiQWxsb2NhdGlvbiBmb3IgVHggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKKwkJCWZvciAoaS0tIDsgaSA+PSAwOyBpLS0pCisJCQkJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwKKwkJCQkJCQkmYWRhcHRlci0+dHhfcmluZ1tpXSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE0OTksOCArMTUzMyw2IEBACiAJfSBlbHNlIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pIHsKIAkJdGFyYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQVJDMCk7CiAJCXRhcmMgfD0gMTsKLQkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQotCQkJdGFyYyB8PSAoMSA8PCAyMCk7CiAJCUUxMDAwX1dSSVRFX1JFRyhodywgVEFSQzAsIHRhcmMpOwogCQl0YXJjID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRBUkMxKTsKIAkJdGFyYyB8PSAxOwpAQCAtMTYzOSwxMCArMTY3MSw2IEBACiAgKiAJCQkJICAoRGVzY3JpcHRvcnMpIGZvciBhbGwgcXVldWVzCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCi0gKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBhbiBlcnJvciwgdGhlbiBpdCdzIHBvc3NpYmxlIG9uZSBvcgotICogbW9yZSBvZiB0aGUgcmluZ3MgaXMgcG9wdWxhdGVkICh3aGlsZSB0aGUgcmVzdCBhcmUgbm90KS4gIEl0IGlzIHRoZQotICogY2FsbGVycyBkdXR5IHRvIGNsZWFuIHRob3NlIG9ycGhhbmVkIHJpbmdzLgotICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKICAqKi8KIApAQCAtMTY1Niw2ICsxNjg0LDkgQEAKIAkJaWYgKGVycikgewogCQkJRFBSSU5USyhQUk9CRSwgRVJSLAogCQkJCSJBbGxvY2F0aW9uIGZvciBSeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOworCQkJZm9yIChpLS0gOyBpID49IDA7IGktLSkKKwkJCQllMTAwMF9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyLAorCQkJCQkJCSZhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjQ0MiwxMCArMjQ3Myw5IEBACiAJCQkgKiBkaXNhYmxlIHJlY2VpdmVzIGluIHRoZSBJU1IgYW5kCiAJCQkgKiByZXNldCBkZXZpY2UgaGVyZSBpbiB0aGUgd2F0Y2hkb2cKIAkJCSAqLwotCQkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CisJCQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pCiAJCQkJLyogcmVzZXQgZGV2aWNlICovCiAJCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7Ci0JCQl9CiAJCX0KIAogCQllMTAwMF9zbWFydHNwZWVkKGFkYXB0ZXIpOwpAQCAtMjU0NSw3ICsyNTc1LDcgQEAKIAkJCWNtZF9sZW5ndGggPSBFMTAwMF9UWERfQ01EX0lQOwogCQkJaXBjc2UgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gMTsKICNpZmRlZiBORVRJRl9GX1RTT19JUFY2Ci0JCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9JUFY2KSkgeworCQl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKIAkJCXNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gMDsKIAkJCXNrYi0+aC50aC0+Y2hlY2sgPQogCQkJCX5jc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLApAQCAtMzY4MCw3ICszNzEwLDcgQEAKIAkJCUUxMDAwX0RCRygiJXM6IFJlY2VpdmUgcGFja2V0IGNvbnN1bWVkIG11bHRpcGxlIgogCQkJCSAgIiBidWZmZXJzXG4iLCBuZXRkZXYtPm5hbWUpOwogCQkJLyogcmVjeWNsZSAqLwotCQkJYnVmZmVyX2luZm8tPiBza2IgPSBza2I7CisJCQlidWZmZXJfaW5mby0+c2tiID0gc2tiOwogCQkJZ290byBuZXh0X2Rlc2M7CiAJCX0KIApAQCAtMzcxMSw3ICszNzQxLDYgQEAKIAkJCSAgICBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKIAkJCWlmIChuZXdfc2tiKSB7CiAJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKLQkJCQluZXdfc2tiLT5kZXYgPSBuZXRkZXY7CiAJCQkJbWVtY3B5KG5ld19za2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCiAJCQkJICAgICAgIHNrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTiwKIAkJCQkgICAgICAgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKQEAgLTM5NzgsMTMgKzQwMDcsMTMgQEAKIAlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAogCXdoaWxlIChjbGVhbmVkX2NvdW50LS0pIHsKLQkJaWYgKCEoc2tiID0gYnVmZmVyX2luZm8tPnNrYikpCi0JCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgYnVmc3opOwotCQllbHNlIHsKKwkJc2tiID0gYnVmZmVyX2luZm8tPnNrYjsKKwkJaWYgKHNrYikgewogCQkJc2tiX3RyaW0oc2tiLCAwKTsKIAkJCWdvdG8gbWFwX3NrYjsKIAkJfQogCisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IobmV0ZGV2LCBidWZzeik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLwogCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmZl9mYWlsZWQrKzsKQEAgLTQwMDksMTAgKzQwMzgsMTAgQEAKIAkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJZGV2X2tmcmVlX3NrYihvbGRza2IpOwogCQkJCWJyZWFrOyAvKiB3aGlsZSAhYnVmZmVyX2luZm8tPnNrYiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiBVc2UgbmV3IGFsbG9jYXRpb24gKi8KLQkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CiAJCQl9CisKKwkJCS8qIFVzZSBuZXcgYWxsb2NhdGlvbiAqLworCQkJZGV2X2tmcmVlX3NrYihvbGRza2IpOwogCQl9CiAJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKIAkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKQEAgLTQwMjAsOCArNDA0OSw2IEBACiAJCSAqLwogCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAKLQkJc2tiLT5kZXYgPSBuZXRkZXY7Ci0KIAkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKIAkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CiBtYXBfc2tiOgpAQCAtNDEzNSw4ICs0MTYyLDYgQEAKIAkJICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAotCQlza2ItPmRldiA9IG5ldGRldjsKLQogCQlidWZmZXJfaW5mby0+c2tiID0gc2tiOwogCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gYWRhcHRlci0+cnhfcHNfYnNpemUwOwogCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLApAQCAtNDYyOCw3ICs0NjUzLDcgQEAKIAkJZTEwMDBfc2V0X211bHRpKG5ldGRldik7CiAKIAkJLyogdHVybiBvbiBhbGwtbXVsdGkgbW9kZSBpZiB3YWtlIG9uIG11bHRpY2FzdCBpcyBlbmFibGVkICovCi0JCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX01DKSB7CisJCWlmICh3dWZjICYgRTEwMDBfV1VGQ19NQykgewogCQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CiAJCQlyY3RsIHw9IEUxMDAwX1JDVExfTVBFOwogCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7CkBAIC00NzAwLDExICs0NzI1LDE0IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdWludDMyX3QgbWFuYywgcmV0X3ZhbDsKKwl1aW50MzJfdCBtYW5jLCBlcnI7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJZTEwMDBfcGNpX3Jlc3RvcmVfc3RhdGUoYWRhcHRlcik7Ci0JcmV0X3ZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZTEwMDA6IENhbm5vdCBlbmFibGUgUENJIGRldmljZSBmcm9tIHN1c3BlbmRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKaW5kZXggMGVmNDEzMS4uMjEyODQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCkBAIC0zMjQsNyArMzI0LDYgQEAKIAkJRFBSSU5USyhQUk9CRSwgTk9USUNFLAogCQkgICAgICAgIldhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwgYmQpOwogCQlEUFJJTlRLKFBST0JFLCBOT1RJQ0UsICJVc2luZyBkZWZhdWx0cyBmb3IgYWxsIHZhbHVlc1xuIik7Ci0JCWJkID0gRTEwMDBfTUFYX05JQzsKIAl9CiAKIAl7IC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQgKi8KQEAgLTM0Miw5ICszNDEsMTQgQEAKIAkJb3B0LmFyZy5yLm1heCA9IG1hY190eXBlIDwgZTEwMDBfODI1NDQgPwogCQkJRTEwMDBfTUFYX1RYRCA6IEUxMDAwX01BWF84MjU0NF9UWEQ7CiAKLQkJdHhfcmluZy0+Y291bnQgPSBUeERlc2NyaXB0b3JzW2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZ0eF9yaW5nLT5jb3VudCwgJm9wdCwgYWRhcHRlcik7Ci0JCUUxMDAwX1JPVU5EVVAodHhfcmluZy0+Y291bnQsIFJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKKwkJaWYgKG51bV9UeERlc2NyaXB0b3JzID4gYmQpIHsKKwkJCXR4X3JpbmctPmNvdW50ID0gVHhEZXNjcmlwdG9yc1tiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJnR4X3JpbmctPmNvdW50LCAmb3B0LCBhZGFwdGVyKTsKKwkJCUUxMDAwX1JPVU5EVVAodHhfcmluZy0+Y291bnQsCisJCQkJCQlSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJCX0gZWxzZSB7CisJCQl0eF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKIAkJCXR4X3JpbmdbaV0uY291bnQgPSB0eF9yaW5nLT5jb3VudDsKIAl9CkBAIC0zNjMsOSArMzY3LDE0IEBACiAJCW9wdC5hcmcuci5tYXggPSBtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8gRTEwMDBfTUFYX1JYRCA6CiAJCQlFMTAwMF9NQVhfODI1NDRfUlhEOwogCi0JCXJ4X3JpbmctPmNvdW50ID0gUnhEZXNjcmlwdG9yc1tiZF07Ci0JCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOwotCQlFMTAwMF9ST1VORFVQKHJ4X3JpbmctPmNvdW50LCBSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJCWlmIChudW1fUnhEZXNjcmlwdG9ycyA+IGJkKSB7CisJCQlyeF9yaW5nLT5jb3VudCA9IFJ4RGVzY3JpcHRvcnNbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZyeF9yaW5nLT5jb3VudCwgJm9wdCwgYWRhcHRlcik7CisJCQlFMTAwMF9ST1VORFVQKHJ4X3JpbmctPmNvdW50LAorCQkJCQkJUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOworCQl9IGVsc2UgeworCQkJcnhfcmluZy0+Y291bnQgPSBvcHQuZGVmOworCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCQlyeF9yaW5nW2ldLmNvdW50ID0gcnhfcmluZy0+Y291bnQ7CiAJfQpAQCAtMzc3LDkgKzM4NiwxMyBAQAogCQkJLmRlZiAgPSBPUFRJT05fRU5BQkxFRAogCQl9OwogCi0JCWludCByeF9jc3VtID0gWHN1bVJYW2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZyeF9jc3VtLCAmb3B0LCBhZGFwdGVyKTsKLQkJYWRhcHRlci0+cnhfY3N1bSA9IHJ4X2NzdW07CisJCWlmIChudW1fWHN1bVJYID4gYmQpIHsKKwkJCWludCByeF9jc3VtID0gWHN1bVJYW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfY3N1bSwgJm9wdCwgYWRhcHRlcik7CisJCQlhZGFwdGVyLT5yeF9jc3VtID0gcnhfY3N1bTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnJ4X2NzdW0gPSBvcHQuZGVmOworCQl9CiAJfQogCXsgLyogRmxvdyBDb250cm9sICovCiAKQEAgLTM5OSw5ICs0MTIsMTMgQEAKIAkJCQkJIC5wID0gZmNfbGlzdCB9fQogCQl9OwogCi0JCWludCBmYyA9IEZsb3dDb250cm9sW2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZmYywgJm9wdCwgYWRhcHRlcik7Ci0JCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBmYzsKKwkJaWYgKG51bV9GbG93Q29udHJvbCA+IGJkKSB7CisJCQlpbnQgZmMgPSBGbG93Q29udHJvbFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmZjLCAmb3B0LCBhZGFwdGVyKTsKKwkJCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBmYzsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBvcHQuZGVmOworCQl9CiAJfQogCXsgLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5ICovCiAJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0gewpAQCAtNDEzLDggKzQzMCwxMyBAQAogCQkJCQkgLm1heCA9IE1BWF9UWERFTEFZIH19CiAJCX07CiAKLQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gVHhJbnREZWxheVtiZF07Ci0JCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfaW50X2RlbGF5LCAmb3B0LCBhZGFwdGVyKTsKKwkJaWYgKG51bV9UeEludERlbGF5ID4gYmQpIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheSA9IFR4SW50RGVsYXlbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT50eF9pbnRfZGVsYXksICZvcHQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT50eF9pbnRfZGVsYXkgPSBvcHQuZGVmOworCQl9CiAJfQogCXsgLyogVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5ICovCiAJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0gewpAQCAtNDI2LDkgKzQ0OCwxMyBAQAogCQkJCQkgLm1heCA9IE1BWF9UWEFCU0RFTEFZIH19CiAJCX07CiAKLQkJYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSA9IFR4QWJzSW50RGVsYXlbYmRdOwotCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXksICZvcHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyKTsKKwkJaWYgKG51bV9UeEFic0ludERlbGF5ID4gYmQpIHsKKwkJCWFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkgPSBUeEFic0ludERlbGF5W2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSwgJm9wdCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkgPSBvcHQuZGVmOworCQl9CiAJfQogCXsgLyogUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkgKi8KIAkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CkBAIC00NDAsOCArNDY2LDEzIEBACiAJCQkJCSAubWF4ID0gTUFYX1JYREVMQVkgfX0KIAkJfTsKIAotCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBSeEludERlbGF5W2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9pbnRfZGVsYXksICZvcHQsIGFkYXB0ZXIpOworCQlpZiAobnVtX1J4SW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+cnhfaW50X2RlbGF5ID0gUnhJbnREZWxheVtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2ludF9kZWxheSwgJm9wdCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnJ4X2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KIAl9CiAJeyAvKiBSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSAqLwogCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKQEAgLTQ1Myw5ICs0ODQsMTMgQEAKIAkJCQkJIC5tYXggPSBNQVhfUlhBQlNERUxBWSB9fQogCQl9OwogCi0JCWFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXkgPSBSeEFic0ludERlbGF5W2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5LCAmb3B0LAotCQkgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisJCWlmIChudW1fUnhBYnNJbnREZWxheSA+IGJkKSB7CisJCQlhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5ID0gUnhBYnNJbnREZWxheVtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXksICZvcHQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQogCX0KIAl7IC8qIEludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUgKi8KIAkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CkBAIC00NjcsMTggKzUwMiwyNCBAQAogCQkJCQkgLm1heCA9IE1BWF9JVFIgfX0KIAkJfTsKIAotCQlhZGFwdGVyLT5pdHIgPSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGVbYmRdOwotCQlzd2l0Y2ggKGFkYXB0ZXItPml0cikgewotCQljYXNlIDA6Ci0JCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiJXMgdHVybmVkIG9mZlxuIiwgb3B0Lm5hbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBzZXQgdG8gZHluYW1pYyBtb2RlXG4iLAotCQkJCW9wdC5uYW1lKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5pdHIsICZvcHQsIGFkYXB0ZXIpOwotCQkJYnJlYWs7CisJCWlmIChudW1fSW50ZXJydXB0VGhyb3R0bGVSYXRlID4gYmQpIHsKKwkJCWFkYXB0ZXItPml0ciA9IEludGVycnVwdFRocm90dGxlUmF0ZVtiZF07CisJCQlzd2l0Y2ggKGFkYXB0ZXItPml0cikgeworCQkJY2FzZSAwOgorCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyB0dXJuZWQgb2ZmXG4iLAorCQkJCSAgICAgICAgb3B0Lm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBzZXQgdG8gZHluYW1pYyBtb2RlXG4iLAorCQkJCSAgICAgICAgb3B0Lm5hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPml0ciwgJm9wdCwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5pdHIgPSBvcHQuZGVmOwogCQl9CiAJfQogCXsgLyogU21hcnQgUG93ZXIgRG93biAqLwpAQCAtNDg5LDkgKzUzMCwxMyBAQAogCQkJLmRlZiAgPSBPUFRJT05fRElTQUJMRUQKIAkJfTsKIAotCQlpbnQgc3BkID0gU21hcnRQb3dlckRvd25FbmFibGVbYmRdOwotCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJnNwZCwgJm9wdCwgYWRhcHRlcik7Ci0JCWFkYXB0ZXItPnNtYXJ0X3Bvd2VyX2Rvd24gPSBzcGQ7CisJCWlmIChudW1fU21hcnRQb3dlckRvd25FbmFibGUgPiBiZCkgeworCQkJaW50IHNwZCA9IFNtYXJ0UG93ZXJEb3duRW5hYmxlW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmc3BkLCAmb3B0LCBhZGFwdGVyKTsKKwkJCWFkYXB0ZXItPnNtYXJ0X3Bvd2VyX2Rvd24gPSBzcGQ7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5zbWFydF9wb3dlcl9kb3duID0gb3B0LmRlZjsKKwkJfQogCX0KIAl7IC8qIEt1bWVyYW4gTG9jayBMb3NzIFdvcmthcm91bmQgKi8KIAkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CkBAIC01MDEsOSArNTQ2LDEzIEBACiAJCQkuZGVmICA9IE9QVElPTl9FTkFCTEVECiAJCX07CiAKKwkJaWYgKG51bV9LdW1lcmFuTG9ja0xvc3MgPiBiZCkgewogCQkJaW50IGttcm5fbG9ja19sb3NzID0gS3VtZXJhbkxvY2tMb3NzW2JkXTsKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigma21ybl9sb2NrX2xvc3MsICZvcHQsIGFkYXB0ZXIpOwogCQkJYWRhcHRlci0+aHcua21ybl9sb2NrX2xvc3Nfd29ya2Fyb3VuZF9kaXNhYmxlZCA9ICFrbXJuX2xvY2tfbG9zczsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmh3Lmttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfZGlzYWJsZWQgPSAhb3B0LmRlZjsKKwkJfQogCX0KIAogCXN3aXRjaCAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSkgewpAQCAtNTMwLDE4ICs1NzksMTcgQEAKIGUxMDAwX2NoZWNrX2ZpYmVyX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOwotCWJkID0gYmQgPiBFMTAwMF9NQVhfTklDID8gRTEwMDBfTUFYX05JQyA6IGJkOwotCWlmICgoU3BlZWRbYmRdICE9IE9QVElPTl9VTlNFVCkpIHsKKwlpZiAobnVtX1NwZWVkID4gYmQpIHsKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlNwZWVkIG5vdCB2YWxpZCBmb3IgZmliZXIgYWRhcHRlcnMsICIKIAkJICAgICAgICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CiAJfQogCi0JaWYgKChEdXBsZXhbYmRdICE9IE9QVElPTl9VTlNFVCkpIHsKKwlpZiAobnVtX0R1cGxleCA+IGJkKSB7CiAJCURQUklOVEsoUFJPQkUsIElORk8sICJEdXBsZXggbm90IHZhbGlkIGZvciBmaWJlciBhZGFwdGVycywgIgogCQkgICAgICAgInBhcmFtZXRlciBpZ25vcmVkXG4iKTsKIAl9CiAKLQlpZiAoKEF1dG9OZWdbYmRdICE9IE9QVElPTl9VTlNFVCkgJiYgKEF1dG9OZWdbYmRdICE9IDB4MjApKSB7CisJaWYgKChudW1fQXV0b05lZyA+IGJkKSAmJiAoQXV0b05lZ1tiZF0gIT0gMHgyMCkpIHsKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywgIkF1dG9OZWcgb3RoZXIgdGhhbiAxMDAwL0Z1bGwgaXMgIgogCQkJCSAibm90IHZhbGlkIGZvciBmaWJlciBhZGFwdGVycywgIgogCQkJCSAicGFyYW1ldGVyIGlnbm9yZWRcbiIpOwpAQCAtNTYwLDcgKzYwOCw2IEBACiB7CiAJaW50IHNwZWVkLCBkcGx4LCBhbjsKIAlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7Ci0JYmQgPSBiZCA+IEUxMDAwX01BWF9OSUMgPyBFMTAwMF9NQVhfTklDIDogYmQ7CiAKIAl7IC8qIFNwZWVkICovCiAJCXN0cnVjdCBlMTAwMF9vcHRfbGlzdCBzcGVlZF9saXN0W10gPSB7eyAgICAgICAgICAwLCAiIiB9LApAQCAtNTc3LDggKzYyNCwxMiBAQAogCQkJCQkgLnAgPSBzcGVlZF9saXN0IH19CiAJCX07CiAKLQkJc3BlZWQgPSBTcGVlZFtiZF07Ci0JCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmc3BlZWQsICZvcHQsIGFkYXB0ZXIpOworCQlpZiAobnVtX1NwZWVkID4gYmQpIHsKKwkJCXNwZWVkID0gU3BlZWRbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZzcGVlZCwgJm9wdCwgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlzcGVlZCA9IG9wdC5kZWY7CisJCX0KIAl9CiAJeyAvKiBEdXBsZXggKi8KIAkJc3RydWN0IGUxMDAwX29wdF9saXN0IGRwbHhfbGlzdFtdID0ge3sgICAgICAgICAgIDAsICIiIH0sCkBAIC02MDAsMTEgKzY1MSwxNSBAQAogCQkJICAgICAgICAiU3BlZWQvRHVwbGV4L0F1dG9OZWcgcGFyYW1ldGVyIGlnbm9yZWQuXG4iKTsKIAkJCXJldHVybjsKIAkJfQotCQlkcGx4ID0gRHVwbGV4W2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZkcGx4LCAmb3B0LCBhZGFwdGVyKTsKKwkJaWYgKG51bV9EdXBsZXggPiBiZCkgeworCQkJZHBseCA9IER1cGxleFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmRwbHgsICZvcHQsIGFkYXB0ZXIpOworCQl9IGVsc2UgeworCQkJZHBseCA9IG9wdC5kZWY7CisJCX0KIAl9CiAKLQlpZiAoQXV0b05lZ1tiZF0gIT0gT1BUSU9OX1VOU0VUICYmIChzcGVlZCAhPSAwIHx8IGRwbHggIT0gMCkpIHsKKwlpZiAoKG51bV9BdXRvTmVnID4gYmQpICYmIChzcGVlZCAhPSAwIHx8IGRwbHggIT0gMCkpIHsKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJICAgICAgICJBdXRvTmVnIHNwZWNpZmllZCBhbG9uZyB3aXRoIFNwZWVkIG9yIER1cGxleCwgIgogCQkgICAgICAgInBhcmFtZXRlciBpZ25vcmVkXG4iKTsKQEAgLTY1MywxNSArNzA4LDE5IEBACiAJCQkJCSAucCA9IGFuX2xpc3QgfX0KIAkJfTsKIAotCQlhbiA9IEF1dG9OZWdbYmRdOwotCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFuLCAmb3B0LCBhZGFwdGVyKTsKKwkJaWYgKG51bV9BdXRvTmVnID4gYmQpIHsKKwkJCWFuID0gQXV0b05lZ1tiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFuLCAmb3B0LCBhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFuID0gb3B0LmRlZjsKKwkJfQogCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBhbjsKIAl9CiAKIAlzd2l0Y2ggKHNwZWVkICsgZHBseCkgewogCWNhc2UgMDoKIAkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOwotCQlpZiAoU3BlZWRbYmRdICE9IE9QVElPTl9VTlNFVCB8fCBEdXBsZXhbYmRdICE9IE9QVElPTl9VTlNFVCkKKwkJaWYgKChudW1fU3BlZWQgPiBiZCkgJiYgKHNwZWVkICE9IDAgfHwgZHBseCAhPSAwKSkKIAkJCURQUklOVEsoUFJPQkUsIElORk8sCiAJCQkgICAgICAgIlNwZWVkIGFuZCBkdXBsZXggYXV0b25lZ290aWF0aW9uIGVuYWJsZWRcbiIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCmluZGV4IGU0NDU5ODguLmEzZDUxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZWVwcm8xMDAuYwpAQCAtMjM4NSw3ICsyMzg1LDcgQEAKICNpZmRlZiBNT0RVTEUKIAlwcmludGsodmVyc2lvbik7CiAjZW5kaWYKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZlZXBybzEwMF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlZXBybzEwMF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWVwcm8xMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwppbmRleCBhNjc2NTBjYy4uMjVjNDYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpAQCAtMTYwNCw3ICsxNjA0LDcgQEAKIAkJdmVyc2lvbiwgdmVyc2lvbjIsIHZlcnNpb24zKTsKICNlbmRpZgogCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJmVwaWNfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXBpY19kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggNTY3ZTI3NC4uYTIxMjFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVhbG54LmMKKysrIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKQEAgLTE5ODQsNyArMTk4NCw3IEBACiAJcHJpbnRrKHZlcnNpb24pOwogI2VuZGlmCiAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZmZWFsbnhfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZmVhbG54X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmZWFsbnhfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCAxMWI4ZjFiLi41OWY5YTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAgKgkwLjU0OiAyMSBNYXIgMjAwNjogRml4IHNwaW4gbG9ja3MgZm9yIG11bHRpIGlycXMgYW5kIGNsZWFudXAuCiAgKgkwLjU1OiAyMiBNYXIgMjAwNjogQWRkIGZsb3cgY29udHJvbCAocGF1c2UgZnJhbWUpLgogICoJMC41NjogMjIgTWFyIDIwMDY6IEFkZGl0aW9uYWwgZXRodG9vbCBjb25maWcgYW5kIG1vZHVsZXBhcmFtIHN1cHBvcnQuCisgKgkwLjU3OiAxNCBNYXkgMjAwNjogTWFjIGFkZHJlc3Mgc2V0IGluIHByb2JlL3JlbW92ZSBhbmQgb3JkZXIgY29ycmVjdGlvbnMuCiAgKgogICogS25vd24gYnVnczoKICAqIFdlIHN1c3BlY3QgdGhhdCBvbiBzb21lIGhhcmR3YXJlIG5vIFRYIGRvbmUgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgpAQCAtMTIwLDcgKzEyMSwxMiBAQAogICogREVWX05FRURfVElNRVJJUlEgd2lsbCBub3QgaGFybSB5b3Ugb24gc2FuZSBoYXJkd2FyZSwgb25seSBnZW5lcmF0aW5nIGEgZmV3CiAgKiBzdXBlcmZsdW91cyB0aW1lciBpbnRlcnJ1cHRzIGZyb20gdGhlIG5pYy4KICAqLwotI2RlZmluZSBGT1JDRURFVEhfVkVSU0lPTgkJIjAuNTYiCisjaWZkZWYgQ09ORklHX0ZPUkNFREVUSF9OQVBJCisjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgorI2Vsc2UKKyNkZWZpbmUgRFJJVkVSTkFQSQorI2VuZGlmCisjZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC41NyIKICNkZWZpbmUgRFJWX05BTUUJCQkiZm9yY2VkZXRoIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yNjIsNyArMjY4LDggQEAKIAlOdlJlZ1JpbmdTaXplcyA9IDB4MTA4LAogI2RlZmluZSBOVlJFR19SSU5HU1pfVFhTSElGVCAwCiAjZGVmaW5lIE5WUkVHX1JJTkdTWl9SWFNISUZUIDE2Ci0JTnZSZWdVbmtub3duVHJhbnNtaXR0ZXJSZWcgPSAweDEwYywKKwlOdlJlZ1RyYW5zbWl0UG9sbCA9IDB4MTBjLAorI2RlZmluZSBOVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWCTB4MDAwMDgwMDAKIAlOdlJlZ0xpbmtTcGVlZCA9IDB4MTEwLAogI2RlZmluZSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgMHgxMDAwMAogI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAJMTAwMApAQCAtMzgxLDIxICszODgsMjEgQEAKIAogLyogQmlnIGVuZGlhbjogc2hvdWxkIHdvcmssIGJ1dCBpcyB1bnRlc3RlZCAqLwogc3RydWN0IHJpbmdfZGVzYyB7Ci0JdTMyIFBhY2tldEJ1ZmZlcjsKLQl1MzIgRmxhZ0xlbjsKKwlfX2xlMzIgYnVmOworCV9fbGUzMiBmbGFnbGVuOwogfTsKIAogc3RydWN0IHJpbmdfZGVzY19leCB7Ci0JdTMyIFBhY2tldEJ1ZmZlckhpZ2g7Ci0JdTMyIFBhY2tldEJ1ZmZlckxvdzsKLQl1MzIgVHhWbGFuOwotCXUzMiBGbGFnTGVuOworCV9fbGUzMiBidWZoaWdoOworCV9fbGUzMiBidWZsb3c7CisJX19sZTMyIHR4dmxhbjsKKwlfX2xlMzIgZmxhZ2xlbjsKIH07CiAKLXR5cGVkZWYgdW5pb24gX3JpbmdfdHlwZSB7Cit1bmlvbiByaW5nX3R5cGUgewogCXN0cnVjdCByaW5nX2Rlc2MqIG9yaWc7CiAJc3RydWN0IHJpbmdfZGVzY19leCogZXg7Ci19IHJpbmdfdHlwZTsKK307CiAKICNkZWZpbmUgRkxBR19NQVNLX1YxIDB4ZmZmZjAwMDAKICNkZWZpbmUgRkxBR19NQVNLX1YyIDB4ZmZmZmMwMDAKQEAgLTUzNiw2ICs1NDMsOSBAQAogI2RlZmluZSBQSFlJRDFfT1VJX1NIRlQJNgogI2RlZmluZSBQSFlJRDJfT1VJX01BU0sJMHhmYzAwCiAjZGVmaW5lIFBIWUlEMl9PVUlfU0hGVAkxMAorI2RlZmluZSBQSFlJRDJfTU9ERUxfTUFTSwkJMHgwM2YwCisjZGVmaW5lIFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2CQkweDIyMAorI2RlZmluZSBQSFlfTUFSVkVMTF9FMzAxNl9JTklUTUFTSwkweDAzMDAKICNkZWZpbmUgUEhZX0lOSVQxCTB4MGYwMDAKICNkZWZpbmUgUEhZX0lOSVQyCTB4MGUwMAogI2RlZmluZSBQSFlfSU5JVDMJMHgwMTAwMApAQCAtNjUzLDggKzY2Myw4IEBACiB9OwogCiBzdHJ1Y3QgcmVnaXN0ZXJfdGVzdCB7Ci0JdTMyIHJlZzsKLQl1MzIgbWFzazsKKwlfX2xlMzIgcmVnOworCV9fbGUzMiBtYXNrOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdpc3Rlcl90ZXN0IG52X3JlZ2lzdGVyc190ZXN0W10gPSB7CkBAIC02OTQsNiArNzA0LDcgQEAKIAlpbnQgcGh5YWRkcjsKIAlpbnQgd29sZW5hYmxlZDsKIAl1bnNpZ25lZCBpbnQgcGh5X291aTsKKwl1bnNpZ25lZCBpbnQgcGh5X21vZGVsOwogCXUxNiBnaWdhYml0OwogCWludCBpbnRyX3Rlc3Q7CiAKQEAgLTcwNywxMyArNzE4LDE0IEBACiAJdTMyIHZsYW5jdGxfYml0czsKIAl1MzIgZHJpdmVyX2RhdGE7CiAJdTMyIHJlZ2lzdGVyX3NpemU7CisJaW50IHJ4X2NzdW07CiAKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAKIAkvKiByeCBzcGVjaWZpYyBmaWVsZHMuCiAJICogTG9ja2luZzogV2l0aGluIGlycSBoYW5kZXIgb3IgZGlzYWJsZV9pcnErc3Bpbl9sb2NrKCZucC0+bG9jayk7CiAJICovCi0JcmluZ190eXBlIHJ4X3Jpbmc7CisJdW5pb24gcmluZ190eXBlIHJ4X3Jpbmc7CiAJdW5zaWduZWQgaW50IGN1cl9yeCwgcmVmaWxsX3J4OwogCXN0cnVjdCBza19idWZmICoqcnhfc2tidWZmOwogCWRtYV9hZGRyX3QgKnJ4X2RtYTsKQEAgLTczMyw3ICs3NDUsNyBAQAogCS8qCiAJICogdHggc3BlY2lmaWMgZmllbGRzLgogCSAqLwotCXJpbmdfdHlwZSB0eF9yaW5nOworCXVuaW9uIHJpbmdfdHlwZSB0eF9yaW5nOwogCXVuc2lnbmVkIGludCBuZXh0X3R4LCBuaWNfdHg7CiAJc3RydWN0IHNrX2J1ZmYgKip0eF9za2J1ZmY7CiAJZG1hX2FkZHJfdCAqdHhfZG1hOwpAQCAtODI2LDEzICs4MzgsMTMgQEAKIAogc3RhdGljIGlubGluZSB1MzIgbnZfZGVzY3JfZ2V0bGVuZ3RoKHN0cnVjdCByaW5nX2Rlc2MgKnByZCwgdTMyIHYpCiB7Ci0JcmV0dXJuIGxlMzJfdG9fY3B1KHByZC0+RmxhZ0xlbikKKwlyZXR1cm4gbGUzMl90b19jcHUocHJkLT5mbGFnbGVuKQogCQkmICgodiA9PSBERVNDX1ZFUl8xKSA/IExFTl9NQVNLX1YxIDogTEVOX01BU0tfVjIpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBudl9kZXNjcl9nZXRsZW5ndGhfZXgoc3RydWN0IHJpbmdfZGVzY19leCAqcHJkLCB1MzIgdikKIHsKLQlyZXR1cm4gbGUzMl90b19jcHUocHJkLT5GbGFnTGVuKSAmIExFTl9NQVNLX1YyOworCXJldHVybiBsZTMyX3RvX2NwdShwcmQtPmZsYWdsZW4pICYgTEVOX01BU0tfVjI7CiB9CiAKIHN0YXRpYyBpbnQgcmVnX2RlbGF5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgdGFyZ2V0LApAQCAtODg1LDcgKzg5Nyw3IEBACiAJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOwogCiAJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCWlmKG5wLT5yeF9yaW5nLm9yaWcpCisJCWlmIChucC0+cnhfcmluZy5vcmlnKQogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChucC0+cGNpX2Rldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpICogKG5wLT5yeF9yaW5nX3NpemUgKyBucC0+dHhfcmluZ19zaXplKSwKIAkJCQkJICAgIG5wLT5yeF9yaW5nLm9yaWcsIG5wLT5yaW5nX2FkZHIpOwogCX0gZWxzZSB7CkBAIC0xMDIwLDE0ICsxMDMyLDEzIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBwaHlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBibWNyX3NldHVwKQogewogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIG1paWNvbnRyb2w7CiAJdW5zaWduZWQgaW50IHRyaWVzID0gMDsKIAotCW1paWNvbnRyb2wgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKLQltaWljb250cm9sIHw9IEJNQ1JfUkVTRVQ7CisJbWlpY29udHJvbCA9IEJNQ1JfUkVTRVQgfCBibWNyX3NldHVwOwogCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIG1paWNvbnRyb2wpKSB7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMDUyLDYgKzEwNjMsMTYgQEAKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCXUzMiBwaHlpbnRlcmZhY2UsIHBoeV9yZXNlcnZlZCwgbWlpX3N0YXR1cywgbWlpX2NvbnRyb2wsIG1paV9jb250cm9sXzEwMDAscmVnOwogCisJLyogcGh5IGVycmF0YSBmb3IgRTMwMTYgcGh5ICovCisJaWYgKG5wLT5waHlfbW9kZWwgPT0gUEhZX01PREVMX01BUlZFTExfRTMwMTYpIHsKKwkJcmVnID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9OQ09ORklHLCBNSUlfUkVBRCk7CisJCXJlZyAmPSB+UEhZX01BUlZFTExfRTMwMTZfSU5JVE1BU0s7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIHJlZykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgd3JpdGUgdG8gZXJyYXRhIHJlZyBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwogCS8qIHNldCBhZHZlcnRpc2UgcmVnaXN0ZXIgKi8KIAlyZWcgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOwogCXJlZyB8PSAoQURWRVJUSVNFXzEwSEFMRnxBRFZFUlRJU0VfMTBGVUxMfEFEVkVSVElTRV8xMDBIQUxGfEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV9QQVVTRV9BU1lNfEFEVkVSVElTRV9QQVVTRV9DQVApOwpAQCAtMTA4Miw4ICsxMTAzLDEzIEBACiAJZWxzZQogCQlucC0+Z2lnYWJpdCA9IDA7CiAKLQkvKiByZXNldCB0aGUgcGh5ICovCi0JaWYgKHBoeV9yZXNldChkZXYpKSB7CisJbWlpX2NvbnRyb2wgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwltaWlfY29udHJvbCB8PSBCTUNSX0FORU5BQkxFOworCisJLyogcmVzZXQgdGhlIHBoeQorCSAqIChjZXJ0YWluIHBoeXMgbmVlZCBibWNyIHRvIGJlIHNldHVwIHdpdGggcmVzZXQpCisJICovCisJaWYgKHBoeV9yZXNldChkZXYsIG1paV9jb250cm9sKSkgewogCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IHJlc2V0IGZhaWxlZFxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKIAkJcmV0dXJuIFBIWV9FUlJPUjsKIAl9CkBAIC0xMTc4LDcgKzEyMDQsNyBAQAogCQkJS0VSTl9JTkZPICJudl9zdG9wX3R4OiBUcmFuc21pdHRlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CiAKIAl1ZGVsYXkoTlZfVFhTVE9QX0RFTEFZMik7Ci0Jd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0UG9sbCkgJiBOVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWLCBiYXNlICsgTnZSZWdUcmFuc21pdFBvbGwpOwogfQogCiBzdGF0aWMgdm9pZCBudl90eHJ4X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMjU4LDE0ICsxMjg0LDE0IEBACiAJCW5wLT5yeF9kbWFbbnJdID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCQkJc2tiLT5lbmQtc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKLQkJCW5wLT5yeF9yaW5nLm9yaWdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbbnJdKTsKKwkJCW5wLT5yeF9yaW5nLm9yaWdbbnJdLmJ1ZiA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbbnJdKTsKIAkJCXdtYigpOwotCQkJbnAtPnJ4X3Jpbmcub3JpZ1tucl0uRmxhZ0xlbiA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBOVl9SWF9BVkFJTCk7CisJCQlucC0+cnhfcmluZy5vcmlnW25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IE5WX1JYX0FWQUlMKTsKIAkJfSBlbHNlIHsKLQkJCW5wLT5yeF9yaW5nLmV4W25yXS5QYWNrZXRCdWZmZXJIaWdoID0gY3B1X3RvX2xlNjQobnAtPnJ4X2RtYVtucl0pID4+IDMyOwotCQkJbnAtPnJ4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckxvdyA9IGNwdV90b19sZTY0KG5wLT5yeF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOworCQkJbnAtPnJ4X3JpbmcuZXhbbnJdLmJ1ZmhpZ2ggPSBjcHVfdG9fbGU2NChucC0+cnhfZG1hW25yXSkgPj4gMzI7CisJCQlucC0+cnhfcmluZy5leFtucl0uYnVmbG93ID0gY3B1X3RvX2xlNjQobnAtPnJ4X2RtYVtucl0pICYgMHgwRkZGRkZGRkY7CiAJCQl3bWIoKTsKLQkJCW5wLT5yeF9yaW5nLmV4W25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IE5WX1JYMl9BVkFJTCk7CisJCQlucC0+cnhfcmluZy5leFtucl0uZmxhZ2xlbiA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBOVl9SWDJfQVZBSUwpOwogCQl9CiAJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X2FsbG9jX3J4OiBQYWNrZXQgJWQgbWFya2VkIGFzIEF2YWlsYWJsZVxuIiwKIAkJCQkJZGV2LT5uYW1lLCByZWZpbGxfcngpOwpAQCAtMTI3Nyw2ICsxMzAzLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIElmIHJ4IGJ1ZnMgYXJlIGV4aGF1c3RlZCBjYWxsZWQgYWZ0ZXIgNTBtcyB0byBhdHRlbXB0IHRvIHJlZnJlc2ggKi8KKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKK3N0YXRpYyB2b2lkIG52X2RvX3J4X3JlZmlsbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCisJLyogSnVzdCByZXNjaGVkdWxlIE5BUEkgcnggcHJvY2Vzc2luZyAqLworCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7Cit9CisjZWxzZQogc3RhdGljIHZvaWQgbnZfZG9fcnhfcmVmaWxsKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CkBAIC0xMzA1LDYgKzEzNDEsNyBAQAogCQllbmFibGVfaXJxKG5wLT5tc2lfeF9lbnRyeVtOVl9NU0lfWF9WRUNUT1JfUlhdLnZlY3Rvcik7CiAJfQogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIG52X2luaXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTEzMTUsOSArMTM1Miw5IEBACiAJbnAtPnJlZmlsbF9yeCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5wLT5yeF9yaW5nX3NpemU7IGkrKykKIAkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKQotCQkJbnAtPnJ4X3Jpbmcub3JpZ1tpXS5GbGFnTGVuID0gMDsKKwkJCW5wLT5yeF9yaW5nLm9yaWdbaV0uZmxhZ2xlbiA9IDA7CiAJICAgICAgICBlbHNlCi0JCQlucC0+cnhfcmluZy5leFtpXS5GbGFnTGVuID0gMDsKKwkJCW5wLT5yeF9yaW5nLmV4W2ldLmZsYWdsZW4gPSAwOwogfQogCiBzdGF0aWMgdm9pZCBudl9pbml0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMzI4LDkgKzEzNjUsOSBAQAogCW5wLT5uZXh0X3R4ID0gbnAtPm5pY190eCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5wLT50eF9yaW5nX3NpemU7IGkrKykgewogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCi0JCQlucC0+dHhfcmluZy5vcmlnW2ldLkZsYWdMZW4gPSAwOworCQkJbnAtPnR4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuID0gMDsKIAkgICAgICAgIGVsc2UKLQkJCW5wLT50eF9yaW5nLmV4W2ldLkZsYWdMZW4gPSAwOworCQkJbnAtPnR4X3JpbmcuZXhbaV0uZmxhZ2xlbiA9IDA7CiAJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOwogCQlucC0+dHhfZG1hW2ldID0gMDsKIAl9CkBAIC0xMzczLDkgKzE0MTAsOSBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5wLT50eF9yaW5nX3NpemU7IGkrKykgewogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCi0JCQlucC0+dHhfcmluZy5vcmlnW2ldLkZsYWdMZW4gPSAwOworCQkJbnAtPnR4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuID0gMDsKIAkJZWxzZQotCQkJbnAtPnR4X3JpbmcuZXhbaV0uRmxhZ0xlbiA9IDA7CisJCQlucC0+dHhfcmluZy5leFtpXS5mbGFnbGVuID0gMDsKIAkJaWYgKG52X3JlbGVhc2VfdHhza2IoZGV2LCBpKSkKIAkJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CiAJfQpAQCAtMTM4Nyw5ICsxNDI0LDkgQEAKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgbnAtPnJ4X3Jpbmdfc2l6ZTsgaSsrKSB7CiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKLQkJCW5wLT5yeF9yaW5nLm9yaWdbaV0uRmxhZ0xlbiA9IDA7CisJCQlucC0+cnhfcmluZy5vcmlnW2ldLmZsYWdsZW4gPSAwOwogCQllbHNlCi0JCQlucC0+cnhfcmluZy5leFtpXS5GbGFnTGVuID0gMDsKKwkJCW5wLT5yeF9yaW5nLmV4W2ldLmZsYWdsZW4gPSAwOwogCQl3bWIoKTsKIAkJaWYgKG5wLT5yeF9za2J1ZmZbaV0pIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbaV0sCkBAIC0xNDUwLDE3ICsxNDg3LDE3IEBACiAJCW5wLT50eF9kbWFfbGVuW25yXSA9IGJjbnQ7CiAKIAkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCQlucC0+dHhfcmluZy5vcmlnW25yXS5QYWNrZXRCdWZmZXIgPSBjcHVfdG9fbGUzMihucC0+dHhfZG1hW25yXSk7Ci0JCQlucC0+dHhfcmluZy5vcmlnW25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CisJCQlucC0+dHhfcmluZy5vcmlnW25yXS5idWYgPSBjcHVfdG9fbGUzMihucC0+dHhfZG1hW25yXSk7CisJCQlucC0+dHhfcmluZy5vcmlnW25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAJCX0gZWxzZSB7Ci0JCQlucC0+dHhfcmluZy5leFtucl0uUGFja2V0QnVmZmVySGlnaCA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSA+PiAzMjsKLQkJCW5wLT50eF9yaW5nLmV4W25yXS5QYWNrZXRCdWZmZXJMb3cgPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgJiAweDBGRkZGRkZGRjsKLQkJCW5wLT50eF9yaW5nLmV4W25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CisJCQlucC0+dHhfcmluZy5leFtucl0uYnVmaGlnaCA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSA+PiAzMjsKKwkJCW5wLT50eF9yaW5nLmV4W25yXS5idWZsb3cgPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgJiAweDBGRkZGRkZGRjsKKwkJCW5wLT50eF9yaW5nLmV4W25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAJCX0KIAkJdHhfZmxhZ3MgPSBucC0+dHhfZmxhZ3M7CiAJCW9mZnNldCArPSBiY250OwogCQlzaXplIC09IGJjbnQ7Ci0JfSB3aGlsZShzaXplKTsKKwl9IHdoaWxlIChzaXplKTsKIAogCS8qIHNldHVwIHRoZSBmcmFnbWVudHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKQEAgLTE0NzcsMTIgKzE1MTQsMTIgQEAKIAkJCW5wLT50eF9kbWFfbGVuW25yXSA9IGJjbnQ7CiAKIAkJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKLQkJCQlucC0+dHhfcmluZy5vcmlnW25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CisJCQkJbnAtPnR4X3Jpbmcub3JpZ1tucl0uYnVmID0gY3B1X3RvX2xlMzIobnAtPnR4X2RtYVtucl0pOworCQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLmZsYWdsZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckhpZ2ggPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgPj4gMzI7Ci0JCQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckxvdyA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOwotCQkJCW5wLT50eF9yaW5nLmV4W25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CisJCQkJbnAtPnR4X3JpbmcuZXhbbnJdLmJ1ZmhpZ2ggPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgPj4gMzI7CisJCQkJbnAtPnR4X3JpbmcuZXhbbnJdLmJ1ZmxvdyA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOworCQkJCW5wLT50eF9yaW5nLmV4W25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAJCQl9CiAJCQlvZmZzZXQgKz0gYmNudDsKIAkJCXNpemUgLT0gYmNudDsKQEAgLTE0OTEsOSArMTUyOCw5IEBACiAKIAkvKiBzZXQgbGFzdCBmcmFnbWVudCBmbGFnICAqLwogCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQlucC0+dHhfcmluZy5vcmlnW25yXS5GbGFnTGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzX2V4dHJhKTsKKwkJbnAtPnR4X3Jpbmcub3JpZ1tucl0uZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFnc19leHRyYSk7CiAJfSBlbHNlIHsKLQkJbnAtPnR4X3JpbmcuZXhbbnJdLkZsYWdMZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3NfZXh0cmEpOworCQlucC0+dHhfcmluZy5leFtucl0uZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFnc19leHRyYSk7CiAJfQogCiAJbnAtPnR4X3NrYnVmZltucl0gPSBza2I7CkBAIC0xNTEyLDEwICsxNTQ5LDEwIEBACiAKIAkvKiBzZXQgdHggZmxhZ3MgKi8KIAlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKLQkJbnAtPnR4X3Jpbmcub3JpZ1tzdGFydF9ucl0uRmxhZ0xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKKwkJbnAtPnR4X3Jpbmcub3JpZ1tzdGFydF9ucl0uZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKIAl9IGVsc2UgewotCQlucC0+dHhfcmluZy5leFtzdGFydF9ucl0uVHhWbGFuID0gY3B1X3RvX2xlMzIodHhfZmxhZ3Nfdmxhbik7Ci0JCW5wLT50eF9yaW5nLmV4W3N0YXJ0X25yXS5GbGFnTGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOworCQlucC0+dHhfcmluZy5leFtzdGFydF9ucl0udHh2bGFuID0gY3B1X3RvX2xlMzIodHhfZmxhZ3Nfdmxhbik7CisJCW5wLT50eF9yaW5nLmV4W3N0YXJ0X25yXS5mbGFnbGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOwogCX0KIAogCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3htaXQ6IHBhY2tldCAlZCAoZW50cmllcyAlZCkgcXVldWVkIGZvciB0cmFuc21pc3Npb24uIHR4X2ZsYWdzX2V4dHJhOiAleFxuIiwKQEAgLTE1NDcsNyArMTU4NCw3IEBACiBzdGF0aWMgdm9pZCBudl90eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgRmxhZ3M7CisJdTMyIGZsYWdzOwogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE1NTUsMjIgKzE1OTIsMjIgQEAKIAkJaSA9IG5wLT5uaWNfdHggJSBucC0+dHhfcmluZ19zaXplOwogCiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKLQkJCUZsYWdzID0gbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpXS5GbGFnTGVuKTsKKwkJCWZsYWdzID0gbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuKTsKIAkJZWxzZQotCQkJRmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpXS5GbGFnTGVuKTsKKwkJCWZsYWdzID0gbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uZmxhZ2xlbik7CiAKLQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdHhfZG9uZTogbG9va2luZyBhdCBwYWNrZXQgJWQsIEZsYWdzIDB4JXguXG4iLAotCQkJCQlkZXYtPm5hbWUsIG5wLT5uaWNfdHgsIEZsYWdzKTsKLQkJaWYgKEZsYWdzICYgTlZfVFhfVkFMSUQpCisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3R4X2RvbmU6IGxvb2tpbmcgYXQgcGFja2V0ICVkLCBmbGFncyAweCV4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+bmljX3R4LCBmbGFncyk7CisJCWlmIChmbGFncyAmIE5WX1RYX1ZBTElEKQogCQkJYnJlYWs7CiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgewotCQkJaWYgKEZsYWdzICYgTlZfVFhfTEFTVFBBQ0tFVCkgeworCQkJaWYgKGZsYWdzICYgTlZfVFhfTEFTVFBBQ0tFVCkgewogCQkJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07Ci0JCQkJaWYgKEZsYWdzICYgKE5WX1RYX1JFVFJZRVJST1J8TlZfVFhfQ0FSUklFUkxPU1R8TlZfVFhfTEFURUNPTExJU0lPTnwKKwkJCQlpZiAoZmxhZ3MgJiAoTlZfVFhfUkVUUllFUlJPUnxOVl9UWF9DQVJSSUVSTE9TVHxOVl9UWF9MQVRFQ09MTElTSU9OfAogCQkJCQkgICAgIE5WX1RYX1VOREVSRkxPV3xOVl9UWF9FUlJPUikpIHsKLQkJCQkJaWYgKEZsYWdzICYgTlZfVFhfVU5ERVJGTE9XKQorCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9VTkRFUkZMT1cpCiAJCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKLQkJCQkJaWYgKEZsYWdzICYgTlZfVFhfQ0FSUklFUkxPU1QpCisJCQkJCWlmIChmbGFncyAmIE5WX1RYX0NBUlJJRVJMT1NUKQogCQkJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQl9IGVsc2UgewpAQCAtMTU3OSwxMyArMTYxNiwxMyBAQAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChGbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CisJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfTEFTVFBBQ0tFVCkgewogCQkJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07Ci0JCQkJaWYgKEZsYWdzICYgKE5WX1RYMl9SRVRSWUVSUk9SfE5WX1RYMl9DQVJSSUVSTE9TVHxOVl9UWDJfTEFURUNPTExJU0lPTnwKKwkJCQlpZiAoZmxhZ3MgJiAoTlZfVFgyX1JFVFJZRVJST1J8TlZfVFgyX0NBUlJJRVJMT1NUfE5WX1RYMl9MQVRFQ09MTElTSU9OfAogCQkJCQkgICAgIE5WX1RYMl9VTkRFUkZMT1d8TlZfVFgyX0VSUk9SKSkgewotCQkJCQlpZiAoRmxhZ3MgJiBOVl9UWDJfVU5ERVJGTE9XKQorCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfVU5ERVJGTE9XKQogCQkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7Ci0JCQkJCWlmIChGbGFncyAmIE5WX1RYMl9DQVJSSUVSTE9TVCkKKwkJCQkJaWYgKGZsYWdzICYgTlZfVFgyX0NBUlJJRVJMT1NUKQogCQkJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQl9IGVsc2UgewpAQCAtMTYzOCwyOSArMTY3NSwyOSBAQAogCQkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJTAzeDogJTA4eCAlMDh4IC8vICUwOHggJTA4eCAvLyAlMDh4ICUwOHggLy8gJTA4eCAlMDh4XG4iLAogCQkJCSAgICAgICBpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2ldLlBhY2tldEJ1ZmZlciksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaV0uRmxhZ0xlbiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsxXS5QYWNrZXRCdWZmZXIpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMV0uRmxhZ0xlbiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsyXS5QYWNrZXRCdWZmZXIpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMl0uRmxhZ0xlbiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSszXS5QYWNrZXRCdWZmZXIpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krM10uRmxhZ0xlbikpOworCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2ldLmJ1ZiksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaV0uZmxhZ2xlbiksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsxXS5idWYpLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMV0uZmxhZ2xlbiksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsyXS5idWYpLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMl0uZmxhZ2xlbiksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSszXS5idWYpLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krM10uZmxhZ2xlbikpOwogCQkJfSBlbHNlIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlMDN4OiAlMDh4ICUwOHggJTA4eCAvLyAlMDh4ICUwOHggJTA4eCAvLyAlMDh4ICUwOHggJTA4eCAvLyAlMDh4ICUwOHggJTA4eFxuIiwKIAkJCQkgICAgICAgaSwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uUGFja2V0QnVmZmVySGlnaCksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2ldLlBhY2tldEJ1ZmZlckxvdyksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2ldLkZsYWdMZW4pLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzFdLlBhY2tldEJ1ZmZlckhpZ2gpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzFdLlBhY2tldEJ1ZmZlckxvdyksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMV0uRmxhZ0xlbiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMl0uUGFja2V0QnVmZmVySGlnaCksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMl0uUGFja2V0QnVmZmVyTG93KSwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsyXS5GbGFnTGVuKSwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSszXS5QYWNrZXRCdWZmZXJIaWdoKSwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSszXS5QYWNrZXRCdWZmZXJMb3cpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzNdLkZsYWdMZW4pKTsKKwkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uYnVmaGlnaCksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2ldLmJ1ZmxvdyksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2ldLmZsYWdsZW4pLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzFdLmJ1ZmhpZ2gpLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzFdLmJ1ZmxvdyksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMV0uZmxhZ2xlbiksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMl0uYnVmaGlnaCksCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMl0uYnVmbG93KSwKKwkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsyXS5mbGFnbGVuKSwKKwkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSszXS5idWZoaWdoKSwKKwkJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSszXS5idWZsb3cpLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzNdLmZsYWdsZW4pKTsKIAkJCX0KIAkJfQogCX0KQEAgLTE2OTcsNyArMTczNCw3IEBACiAJaW50IHByb3RvbGVuOwkvKiBsZW5ndGggYXMgc3RvcmVkIGluIHRoZSBwcm90byBmaWVsZCAqLwogCiAJLyogMSkgY2FsY3VsYXRlIGxlbiBhY2NvcmRpbmcgdG8gaGVhZGVyICovCi0JaWYgKCAoKHN0cnVjdCB2bGFuX2V0aGhkciAqKXBhY2tldCktPmhfdmxhbl9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCWlmICggKChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilwYWNrZXQpLT5oX3ZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCXByb3RvbGVuID0gbnRvaHMoICgoc3RydWN0IHZsYW5fZXRoaGRyICopcGFja2V0KS0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byApOwogCQloZHJsZW4gPSBWTEFOX0hMRU47CiAJfSBlbHNlIHsKQEAgLTE3NDAsMTMgKzE3NzcsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG52X3J4X3Byb2Nlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbnZfcnhfcHJvY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGltaXQpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgRmxhZ3M7CisJdTMyIGZsYWdzOwogCXUzMiB2bGFuZmxhZ3MgPSAwOworCWludCBjb3VudDsKIAotCWZvciAoOzspIHsKKyAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGltaXQ7ICsrY291bnQpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJaW50IGxlbjsKIAkJaW50IGk7CkBAIC0xNzU1LDE4ICsxNzkzLDE4IEBACiAKIAkJaSA9IG5wLT5jdXJfcnggJSBucC0+cnhfcmluZ19zaXplOwogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKLQkJCUZsYWdzID0gbGUzMl90b19jcHUobnAtPnJ4X3Jpbmcub3JpZ1tpXS5GbGFnTGVuKTsKKwkJCWZsYWdzID0gbGUzMl90b19jcHUobnAtPnJ4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuKTsKIAkJCWxlbiA9IG52X2Rlc2NyX2dldGxlbmd0aCgmbnAtPnJ4X3Jpbmcub3JpZ1tpXSwgbnAtPmRlc2NfdmVyKTsKIAkJfSBlbHNlIHsKLQkJCUZsYWdzID0gbGUzMl90b19jcHUobnAtPnJ4X3JpbmcuZXhbaV0uRmxhZ0xlbik7CisJCQlmbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5yeF9yaW5nLmV4W2ldLmZsYWdsZW4pOwogCQkJbGVuID0gbnZfZGVzY3JfZ2V0bGVuZ3RoX2V4KCZucC0+cnhfcmluZy5leFtpXSwgbnAtPmRlc2NfdmVyKTsKLQkJCXZsYW5mbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5yeF9yaW5nLmV4W2ldLlBhY2tldEJ1ZmZlckxvdyk7CisJCQl2bGFuZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZy5leFtpXS5idWZsb3cpOwogCQl9CiAKLQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogbG9va2luZyBhdCBwYWNrZXQgJWQsIEZsYWdzIDB4JXguXG4iLAotCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIEZsYWdzKTsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogbG9va2luZyBhdCBwYWNrZXQgJWQsIGZsYWdzIDB4JXguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIGZsYWdzKTsKIAotCQlpZiAoRmxhZ3MgJiBOVl9SWF9BVkFJTCkKKwkJaWYgKGZsYWdzICYgTlZfUlhfQVZBSUwpCiAJCQlicmVhazsJLyogc3RpbGwgb3duZWQgYnkgaGFyZHdhcmUsICovCiAKIAkJLyoKQEAgLTE3ODAsNyArMTgxOCw3IEBACiAKIAkJewogCQkJaW50IGo7Ci0JCQlkcHJpbnRrKEtFUk5fREVCVUcgIkR1bXBpbmcgcGFja2V0IChmbGFncyAweCV4KS4iLEZsYWdzKTsKKwkJCWRwcmludGsoS0VSTl9ERUJVRyAiRHVtcGluZyBwYWNrZXQgKGZsYWdzIDB4JXgpLiIsZmxhZ3MpOwogCQkJZm9yIChqPTA7IGo8NjQ7IGorKykgewogCQkJCWlmICgoaiUxNikgPT0gMCkKIAkJCQkJZHByaW50aygiXG4lMDN4OiIsIGopOwpAQCAtMTc5MCwzMCArMTgyOCwzMCBAQAogCQl9CiAJCS8qIGxvb2sgYXQgd2hhdCB3ZSBhY3R1YWxseSBnb3Q6ICovCiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgewotCQkJaWYgKCEoRmxhZ3MgJiBOVl9SWF9ERVNDUklQVE9SVkFMSUQpKQorCQkJaWYgKCEoZmxhZ3MgJiBOVl9SWF9ERVNDUklQVE9SVkFMSUQpKQogCQkJCWdvdG8gbmV4dF9wa3Q7CiAKLQkJCWlmIChGbGFncyAmIE5WX1JYX0VSUk9SKSB7Ci0JCQkJaWYgKEZsYWdzICYgTlZfUlhfTUlTU0VERlJBTUUpIHsKKwkJCWlmIChmbGFncyAmIE5WX1JYX0VSUk9SKSB7CisJCQkJaWYgKGZsYWdzICYgTlZfUlhfTUlTU0VERlJBTUUpIHsKIAkJCQkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKIAkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCX0KLQkJCQlpZiAoRmxhZ3MgJiAoTlZfUlhfRVJST1IxfE5WX1JYX0VSUk9SMnxOVl9SWF9FUlJPUjMpKSB7CisJCQkJaWYgKGZsYWdzICYgKE5WX1JYX0VSUk9SMXxOVl9SWF9FUlJPUjJ8TlZfUlhfRVJST1IzKSkgewogCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQkJfQotCQkJCWlmIChGbGFncyAmIE5WX1JYX0NSQ0VSUikgeworCQkJCWlmIChmbGFncyAmIE5WX1JYX0NSQ0VSUikgewogCQkJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQkJfQotCQkJCWlmIChGbGFncyAmIE5WX1JYX09WRVJGTE9XKSB7CisJCQkJaWYgKGZsYWdzICYgTlZfUlhfT1ZFUkZMT1cpIHsKIAkJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQl9Ci0JCQkJaWYgKEZsYWdzICYgTlZfUlhfRVJST1I0KSB7CisJCQkJaWYgKGZsYWdzICYgTlZfUlhfRVJST1I0KSB7CiAJCQkJCWxlbiA9IG52X2dldGxlbihkZXYsIG5wLT5yeF9za2J1ZmZbaV0tPmRhdGEsIGxlbik7CiAJCQkJCWlmIChsZW4gPCAwKSB7CiAJCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC0xODIxLDMyICsxODU5LDMyIEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJLyogZnJhbWluZyBlcnJvcnMgYXJlIHNvZnQgZXJyb3JzLiAqLwotCQkJCWlmIChGbGFncyAmIE5WX1JYX0ZSQU1JTkdFUlIpIHsKLQkJCQkJaWYgKEZsYWdzICYgTlZfUlhfU1VCU1RSQUNUMSkgeworCQkJCWlmIChmbGFncyAmIE5WX1JYX0ZSQU1JTkdFUlIpIHsKKwkJCQkJaWYgKGZsYWdzICYgTlZfUlhfU1VCU1RSQUNUMSkgewogCQkJCQkJbGVuLS07CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIShGbGFncyAmIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQpKQorCQkJaWYgKCEoZmxhZ3MgJiBOVl9SWDJfREVTQ1JJUFRPUlZBTElEKSkKIAkJCQlnb3RvIG5leHRfcGt0OwogCi0JCQlpZiAoRmxhZ3MgJiBOVl9SWDJfRVJST1IpIHsKLQkJCQlpZiAoRmxhZ3MgJiAoTlZfUlgyX0VSUk9SMXxOVl9SWDJfRVJST1IyfE5WX1JYMl9FUlJPUjMpKSB7CisJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfRVJST1IpIHsKKwkJCQlpZiAoZmxhZ3MgJiAoTlZfUlgyX0VSUk9SMXxOVl9SWDJfRVJST1IyfE5WX1JYMl9FUlJPUjMpKSB7CiAJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQl9Ci0JCQkJaWYgKEZsYWdzICYgTlZfUlgyX0NSQ0VSUikgeworCQkJCWlmIChmbGFncyAmIE5WX1JYMl9DUkNFUlIpIHsKIAkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCX0KLQkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfT1ZFUkZMT1cpIHsKKwkJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfT1ZFUkZMT1cpIHsKIAkJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQl9Ci0JCQkJaWYgKEZsYWdzICYgTlZfUlgyX0VSUk9SNCkgeworCQkJCWlmIChmbGFncyAmIE5WX1JYMl9FUlJPUjQpIHsKIAkJCQkJbGVuID0gbnZfZ2V0bGVuKGRldiwgbnAtPnJ4X3NrYnVmZltpXS0+ZGF0YSwgbGVuKTsKIAkJCQkJaWYgKGxlbiA8IDApIHsKIAkJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTE4NTQsMTcgKzE4OTIsMTcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMgKi8KLQkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfRlJBTUlOR0VSUikgewotCQkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfU1VCU1RSQUNUMSkgeworCQkJCWlmIChmbGFncyAmIE5WX1JYMl9GUkFNSU5HRVJSKSB7CisJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9TVUJTVFJBQ1QxKSB7CiAJCQkJCQlsZW4tLTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWlmIChucC0+dHhyeGN0bF9iaXRzICYgTlZSRUdfVFhSWENUTF9SWENIRUNLKSB7Ci0JCQkJRmxhZ3MgJj0gTlZfUlgyX0NIRUNLU1VNTUFTSzsKLQkJCQlpZiAoRmxhZ3MgPT0gTlZfUlgyX0NIRUNLU1VNT0sxIHx8Ci0JCQkJICAgIEZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMiB8fAotCQkJCSAgICBGbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzMpIHsKKwkJCWlmIChucC0+cnhfY3N1bSkgeworCQkJCWZsYWdzICY9IE5WX1JYMl9DSEVDS1NVTU1BU0s7CisJCQkJaWYgKGZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMSB8fAorCQkJCSAgICBmbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzIgfHwKKwkJCQkgICAgZmxhZ3MgPT0gTlZfUlgyX0NIRUNLU1VNT0szKSB7CiAJCQkJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGh3IGNoZWNrc3VtIGhpdCEuXG4iLCBkZXYtPm5hbWUpOwogCQkJCQlucC0+cnhfc2tidWZmW2ldLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCQl9IGVsc2UgewpAQCAtMTg4MCwxNyArMTkxOCwyNyBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9yeF9wcm9jZXNzOiBwYWNrZXQgJWQgd2l0aCAlZCBieXRlcywgcHJvdG8gJWQgYWNjZXB0ZWQuXG4iLAogCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIGxlbiwgc2tiLT5wcm90b2NvbCk7Ci0JCWlmIChucC0+dmxhbmdycCAmJiAodmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX1BSRVNFTlQpKSB7Ci0JCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBucC0+dmxhbmdycCwgdmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX01BU0spOwotCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQorCQlpZiAobnAtPnZsYW5ncnAgJiYgKHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19QUkVTRU5UKSkKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIG5wLT52bGFuZ3JwLAorCQkJCQkJIHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19NQVNLKTsKKwkJZWxzZQorCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyNlbHNlCisJCWlmIChucC0+dmxhbmdycCAmJiAodmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX1BSRVNFTlQpKQorCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgbnAtPnZsYW5ncnAsCisJCQkJCXZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19NQVNLKTsKKwkJZWxzZQogCQkJbmV0aWZfcngoc2tiKTsKLQkJfQorI2VuZGlmCiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiBuZXh0X3BrdDoKIAkJbnAtPmN1cl9yeCsrOwogCX0KKworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2J1ZnNpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE5OTAsNyArMjAzOCw3IEBACiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKm1hY2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKilhZGRyOwogCi0JaWYoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjYWRkci0+c2FfZGF0YSkpCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1hY2FkZHItPnNhX2RhdGEpKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAKIAkvKiBzeW5jaHJvbml6ZWQgYWdhaW5zdCBvcGVuIDogcnRubF9sb2NrKCkgaGVsZCBieSBjYWxsZXIgKi8KQEAgLTIwMzIsNyArMjA4MCw2IEBACiAJbWVtc2V0KG1hc2ssIDAsIHNpemVvZihtYXNrKSk7CiAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CiAJCXBmZiB8PSBOVlJFR19QRkZfUFJPTUlTQzsKIAl9IGVsc2UgewogCQlwZmYgfD0gTlZSRUdfUEZGX01ZQUREUjsKQEAgLTIyODMsMjAgKzIzMzAsMjAgQEAKIAkJCWxwYV9wYXVzZSA9IGxwYSAmIChMUEFfUEFVU0VfQ0FQfCBMUEFfUEFVU0VfQVNZTSk7CiAKIAkJCXN3aXRjaCAoYWR2X3BhdXNlKSB7Ci0JCQljYXNlIChBRFZFUlRJU0VfUEFVU0VfQ0FQKToKKwkJCWNhc2UgQURWRVJUSVNFX1BBVVNFX0NBUDoKIAkJCQlpZiAobHBhX3BhdXNlICYgTFBBX1BBVVNFX0NBUCkgewogCQkJCQlwYXVzZV9mbGFncyB8PSBOVl9QQVVTRUZSQU1FX1JYX0VOQUJMRTsKIAkJCQkJaWYgKG5wLT5wYXVzZV9mbGFncyAmIE5WX1BBVVNFRlJBTUVfVFhfUkVRKQogCQkJCQkJcGF1c2VfZmxhZ3MgfD0gTlZfUEFVU0VGUkFNRV9UWF9FTkFCTEU7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSAoQURWRVJUSVNFX1BBVVNFX0FTWU0pOgorCQkJY2FzZSBBRFZFUlRJU0VfUEFVU0VfQVNZTToKIAkJCQlpZiAobHBhX3BhdXNlID09IChMUEFfUEFVU0VfQ0FQfCBMUEFfUEFVU0VfQVNZTSkpCiAJCQkJewogCQkJCQlwYXVzZV9mbGFncyB8PSBOVl9QQVVTRUZSQU1FX1RYX0VOQUJMRTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIChBRFZFUlRJU0VfUEFVU0VfQ0FQfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSk6CisJCQljYXNlIEFEVkVSVElTRV9QQVVTRV9DQVB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOgogCQkJCWlmIChscGFfcGF1c2UgJiBMUEFfUEFVU0VfQ0FQKQogCQkJCXsKIAkJCQkJcGF1c2VfZmxhZ3MgfD0gIE5WX1BBVVNFRlJBTUVfUlhfRU5BQkxFOwpAQCAtMjM3NiwxNCArMjQyMyw2IEBACiAJCW52X3R4X2RvbmUoZGV2KTsKIAkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKIAotCQludl9yeF9wcm9jZXNzKGRldik7Ci0JCWlmIChudl9hbGxvY19yeChkZXYpKSB7Ci0JCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKLQkJCWlmICghbnAtPmluX3NodXRkb3duKQotCQkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7Ci0JCQlzcGluX3VubG9jaygmbnAtPmxvY2spOwotCQl9Ci0KIAkJaWYgKGV2ZW50cyAmIE5WUkVHX0lSUV9MSU5LKSB7CiAJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKIAkJCW52X2xpbmtfaXJxKGRldik7CkBAIC0yNDAzLDYgKzI0NDIsMjkgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKIAkJfQorI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQorCQlpZiAoZXZlbnRzICYgTlZSRUdfSVJRX1JYX0FMTCkgeworCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKworCQkJLyogRGlzYWJsZSBmdXJ0aHVyIHJlY2VpdmUgaXJxJ3MgKi8KKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbnAtPmlycW1hc2sgJj0gfk5WUkVHX0lSUV9SWF9BTEw7CisKKwkJCWlmIChucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkKKwkJCQl3cml0ZWwoTlZSRUdfSVJRX1JYX0FMTCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQllbHNlCisJCQkJd3JpdGVsKG5wLT5pcnFtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKyNlbHNlCisJCW52X3J4X3Byb2Nlc3MoZGV2LCBkZXYtPndlaWdodCk7CisJCWlmIChudl9hbGxvY19yeChkZXYpKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCWlmICghbnAtPmluX3NodXRkb3duKQorCQkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisjZW5kaWYKIAkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKIAkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KQEAgLTI0NzQsNiArMjUzNiw2MyBAQAogCXJldHVybiBJUlFfUkVUVkFMKGkpOwogfQogCisjaWZkZWYgQ09ORklHX0ZPUkNFREVUSF9OQVBJCitzdGF0aWMgaW50IG52X25hcGlfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlpbnQgcGt0cywgbGltaXQgPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJcGt0cyA9IG52X3J4X3Byb2Nlc3MoZGV2LCBsaW1pdCk7CisKKwlpZiAobnZfYWxsb2NfcngoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWlmICghbnAtPmluX3NodXRkb3duKQorCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJfQorCisJaWYgKHBrdHMgPCBsaW1pdCkgeworCQkvKiBhbGwgZG9uZSwgbm8gbW9yZSBwYWNrZXRzIHByZXNlbnQgKi8KKwkJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKworCQkvKiByZS1lbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJbnAtPmlycW1hc2sgfD0gTlZSRUdfSVJRX1JYX0FMTDsKKwkJaWYgKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9FTkFCTEVEKQorCQkJd3JpdGVsKE5WUkVHX0lSUV9SWF9BTEwsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQllbHNlCisJCQl3cml0ZWwobnAtPmlycW1hc2ssIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogdXNlZCB1cCBvdXIgcXVhbnR1bSwgc28gcmVzY2hlZHVsZSAqLworCQlkZXYtPnF1b3RhIC09IHBrdHM7CisJCSpidWRnZXQgLT0gcGt0czsKKwkJcmV0dXJuIDE7CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9uaWNfaXJxX3J4KGludCBmb28sIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCXUzMiBldmVudHM7CisKKwlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUV9SWF9BTEw7CisJd3JpdGVsKE5WUkVHX0lSUV9SWF9BTEwsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCisJaWYgKGV2ZW50cykgeworCQluZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQkvKiBkaXNhYmxlIHJlY2VpdmUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCisJCXdyaXRlbChOVlJFR19JUlFfUlhfQUxMLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJcGNpX3B1c2goYmFzZSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbHNlCiBzdGF0aWMgaXJxcmV0dXJuX3QgbnZfbmljX2lycV9yeChpbnQgZm9vLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CkBAIC0yNDkyLDcgKzI2MTEsNyBAQAogCQlpZiAoIShldmVudHMgJiBucC0+aXJxbWFzaykpCiAJCQlicmVhazsKIAotCQludl9yeF9wcm9jZXNzKGRldik7CisJCW52X3J4X3Byb2Nlc3MoZGV2LCBkZXYtPndlaWdodCk7CiAJCWlmIChudl9hbGxvY19yeChkZXYpKSB7CiAJCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CiAJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKQEAgLTI1MTQsMTIgKzI2MzMsMTIgQEAKIAkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOwogCQkJYnJlYWs7CiAJCX0KLQogCX0KIAlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9uaWNfaXJxX3J4IGNvbXBsZXRlZFxuIiwgZGV2LT5uYW1lKTsKIAogCXJldHVybiBJUlFfUkVUVkFMKGkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9uaWNfaXJxX290aGVyKGludCBmb28sIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMzA1Nyw5ICszMTc2LDE4IEBACiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duLlxuIiwgZGV2LT5uYW1lKTsKIAkJYm1jciA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgTUlJX1JFQUQpOwotCQlibWNyIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOwotCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOwotCisJCWlmIChucC0+cGh5X21vZGVsID09IFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2KSB7CisJCQlibWNyIHw9IEJNQ1JfQU5FTkFCTEU7CisJCQkvKiByZXNldCB0aGUgcGh5IGluIG9yZGVyIGZvciBzZXR0aW5ncyB0byBzdGljaywKKwkJCSAqIGFuZCBjYXVzZSBhdXRvbmVnIHRvIHN0YXJ0ICovCisJCQlpZiAocGh5X3Jlc2V0KGRldiwgYm1jcikpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IHJlc2V0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCQl9CiAJfSBlbHNlIHsKIAkJaW50IGFkdiwgYm1jcjsKIApAQCAtMzA5OSwxNyArMzIyNywxOSBAQAogCQkJYm1jciB8PSBCTUNSX0ZVTExEUExYOwogCQlpZiAobnAtPmZpeGVkX21vZGUgJiAoQURWRVJUSVNFXzEwMEhBTEZ8QURWRVJUSVNFXzEwMEZVTEwpKQogCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOwotCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOwogCQlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9NQVJWRUxMKSB7Ci0JCQkvKiByZXNldCB0aGUgcGh5ICovCi0JCQlpZiAocGh5X3Jlc2V0KGRldikpIHsKKwkJCS8qIHJlc2V0IHRoZSBwaHkgaW4gb3JkZXIgZm9yIGZvcmNlZCBtb2RlIHNldHRpbmdzIHRvIHN0aWNrICovCisJCQlpZiAocGh5X3Jlc2V0KGRldiwgYm1jcikpIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IHJlc2V0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJfSBlbHNlIGlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJCS8qIFdhaXQgYSBiaXQgYW5kIHRoZW4gcmVjb25maWd1cmUgdGhlIG5pYy4gKi8KLQkJCXVkZWxheSgxMCk7Ci0JCQludl9saW5rY2hhbmdlKGRldik7CisJCX0gZWxzZSB7CisJCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJCS8qIFdhaXQgYSBiaXQgYW5kIHRoZW4gcmVjb25maWd1cmUgdGhlIG5pYy4gKi8KKwkJCQl1ZGVsYXkoMTApOworCQkJCW52X2xpbmtjaGFuZ2UoZGV2KTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzE2Niw4ICszMjk2LDE3IEBACiAJCX0KIAogCQlibWNyID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7Ci0JCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7Ci0JCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgYm1jcik7CisJCWlmIChucC0+cGh5X21vZGVsID09IFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2KSB7CisJCQlibWNyIHw9IEJNQ1JfQU5FTkFCTEU7CisJCQkvKiByZXNldCB0aGUgcGh5IGluIG9yZGVyIGZvciBzZXR0aW5ncyB0byBzdGljayovCisJCQlpZiAocGh5X3Jlc2V0KGRldiwgYm1jcikpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IHJlc2V0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCQl9CiAKIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQkJbnZfc3RhcnRfcngoZGV2KTsKQEAgLTMyNDUsNyArMzM4NCw3IEBACiAJaWYgKCFyeHR4X3JpbmcgfHwgIXJ4X3NrYnVmZiB8fCAhcnhfZG1hIHx8ICF0eF9za2J1ZmYgfHwgIXR4X2RtYSB8fCAhdHhfZG1hX2xlbikgewogCQkvKiBmYWxsIGJhY2sgdG8gb2xkIHJpbmdzICovCiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQkJaWYocnh0eF9yaW5nKQorCQkJaWYgKHJ4dHhfcmluZykKIAkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5wLT5wY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykgKiAocmluZy0+cnhfcGVuZGluZyArIHJpbmctPnR4X3BlbmRpbmcpLAogCQkJCQkJICAgIHJ4dHhfcmluZywgcmluZ19hZGRyKTsKIAkJfSBlbHNlIHsKQEAgLTM0MTgsNyArMzU1Nyw3IEBACiBzdGF0aWMgdTMyIG52X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gKG5wLT50eHJ4Y3RsX2JpdHMgJiBOVlJFR19UWFJYQ1RMX1JYQ0hFQ0spICE9IDA7CisJcmV0dXJuIChucC0+cnhfY3N1bSkgIT0gMDsKIH0KIAogc3RhdGljIGludCBudl9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKQEAgLTM0MjgsMjIgKzM1NjcsMTUgQEAKIAlpbnQgcmV0Y29kZSA9IDA7CiAKIAlpZiAobnAtPmRyaXZlcl9kYXRhICYgREVWX0hBU19DSEVDS1NVTSkgewotCi0JCWlmICgoKG5wLT50eHJ4Y3RsX2JpdHMgJiBOVlJFR19UWFJYQ1RMX1JYQ0hFQ0spICYmIGRhdGEpIHx8Ci0JCSAgICAoIShucC0+dHhyeGN0bF9iaXRzICYgTlZSRUdfVFhSWENUTF9SWENIRUNLKSAmJiAhZGF0YSkpIHsKLQkJCS8qIGFscmVhZHkgc2V0IG9yIHVuc2V0ICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCiAJCWlmIChkYXRhKSB7CisJCQlucC0+cnhfY3N1bSA9IDE7CiAJCQlucC0+dHhyeGN0bF9iaXRzIHw9IE5WUkVHX1RYUlhDVExfUlhDSEVDSzsKLQkJfSBlbHNlIGlmICghKG5wLT52bGFuY3RsX2JpdHMgJiBOVlJFR19WTEFOQ09OVFJPTF9FTkFCTEUpKSB7Ci0JCQlucC0+dHhyeGN0bF9iaXRzICY9IH5OVlJFR19UWFJYQ1RMX1JYQ0hFQ0s7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJDYW4gbm90IGRpc2FibGUgcnggY2hlY2tzdW0gaWYgdmxhbiBpcyBlbmFibGVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJbnAtPnJ4X2NzdW0gPSAwOworCQkJLyogdmxhbiBpcyBkZXBlbmRlbnQgb24gcnggY2hlY2tzdW0gb2ZmbG9hZCAqLworCQkJaWYgKCEobnAtPnZsYW5jdGxfYml0cyAmIE5WUkVHX1ZMQU5DT05UUk9MX0VOQUJMRSkpCisJCQkJbnAtPnR4cnhjdGxfYml0cyAmPSB+TlZSRUdfVFhSWENUTF9SWENIRUNLOwogCQl9Ci0KIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwogCQkJd3JpdGVsKG5wLT50eHJ4Y3RsX2JpdHMsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKQEAgLTM0ODEsNyArMzYxMyw3IEBACiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChucC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1NUQVRJU1RJQ1MpCi0JCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBudl9ldGh0b29sX3N0YXRzKS9zaXplb2YodTY0KSk7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IG52X2V0aHRvb2xfc3RhdHMpL3NpemVvZih1NjQpOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC0zNjE5LDcgKzM3NTEsNyBAQAogCXN0cnVjdCBza19idWZmICp0eF9za2IsICpyeF9za2I7CiAJZG1hX2FkZHJfdCB0ZXN0X2RtYV9hZGRyOwogCXUzMiB0eF9mbGFnc19leHRyYSA9IChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSA/IE5WX1RYX0xBU1RQQUNLRVQgOiBOVl9UWDJfTEFTVFBBQ0tFVCk7Ci0JdTMyIEZsYWdzOworCXUzMiBmbGFnczsKIAlpbnQgbGVuLCBpLCBwa3RfbGVuOwogCXU4ICpwa3RfZGF0YTsKIAl1MzIgZmlsdGVyX2ZsYWdzID0gMDsKQEAgLTM2NjMsMTIgKzM3OTUsMTIgQEAKIAkJCQkgICAgICAgdHhfc2tiLT5lbmQtdHhfc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCW5wLT50eF9yaW5nLm9yaWdbMF0uUGFja2V0QnVmZmVyID0gY3B1X3RvX2xlMzIodGVzdF9kbWFfYWRkcik7Ci0JCW5wLT50eF9yaW5nLm9yaWdbMF0uRmxhZ0xlbiA9IGNwdV90b19sZTMyKChwa3RfbGVuLTEpIHwgbnAtPnR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOworCQlucC0+dHhfcmluZy5vcmlnWzBdLmJ1ZiA9IGNwdV90b19sZTMyKHRlc3RfZG1hX2FkZHIpOworCQlucC0+dHhfcmluZy5vcmlnWzBdLmZsYWdsZW4gPSBjcHVfdG9fbGUzMigocGt0X2xlbi0xKSB8IG5wLT50eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKIAl9IGVsc2UgewotCQlucC0+dHhfcmluZy5leFswXS5QYWNrZXRCdWZmZXJIaWdoID0gY3B1X3RvX2xlNjQodGVzdF9kbWFfYWRkcikgPj4gMzI7Ci0JCW5wLT50eF9yaW5nLmV4WzBdLlBhY2tldEJ1ZmZlckxvdyA9IGNwdV90b19sZTY0KHRlc3RfZG1hX2FkZHIpICYgMHgwRkZGRkZGRkY7Ci0JCW5wLT50eF9yaW5nLmV4WzBdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMigocGt0X2xlbi0xKSB8IG5wLT50eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKKwkJbnAtPnR4X3JpbmcuZXhbMF0uYnVmaGlnaCA9IGNwdV90b19sZTY0KHRlc3RfZG1hX2FkZHIpID4+IDMyOworCQlucC0+dHhfcmluZy5leFswXS5idWZsb3cgPSBjcHVfdG9fbGU2NCh0ZXN0X2RtYV9hZGRyKSAmIDB4MEZGRkZGRkZGOworCQlucC0+dHhfcmluZy5leFswXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKHBrdF9sZW4tMSkgfCBucC0+dHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CiAJfQogCXdyaXRlbChOVlJFR19UWFJYQ1RMX0tJQ0t8bnAtPnR4cnhjdGxfYml0cywgZ2V0X2h3YmFzZShkZXYpICsgTnZSZWdUeFJ4Q29udHJvbCk7CiAJcGNpX3B1c2goZ2V0X2h3YmFzZShkZXYpKTsKQEAgLTM2NzcsMjEgKzM4MDksMjEgQEAKIAogCS8qIGNoZWNrIGZvciByeCBvZiB0aGUgcGFja2V0ICovCiAJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCUZsYWdzID0gbGUzMl90b19jcHUobnAtPnJ4X3Jpbmcub3JpZ1swXS5GbGFnTGVuKTsKKwkJZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZy5vcmlnWzBdLmZsYWdsZW4pOwogCQlsZW4gPSBudl9kZXNjcl9nZXRsZW5ndGgoJm5wLT5yeF9yaW5nLm9yaWdbMF0sIG5wLT5kZXNjX3Zlcik7CiAKIAl9IGVsc2UgewotCQlGbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5yeF9yaW5nLmV4WzBdLkZsYWdMZW4pOworCQlmbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5yeF9yaW5nLmV4WzBdLmZsYWdsZW4pOwogCQlsZW4gPSBudl9kZXNjcl9nZXRsZW5ndGhfZXgoJm5wLT5yeF9yaW5nLmV4WzBdLCBucC0+ZGVzY192ZXIpOwogCX0KIAotCWlmIChGbGFncyAmIE5WX1JYX0FWQUlMKSB7CisJaWYgKGZsYWdzICYgTlZfUlhfQVZBSUwpIHsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKSB7Ci0JCWlmIChGbGFncyAmIE5WX1JYX0VSUk9SKQorCQlpZiAoZmxhZ3MgJiBOVl9SWF9FUlJPUikKIAkJCXJldCA9IDA7CiAJfSBlbHNlIHsKLQkJaWYgKEZsYWdzICYgTlZfUlgyX0VSUk9SKSB7CisJCWlmIChmbGFncyAmIE5WX1JYMl9FUlJPUikgewogCQkJcmV0ID0gMDsKIAkJfQogCX0KQEAgLTM3NTMsNiArMzg4NSw3IEBACiAJaWYgKHRlc3QtPmZsYWdzICYgRVRIX1RFU1RfRkxfT0ZGTElORSkgewogCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKIAkJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKIAkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKIAkJCW52X2Rpc2FibGVfaHdfaW50ZXJydXB0cyhkZXYsIG5wLT5pcnFtYXNrKTsKQEAgLTM4MTEsNiArMzk0NCw3IEBACiAJCQludl9zdGFydF9yeChkZXYpOwogCQkJbnZfc3RhcnRfdHgoZGV2KTsKIAkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQluZXRpZl9wb2xsX2VuYWJsZShkZXYpOwogCQkJbnZfZW5hYmxlX2h3X2ludGVycnVwdHMoZGV2LCBucC0+aXJxbWFzayk7CiAJCX0KIAl9CkBAIC0zODk1LDEwICs0MDI5LDkgQEAKIAogCWRwcmludGsoS0VSTl9ERUJVRyAibnZfb3BlbjogYmVnaW5cbiIpOwogCi0JLyogMSkgZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbiAqLworCS8qIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24gKi8KIAlpZiAobnAtPmRyaXZlcl9kYXRhICYgREVWX0hBU19QT1dFUl9DTlRSTCkKIAkJbnZfbWFjX3Jlc2V0KGRldik7Ci0JLyogNC4xLTE6IHN0b3AgYWRhcHRlcjogaWdub3JlZCwgNC4zIHNlZW1zIHRvIGJlIG92ZXJraWxsICovCiAJd3JpdGVsKE5WUkVHX01DQVNUQUREUkFfRk9SQ0UsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJBKTsKIAl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckIpOwogCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQSk7CkBAIC0zOTEzLDI2ICs0MDQ2LDIyIEBACiAJaWYgKG5wLT5wYXVzZV9mbGFncyAmIE5WX1BBVVNFRlJBTUVfVFhfQ0FQQUJMRSkKIAkJd3JpdGVsKE5WUkVHX1RYX1BBVVNFRlJBTUVfRElTQUJMRSwgIGJhc2UgKyBOdlJlZ1R4UGF1c2VGcmFtZSk7CiAKLQkvKiAyKSBpbml0aWFsaXplIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwkvKiBpbml0aWFsaXplIGRlc2NyaXB0b3IgcmluZ3MgKi8KIAlzZXRfYnVmc2l6ZShkZXYpOwogCW9vbSA9IG52X2luaXRfcmluZyhkZXYpOwogCiAJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7Ci0Jd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0UG9sbCkgJiBOVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWLCBiYXNlICsgTnZSZWdUcmFuc21pdFBvbGwpOwogCW52X3R4cnhfcmVzZXQoZGV2KTsKIAl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNik7CiAKIAlucC0+aW5fc2h1dGRvd24gPSAwOwogCi0JLyogMykgc2V0IG1hYyBhZGRyZXNzICovCi0JbnZfY29weV9tYWNfdG9faHcoZGV2KTsKLQotCS8qIDQpIGdpdmUgaHcgcmluZ3MgKi8KKwkvKiBnaXZlIGh3IHJpbmdzICovCiAJc2V0dXBfaHdfcmluZ3MoZGV2LCBOVl9TRVRVUF9SWF9SSU5HIHwgTlZfU0VUVVBfVFhfUklORyk7CiAJd3JpdGVsKCAoKG5wLT5yeF9yaW5nX3NpemUtMSkgPDwgTlZSRUdfUklOR1NaX1JYU0hJRlQpICsgKChucC0+dHhfcmluZ19zaXplLTEpIDw8IE5WUkVHX1JJTkdTWl9UWFNISUZUKSwKIAkJYmFzZSArIE52UmVnUmluZ1NpemVzKTsKIAotCS8qIDUpIGNvbnRpbnVlIHNldHVwICovCiAJd3JpdGVsKG5wLT5saW5rc3BlZWQsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7CiAJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKQogCQl3cml0ZWwoTlZSRUdfVFhfV01fREVTQzFfREVGQVVMVCwgYmFzZSArIE52UmVnVHhXYXRlcm1hcmspOwpAQCAtMzk1MCw3ICs0MDc5LDYgQEAKIAl3cml0ZWwoTlZSRUdfSVJRU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOwogCXdyaXRlbChOVlJFR19NSUlTVEFUX01BU0syLCBiYXNlICsgTnZSZWdNSUlTdGF0dXMpOwogCi0JLyogNikgY29udGludWUgc2V0dXAgKi8KIAl3cml0ZWwoTlZSRUdfTUlTQzFfRk9SQ0UgfCBOVlJFR19NSVNDMV9IRCwgYmFzZSArIE52UmVnTWlzYzEpOwogCXdyaXRlbChyZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlclN0YXR1cyksIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzKTsKIAl3cml0ZWwoTlZSRUdfUEZGX0FMV0FZUywgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOwpAQCAtNDAyMCw2ICs0MTQ4LDggQEAKIAludl9zdGFydF9yeChkZXYpOwogCW52X3N0YXJ0X3R4KGRldik7CiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwluZXRpZl9wb2xsX2VuYWJsZShkZXYpOworCiAJaWYgKHJldCkgewogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJfSBlbHNlIHsKQEAgLTQwNDksNiArNDE3OSw3IEBACiAJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwogCW5wLT5pbl9zaHV0ZG93biA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CiAJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKIAogCWRlbF90aW1lcl9zeW5jKCZucC0+b29tX2tpY2spOwpAQCAtNDA3NiwxMiArNDIwNyw2IEBACiAJaWYgKG5wLT53b2xlbmFibGVkKQogCQludl9zdGFydF9yeChkZXYpOwogCi0JLyogc3BlY2lhbCBvcDogd3JpdGUgYmFjayB0aGUgbWlzb3JkZXJlZCBNQUMgYWRkcmVzcyAtIG90aGVyd2lzZQotCSAqIHRoZSBuZXh0IG52X3Byb2JlIHdvdWxkIHNlZSBhIHdyb25nIGFkZHJlc3MuCi0JICovCi0Jd3JpdGVsKG5wLT5vcmlnX21hY1swXSwgYmFzZSArIE52UmVnTWFjQWRkckEpOwotCXdyaXRlbChucC0+b3JpZ19tYWNbMV0sIGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKLQogCS8qIEZJWE1FOiBwb3dlciBkb3duIG5pYyAqLwogCiAJcmV0dXJuIDA7CkBAIC00MDk0LDcgKzQyMTksNyBAQAogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1OCBfX2lvbWVtICpiYXNlOwogCWludCBlcnIsIGk7Ci0JdTMyIHBvd2Vyc3RhdGU7CisJdTMyIHBvd2Vyc3RhdGUsIHR4cmVnOwogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBmZV9wcml2KSk7CiAJZXJyID0gLUVOT01FTTsKQEAgLTQxOTAsNiArNDMxNSw3IEBACiAJCW5wLT5wa3RfbGltaXQgPSBOVl9QS1RMSU1JVF8yOwogCiAJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfQ0hFQ0tTVU0pIHsKKwkJbnAtPnJ4X2NzdW0gPSAxOwogCQlucC0+dHhyeGN0bF9iaXRzIHw9IE5WUkVHX1RYUlhDVExfUlhDSEVDSzsKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1NHOwogI2lmZGVmIE5FVElGX0ZfVFNPCkBAIC00MjcwLDYgKzQzOTYsMTAgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCWRldi0+cG9sbF9jb250cm9sbGVyID0gbnZfcG9sbF9jb250cm9sbGVyOwogI2VuZGlmCisJZGV2LT53ZWlnaHQgPSA2NDsKKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKKwlkZXYtPnBvbGwgPSBudl9uYXBpX3BvbGw7CisjZW5kaWYKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKIAlkZXYtPnR4X3RpbWVvdXQgPSBudl90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBOVl9XQVRDSERPR19USU1FTzsKQEAgLTQyODEsMTIgKzQ0MTEsMzAgQEAKIAlucC0+b3JpZ19tYWNbMF0gPSByZWFkbChiYXNlICsgTnZSZWdNYWNBZGRyQSk7CiAJbnAtPm9yaWdfbWFjWzFdID0gcmVhZGwoYmFzZSArIE52UmVnTWFjQWRkckIpOwogCi0JZGV2LT5kZXZfYWRkclswXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDgpICYgMHhmZjsKLQlkZXYtPmRldl9hZGRyWzFdID0gKG5wLT5vcmlnX21hY1sxXSA+PiAgMCkgJiAweGZmOwotCWRldi0+ZGV2X2FkZHJbMl0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDI0KSAmIDB4ZmY7Ci0JZGV2LT5kZXZfYWRkclszXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMTYpICYgMHhmZjsKLQlkZXYtPmRldl9hZGRyWzRdID0gKG5wLT5vcmlnX21hY1swXSA+PiAgOCkgJiAweGZmOwotCWRldi0+ZGV2X2FkZHJbNV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CisJLyogY2hlY2sgdGhlIHdvcmthcm91bmQgYml0IGZvciBjb3JyZWN0IG1hYyBhZGRyZXNzIG9yZGVyICovCisJdHhyZWcgPSByZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdFBvbGwpOworCWlmICh0eHJlZyAmIE5WUkVHX1RSQU5TTUlUUE9MTF9NQUNfQUREUl9SRVYpIHsKKwkJLyogbWFjIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiBjb3JyZWN0IG9yZGVyICovCisJCWRldi0+ZGV2X2FkZHJbMF0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMl0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDE2KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAobnAtPm9yaWdfbWFjWzBdID4+IDI0KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbNF0gPSAobnAtPm9yaWdfbWFjWzFdID4+ICAwKSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbNV0gPSAobnAtPm9yaWdfbWFjWzFdID4+ICA4KSAmIDB4ZmY7CisJfSBlbHNlIHsKKwkJLyogbmVlZCB0byByZXZlcnNlIG1hYyBhZGRyZXNzIHRvIGNvcnJlY3Qgb3JkZXIgKi8KKwkJZGV2LT5kZXZfYWRkclswXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDgpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsxXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDApICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMjQpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclszXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gIDgpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls1XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gIDApICYgMHhmZjsKKwkJLyogc2V0IHBlcm1hbmVudCBhZGRyZXNzIHRvIGJlIGNvcnJlY3QgYXN3ZWxsICovCisJCW5wLT5vcmlnX21hY1swXSA9IChkZXYtPmRldl9hZGRyWzBdIDw8IDApICsgKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkgKworCQkJKGRldi0+ZGV2X2FkZHJbMl0gPDwgMTYpICsgKGRldi0+ZGV2X2FkZHJbM10gPDwgMjQpOworCQlucC0+b3JpZ19tYWNbMV0gPSAoZGV2LT5kZXZfYWRkcls0XSA8PCAwKSArIChkZXYtPmRldl9hZGRyWzVdIDw8IDgpOworCQl3cml0ZWwodHhyZWd8TlZSRUdfVFJBTlNNSVRQT0xMX01BQ19BRERSX1JFViwgYmFzZSArIE52UmVnVHJhbnNtaXRQb2xsKTsKKwl9CiAJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPnBlcm1fYWRkcikpIHsKQEAgLTQzMDksNiArNDQ1Nyw5IEBACiAJCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAogCQkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CiAKKwkvKiBzZXQgbWFjIGFkZHJlc3MgKi8KKwludl9jb3B5X21hY190b19odyhkZXYpOworCiAJLyogZGlzYWJsZSBXT0wgKi8KIAl3cml0ZWwoMCwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOwogCW5wLT53b2xlbmFibGVkID0gMDsKQEAgLTQzNjksNiArNDUyMCw3IEBACiAJCWlmIChpZDIgPCAwIHx8IGlkMiA9PSAweGZmZmYpCiAJCQljb250aW51ZTsKIAorCQlucC0+cGh5X21vZGVsID0gaWQyICYgUEhZSUQyX01PREVMX01BU0s7CiAJCWlkMSA9IChpZDEgJiBQSFlJRDFfT1VJX01BU0spIDw8IFBIWUlEMV9PVUlfU0hGVDsKIAkJaWQyID0gKGlkMiAmIFBIWUlEMl9PVUlfTUFTSykgPj4gUEhZSUQyX09VSV9TSEZUOwogCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvcGVuOiBGb3VuZCBQSFkgJTA0eDolMDR4IGF0IGFkZHJlc3MgJWQuXG4iLApAQCAtNDQyMSw5ICs0NTczLDE3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAorCS8qIHNwZWNpYWwgb3A6IHdyaXRlIGJhY2sgdGhlIG1pc29yZGVyZWQgTUFDIGFkZHJlc3MgLSBvdGhlcndpc2UKKwkgKiB0aGUgbmV4dCBudl9wcm9iZSB3b3VsZCBzZWUgYSB3cm9uZyBhZGRyZXNzLgorCSAqLworCXdyaXRlbChucC0+b3JpZ19tYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwl3cml0ZWwobnAtPm9yaWdfbWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7CisKIAkvKiBmcmVlIGFsbCBzdHJ1Y3R1cmVzICovCiAJZnJlZV9yaW5ncyhkZXYpOwogCWlvdW5tYXAoZ2V0X2h3YmFzZShkZXYpKTsKQEAgLTQ1NDAsNyArNDcwMCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbml0X25pYyh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aC5jOiBSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIGV0aGVybmV0IGRyaXZlci4gVmVyc2lvbiAlcy5cbiIsIEZPUkNFREVUSF9WRVJTSU9OKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uaWModm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IGU3ZDliZjMuLmZmNWE2N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtMTExLDcgKzExMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBmb3IgQ09ORklHX1BDSSAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwppbmRleCA0N2Y2ZjY0Li40MTViYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwpAQCAtNDUsNyArNDUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKaW5kZXggMGVhNjVjNC4uYjY5Nzc2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwpAQCAtNDAsNyArNDAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYi5oCmluZGV4IDgyYjY3YWYuLmE1MTYwNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYi5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYi5oCkBAIC0xMTAsOSArMTEwLDYgQEAKICNkZWZpbmUgSVhHQl9SWEJVRkZFUl84MTkyICA4MTkyCiAjZGVmaW5lIElYR0JfUlhCVUZGRVJfMTYzODQgMTYzODQKIAotLyogSG93IG1hbnkgVHggRGVzY3JpcHRvcnMgZG8gd2UgbmVlZCB0byBjYWxsIG5ldGlmX3dha2VfcXVldWU/ICovCi0jZGVmaW5lIElYR0JfVFhfUVVFVUVfV0FLRSAxNgotCiAvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLwogI2RlZmluZSBJWEdCX1JYX0JVRkZFUl9XUklURQk0CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLwogCkBAIC0xNzMsNyArMTcwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGxlZF9zdGF0dXM7CiAKIAkvKiBUWCAqLwotCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyB0eF9yaW5nOworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyB0eF9yaW5nIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAJdW5zaWduZWQgbG9uZyB0aW1lb19zdGFydDsKIAl1aW50MzJfdCB0eF9jbWRfdHlwZTsKIAl1aW50NjRfdCBod19jc3VtX3R4X2dvb2Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwppbmRleCBjZjE5Yjg5Li5iYTYyMTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMKQEAgLTY1NCwxMSArNjU0LDcgQEAKIAogCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOwogCi0JaWYgKGRhdGEpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShkYXRhICogSFopOwotCWVsc2UKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKLQorCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKIAlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+YmxpbmtfdGltZXIpOwogCWl4Z2JfbGVkX29mZigmYWRhcHRlci0+aHcpOwogCWNsZWFyX2JpdChJWEdCX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuYwppbmRleCBmN2ZhMTBlLi4yYjE1MTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuYworKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuYwpAQCAtMjM2LDYgKzIzNiwxNyBAQAogCQlERUJVR09VVCgiSWRlbnRpZmllZCBHNjEwNCBvcHRpY3NcbiIpOwogCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfZzYxMDQ7CiAJCWJyZWFrOworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9DWDQ6CisJCURFQlVHT1VUKCJJZGVudGlmaWVkIENYNFxuIik7CisJCXhwYWtfdmVuZG9yID0gaXhnYl9pZGVudGlmeV94cGFrX3ZlbmRvcihodyk7CisJCWlmICh4cGFrX3ZlbmRvciA9PSBpeGdiX3hwYWtfdmVuZG9yX2ludGVsKSB7CisJCQlERUJVR09VVCgiSWRlbnRpZmllZCBUWE4xNzIwMSBvcHRpY3NcbiIpOworCQkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX3R4bjE3MjAxOworCQl9IGVsc2UgeworCQkJREVCVUdPVVQoIklkZW50aWZpZWQgRzYwMDUgb3B0aWNzXG4iKTsKKwkJCXBoeV90eXBlID0gaXhnYl9waHlfdHlwZV9nNjAwNTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlERUJVR09VVCgiVW5rbm93biBwaHlzaWNhbCBsYXllciBtb2R1bGVcbiIpOwogCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfdW5rbm93bjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9pZHMuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9pZHMuaAppbmRleCA0MGEwODVmLi45ZmQ2MTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaWRzLmgKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2lkcy5oCkBAIC00NSw2ICs0NSw3IEBACiAKICNkZWZpbmUgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9DWDQgICAweDEwOUUKICNkZWZpbmUgSVhHQl9TVUJERVZJQ0VfSURfQTAwQyAgMHhBMDBDCisjZGVmaW5lIElYR0JfU1VCREVWSUNFX0lEX0EwMUMgIDB4QTAxQwogCiAjZW5kaWYgLyogI2lmbmRlZiBfSVhHQl9JRFNfSF8gKi8KIC8qIEVuZCBvZiBGaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwppbmRleCA3YmJkNDQ3Li5lMzZkZWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNlbHNlCiAjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgogI2VuZGlmCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4wLjEwOS1rMiJEUklWRVJOQVBJCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4wLjExMi1rMiJEUklWRVJOQVBJCiBjaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogc3RhdGljIGNoYXIgaXhnYl9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCkBAIC0xMTgsMTUgKzExOCwyNiBAQAogc3RhdGljIHZvaWQgaXhnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCiAKLS8qIEV4cG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcyAqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgaXhnYl9pb19lcnJvcl9kZXRlY3RlZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJICAgICAgICAgICAgICAgICAgICAgZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZSk7CitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpeGdiX2lvX3Nsb3RfcmVzZXQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyB2b2lkIGl4Z2JfaW9fcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAKKy8qIEV4cG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcyAqLwogZXh0ZXJuIHZvaWQgaXhnYl9jaGVja19vcHRpb25zKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCitzdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBpeGdiX2Vycl9oYW5kbGVyID0geworCS5lcnJvcl9kZXRlY3RlZCA9IGl4Z2JfaW9fZXJyb3JfZGV0ZWN0ZWQsCisJLnNsb3RfcmVzZXQgPSBpeGdiX2lvX3Nsb3RfcmVzZXQsCisJLnJlc3VtZSA9IGl4Z2JfaW9fcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl4Z2JfZHJpdmVyID0gewogCS5uYW1lICAgICA9IGl4Z2JfZHJpdmVyX25hbWUsCiAJLmlkX3RhYmxlID0gaXhnYl9wY2lfdGJsLAogCS5wcm9iZSAgICA9IGl4Z2JfcHJvYmUsCiAJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoaXhnYl9yZW1vdmUpLAorCS5lcnJfaGFuZGxlciA9ICZpeGdiX2Vycl9oYW5kbGVyCiB9OwogCiBNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiwgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPiIpOwpAQCAtMTQwLDEyICsxNTEsMTIgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CiAKIC8qIHNvbWUgZGVmaW5lcyBmb3IgY29udHJvbGxpbmcgZGVzY3JpcHRvciBmZXRjaGVzIGluIGgvdyAqLwotI2RlZmluZSBSWERDVExfV1RIUkVTSF9ERUZBVUxUIDE2CS8qIGNoaXAgd3JpdGVzIGJhY2sgYXQgdGhpcyBtYW55IG9yIFJYVDAgKi8KLSNkZWZpbmUgUlhEQ1RMX1BUSFJFU0hfREVGQVVMVCAwCQkvKiBjaGlwIGNvbnNpZGVycyBwcmVmZWNoIGJlbG93Ci0JCQkJCQkgKiB0aGlzICovCi0jZGVmaW5lIFJYRENUTF9IVEhSRVNIX0RFRkFVTFQgMAkJLyogY2hpcCB3aWxsIG9ubHkgcHJlZmV0Y2ggaWYgdGFpbAotCQkJCQkJICogaXMgcHVzaGVkIHRoaXMgbWFueSBkZXNjcmlwdG9ycwotCQkJCQkJICogZnJvbSBoZWFkICovCisjZGVmaW5lIFJYRENUTF9XVEhSRVNIX0RFRkFVTFQgMTUgIC8qIGNoaXAgd3JpdGVzIGJhY2sgYXQgdGhpcyBtYW55IG9yIFJYVDAgKi8KKyNkZWZpbmUgUlhEQ1RMX1BUSFJFU0hfREVGQVVMVCAwICAgLyogY2hpcCBjb25zaWRlcnMgcHJlZmVjaCBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzICovCisjZGVmaW5lIFJYRENUTF9IVEhSRVNIX0RFRkFVTFQgMCAgIC8qIGNoaXAgd2lsbCBvbmx5IHByZWZldGNoIGlmIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgcHVzaGVkIHRoaXMgbWFueSBkZXNjcmlwdG9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIGhlYWQgKi8KIAogLyoqCiAgKiBpeGdiX2luaXRfbW9kdWxlIC0gRHJpdmVyIFJlZ2lzdHJhdGlvbiBSb3V0aW5lCkBAIC0xNjIsNyArMTczLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBpeGdiX2NvcHlyaWdodCk7CiAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpeGdiX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJml4Z2JfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaXhnYl9pbml0X21vZHVsZSk7CkBAIC0xMTc0LDYgKzExODUsNyBAQAogCWludCBlcnI7CiAKIAlpZiAobGlrZWx5KHNrYl9pc19nc28oc2tiKSkpIHsKKwkJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKIAkJCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChlcnIpCkBAIC0xMTk2LDYgKzEyMDgsOCBAQAogCiAJCWkgPSBhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlOwogCQljb250ZXh0X2Rlc2MgPSBJWEdCX0NPTlRFWFRfREVTQyhhZGFwdGVyLT50eF9yaW5nLCBpKTsKKwkJYnVmZmVyX2luZm8gPSAmYWRhcHRlci0+dHhfcmluZy5idWZmZXJfaW5mb1tpXTsKKwkJV0FSTl9PTihidWZmZXJfaW5mby0+ZG1hICE9IDApOwogCiAJCWNvbnRleHRfZGVzYy0+aXBjc3MgPSBpcGNzczsKIAkJY29udGV4dF9kZXNjLT5pcGNzbyA9IGlwY3NvOwpAQCAtMTIzMywxMSArMTI0NywxNCBAQAogCXVpbnQ4X3QgY3NzLCBjc287CiAKIAlpZihsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJCWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CiAJCWNzbyA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YTsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKIAkJY29udGV4dF9kZXNjID0gSVhHQl9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CisJCWJ1ZmZlcl9pbmZvID0gJmFkYXB0ZXItPnR4X3JpbmcuYnVmZmVyX2luZm9baV07CisJCVdBUk5fT04oYnVmZmVyX2luZm8tPmRtYSAhPSAwKTsKIAogCQljb250ZXh0X2Rlc2MtPnR1Y3NzID0gY3NzOwogCQljb250ZXh0X2Rlc2MtPnR1Y3NvID0gY3NvOwpAQCAtMTI4Myw2ICsxMzAwLDcgQEAKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCXNpemUgPSBtaW4obGVuLCBJWEdCX01BWF9EQVRBX1BFUl9UWEQpOwogCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gc2l6ZTsKKwkJV0FSTl9PTihidWZmZXJfaW5mby0+ZG1hICE9IDApOwogCQlidWZmZXJfaW5mby0+ZG1hID0KIAkJCXBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsCiAJCQkJc2tiLT5kYXRhICsgb2Zmc2V0LApAQCAtMTU0Myw2ICsxNTYxLDExIEBACiBpeGdiX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCisJLyogUHJldmVudCBzdGF0cyB1cGRhdGUgd2hpbGUgYWRhcHRlciBpcyBiZWluZyByZXNldCAqLworCWlmIChwZGV2LT5lcnJvcl9zdGF0ZSAmJiBwZGV2LT5lcnJvcl9zdGF0ZSAhPSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCisJCXJldHVybjsKIAogCWlmKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAogCSAgIChuZXRkZXYtPm1jX2NvdW50ID4gSVhHQl9NQVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTRVMpKSB7CkBAIC0xNzg3LDcgKzE4MTAsNyBAQAogCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpKSB7CiAJCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfbG9jayk7CiAJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikgJiYgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpICYmCi0JCSAgICAoSVhHQl9ERVNDX1VOVVNFRCh0eF9yaW5nKSA+IElYR0JfVFhfUVVFVUVfV0FLRSkpCisJCSAgICAoSVhHQl9ERVNDX1VOVVNFRCh0eF9yaW5nKSA+PSBERVNDX05FRURFRCkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CiAJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKIAl9CkBAIC0xOTQ4LDEwICsxOTcxLDkgQEAKICNkZWZpbmUgSVhHQl9DQl9MRU5HVEggMjU2CiAJCWlmIChsZW5ndGggPCBJWEdCX0NCX0xFTkdUSCkgewogCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPQotCQkJICAgIGRldl9hbGxvY19za2IobGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKKwkJCSAgICBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKIAkJCWlmIChuZXdfc2tiKSB7CiAJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKLQkJCQluZXdfc2tiLT5kZXYgPSBuZXRkZXY7CiAJCQkJbWVtY3B5KG5ld19za2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCiAJCQkJICAgICAgIHNrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTiwKIAkJCQkgICAgICAgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKQEAgLTIwMzEsMTQgKzIwNTMsMTQgQEAKIAkvKiBsZWF2ZSB0aHJlZSBkZXNjcmlwdG9ycyB1bnVzZWQgKi8KIAl3aGlsZSgtLWNsZWFuY291bnQgPiAyKSB7CiAJCS8qIHJlY3ljbGUhIGl0cyBnb29kIGZvciB5b3UgKi8KLQkJaWYgKCEoc2tiID0gYnVmZmVyX2luZm8tPnNrYikpCi0JCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4KLQkJCSAgICAgICAgICAgICAgICAgICAgKyBORVRfSVBfQUxJR04pOwotCQllbHNlIHsKKwkJc2tiID0gYnVmZmVyX2luZm8tPnNrYjsKKwkJaWYgKHNrYikgewogCQkJc2tiX3RyaW0oc2tiLCAwKTsKIAkJCWdvdG8gbWFwX3NrYjsKIAkJfQogCisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IobmV0ZGV2LCBhZGFwdGVyLT5yeF9idWZmZXJfbGVuCisJCQkgICAgICAgICAgICAgICArIE5FVF9JUF9BTElHTik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLwogCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmZl9mYWlsZWQrKzsKQEAgLTIwNTEsOCArMjA3Myw2IEBACiAJCSAqLwogCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAKLQkJc2tiLT5kZXYgPSBuZXRkZXY7Ci0KIAkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKIAkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CiBtYXBfc2tiOgpAQCAtMjE5MCw3ICsyMjEwLDcgQEAKIAogc3RhdGljIHZvaWQgaXhnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWRpc2FibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CiAJaXhnYl9pbnRyKGFkYXB0ZXItPnBkZXYtPmlycSwgZGV2LCBOVUxMKTsKQEAgLTIxOTgsNCArMjIxOCw5OCBAQAogfQogI2VuZGlmCiAKKy8qKgorICogaXhnYl9pb19lcnJvcl9kZXRlY3RlZCgpIC0gY2FsbGVkIHdoZW4gUENJIGVycm9yIGlzIGRldGVjdGVkCisgKiBAcGRldiAgICBwb2ludGVyIHRvIHBjaSBkZXZpY2Ugd2l0aCBlcnJvcgorICogQHN0YXRlICAgcGNpIGNoYW5uZWwgc3RhdGUgYWZ0ZXIgZXJyb3IKKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1YnN5c3RlbSB3aGVuZXZlcgorICogYSBQQ0kgYnVzIGVycm9yIGlzIGRldGVjdGVkLgorICovCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpeGdiX2lvX2Vycm9yX2RldGVjdGVkIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgICAgICAgICBlbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJLyogUmVxdWVzdCBhIHNsb3QgcmVzZXQuICovCisJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7Cit9CisKKy8qKgorICogaXhnYl9pb19zbG90X3Jlc2V0IC0gY2FsbGVkIGFmdGVyIHRoZSBwY2kgYnVzIGhhcyBiZWVuIHJlc2V0LgorICogQHBkZXYgICAgcG9pbnRlciB0byBwY2kgZGV2aWNlIHdpdGggZXJyb3IKKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciB0aGUgUENJIGJ1c3MgaGFzIGJlZW4gcmVzZXQuCisgKiBCYXNpY2FsbHksIHRoaXMgdHJpZXMgdG8gcmVzdGFydCB0aGUgY2FyZCBmcm9tIHNjcmF0Y2guCisgKiBUaGlzIGlzIGEgc2hvcnRlbmVkIHZlcnNpb24gb2YgdGhlIGRldmljZSBwcm9iZS9kaXNjb3ZlcnkgY29kZSwKKyAqIGl0IHJlc2VtYmxlcyB0aGUgZmlyc3QtaGFsZiBvZiB0aGUgaXhnYl9wcm9iZSgpIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGl4Z2JfaW9fc2xvdF9yZXNldCAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaWYocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IHJlLWVuYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHJlc2V0LlxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCS8qIFBlcmZvcm0gY2FyZCByZXNldCBvbmx5IG9uIG9uZSBpbnN0YW5jZSBvZiB0aGUgY2FyZCAqLworCWlmICgwICE9IFBDSV9GVU5DIChwZGV2LT5kZXZmbikpCisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIEVFUFJPTSBpcyBnb29kICovCisJaWYoIWl4Z2JfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKCZhZGFwdGVyLT5odykpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQWZ0ZXIgcmVzZXQsIHRoZSBFRVBST00gY2hlY2tzdW0gaXMgbm90IHZhbGlkLlxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKwlpeGdiX2dldF9lZV9tYWNfYWRkcigmYWRhcHRlci0+aHcsIG5ldGRldi0+ZGV2X2FkZHIpOworCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgbmV0ZGV2LT5kZXZfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQWZ0ZXIgcmVzZXQsIGludmFsaWQgTUFDIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJfQorCisJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKK30KKworLyoqCisgKiBpeGdiX2lvX3Jlc3VtZSAtIGNhbGxlZCB3aGVuIGl0cyBPSyB0byByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbnMKKyAqIEBwZGV2ICAgIHBvaW50ZXIgdG8gcGNpIGRldmljZSB3aXRoIGVycm9yCisgKgorICogVGhlIGVycm9yIHJlY292ZXJ5IGRyaXZlciB0ZWxscyB1cyB0aGF0IGl0cyBPSyB0byByZXN1bWUKKyAqIG5vcm1hbCBvcGVyYXRpb24uIEltcGxlbWVudGF0aW9uIHJlc2VtYmxlcyB0aGUgc2Vjb25kLWhhbGYKKyAqIG9mIHRoZSBpeGdiX3Byb2JlKCkgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgaXhnYl9pb19yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWlmKGl4Z2JfdXAoYWRhcHRlcikpIHsKKwkJCXByaW50ayAoIml4Z2I6IGNhbid0IGJyaW5nIGRldmljZSBiYWNrIHVwIGFmdGVyIHJlc2V0XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKK30KKwogLyogaXhnYl9tYWluLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IDliZGQ0M2EuLmIxOWUyMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwpAQCAtMTg3LDExICsxODcsMTQgQEAKIAl1OCBtYWNfYWRkcls2XTsJCS8qIGVlcHJvbSBtYWMgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGxvbmcgc2VyaWFsX251bWJlcjsKIAlpbnQgdmVuZG9yX3NwZWNpZmljX29mZnNldDsKKwlpbnQgZndfbXVsdGljYXN0X3N1cHBvcnQ7CiAJdTMyIGRldmN0bDsKIAl1MTYgbXNpX2ZsYWdzOwogCXUzMiByZWFkX2RtYTsKIAl1MzIgd3JpdGVfZG1hOwogCXUzMiByZWFkX3dyaXRlX2RtYTsKKwl1MzIgbGlua19jaGFuZ2VzOworCXUzMiBtc2dfZW5hYmxlOwogfTsKIAogc3RhdGljIGNoYXIgKm15cmkxMGdlX2Z3X3VuYWxpZ25lZCA9ICJteXJpMTBnZV9ldGhwX3o4ZS5kYXQiOwpAQCAtMjU3LDYgKzI2MCwxMiBAQAogTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9tYXhfaXJxX2xvb3BzLAogCQkgIlNldCBzdHVjayBsZWdhY3kgSVJRIGRldGVjdGlvbiB0aHJlc2hvbGRcbiIpOwogCisjZGVmaW5lIE1ZUkkxMEdFX01TR19ERUZBVUxUIE5FVElGX01TR19MSU5LCisKK3N0YXRpYyBpbnQgbXlyaTEwZ2VfZGVidWcgPSAtMTsJLyogZGVmYXVsdHMgYWJvdmUgKi8KK21vZHVsZV9wYXJhbShteXJpMTBnZV9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXlyaTEwZ2VfZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CisKICNkZWZpbmUgTVlSSTEwR0VfRldfT0ZGU0VUIDEwMjQqMTAyNAogI2RlZmluZSBNWVJJMTBHRV9ISUdIUEFSVF9UT19VMzIoWCkgXAogKHNpemVvZiAoWCkgPT0gOCkgPyAoKHUzMikoKHU2NCkoWCkgPj4gMzIpKSA6ICgwKQpAQCAtMjcxLDcgKzI4MCw3IEBACiAJc3RydWN0IG1jcF9jbWQgKmJ1ZjsKIAljaGFyIGJ1Zl9ieXRlc1tzaXplb2YoKmJ1ZikgKyA4XTsKIAlzdHJ1Y3QgbWNwX2NtZF9yZXNwb25zZSAqcmVzcG9uc2UgPSBtZ3AtPmNtZDsKLQljaGFyIF9faW9tZW0gKmNtZF9hZGRyID0gbWdwLT5zcmFtICsgTVhHRUZXX0NNRF9PRkZTRVQ7CisJY2hhciBfX2lvbWVtICpjbWRfYWRkciA9IG1ncC0+c3JhbSArIE1YR0VGV19FVEhfQ01EOwogCXUzMiBkbWFfbG93LCBkbWFfaGlnaCwgcmVzdWx0LCB2YWx1ZTsKIAlpbnQgc2xlZXBfdG90YWwgPSAwOwogCkBAIC0zMjAsNiArMzI5LDggQEAKIAkJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCQlkYXRhLT5kYXRhMCA9IHZhbHVlOwogCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAocmVzdWx0ID09IE1YR0VGV19DTURfVU5LTk9XTikgeworCQkJcmV0dXJuIC1FTk9TWVM7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZXJyKCZtZ3AtPnBkZXYtPmRldiwKIAkJCQkiY29tbWFuZCAlZCBmYWlsZWQsIHJlc3VsdCA9ICVkXG4iLApAQCAtNDA0LDcgKzQxNSw3IEBACiAJYnVmWzRdID0gaHRvbmwoZG1hX2xvdyk7CS8qIGR1bW15IGFkZHIgTFNXICovCiAJYnVmWzVdID0gaHRvbmwoZW5hYmxlKTsJLyogZW5hYmxlPyAqLwogCi0Jc3VibWl0ID0gbWdwLT5zcmFtICsgMHhmYzAxYzA7CisJc3VibWl0ID0gbWdwLT5zcmFtICsgTVhHRUZXX0JPT1RfRFVNTVlfUkRNQTsKIAogCW15cmkxMGdlX3Bpb19jb3B5KHN1Ym1pdCwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWZvciAoaSA9IDA7IG1ncC0+Y21kLT5kYXRhICE9IE1ZUkkxMEdFX05PX0NPTkZJUk1fREFUQSAmJiBpIDwgMjA7IGkrKykKQEAgLTYwMCw3ICs2MTEsNyBAQAogCWJ1Zls1XSA9IGh0b25sKDgpOwkvKiB3aGVyZSB0byBjb3B5IHRvICovCiAJYnVmWzZdID0gaHRvbmwoMCk7CS8qIHdoZXJlIHRvIGp1bXAgdG8gKi8KIAotCXN1Ym1pdCA9IG1ncC0+c3JhbSArIDB4ZmMwMDAwOworCXN1Ym1pdCA9IG1ncC0+c3JhbSArIE1YR0VGV19CT09UX0hBTkRPRkY7CiAKIAlteXJpMTBnZV9waW9fY29weShzdWJtaXQsICZidWYsIHNpemVvZihidWYpKTsKIAltYigpOwpAQCAtNzY0LDYgKzc3NSw3IEBACiAJbWdwLT5yeF9zbWFsbC5jbnQgPSAwOwogCW1ncC0+cnhfZG9uZS5pZHggPSAwOwogCW1ncC0+cnhfZG9uZS5jbnQgPSAwOworCW1ncC0+bGlua19jaGFuZ2VzID0gMDsKIAlzdGF0dXMgPSBteXJpMTBnZV91cGRhdGVfbWFjX2FkZHJlc3MobWdwLCBtZ3AtPmRldi0+ZGV2X2FkZHIpOwogCW15cmkxMGdlX2NoYW5nZV9wcm9taXNjKG1ncCwgMCwgMCk7CiAJbXlyaTEwZ2VfY2hhbmdlX3BhdXNlKG1ncCwgbWdwLT5wYXVzZSk7CkBAIC03OTgsMTIgKzgxMCwxMyBAQAogICogcGFnZXMgZGlyZWN0bHkgYW5kIGJ1aWxkaW5nIGEgZnJhZ2xpc3QgaW4gdGhlIG5lYXIgZnV0dXJlLgogICovCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm15cmkxMGdlX2FsbG9jX2JpZyhpbnQgYnl0ZXMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpMTBnZV9hbGxvY19iaWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSBpbnQgYnl0ZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIGRhdGEsIHJvdW5kdXA7CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGJ5dGVzICsgNDA5NiArIE1YR0VGV19QQUQpOworCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBieXRlcyArIDQwOTYgKyBNWEdFRldfUEFEKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC04MjEsMTIgKzgzNCwxMyBAQAogCiAvKiBBbGxvY2F0ZSAyeCBhcyBtdWNoIHNwYWNlIGFzIHJlcXVpcmVkIGFuZCB1c2Ugd2hpY2hldmVyIHBvcnRpb24KICAqIGRvZXMgbm90IGNyb3NzIGEgNEtCIGJvdW5kYXJ5ICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpMTBnZV9hbGxvY19zbWFsbF9zYWZlKHVuc2lnbmVkIGludCBieXRlcykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm15cmkxMGdlX2FsbG9jX3NtYWxsX3NhZmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYnl0ZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIGRhdGEsIGJvdW5kYXJ5OwogCi0Jc2tiID0gZGV2X2FsbG9jX3NrYigyICogKGJ5dGVzICsgTVhHRUZXX1BBRCkgLSAxKTsKKwlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgMiAqIChieXRlcyArIE1YR0VGV19QQUQpIC0gMSk7CiAJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTg0NywxMiArODYxLDEzIEBACiAKIC8qIEFsbG9jYXRlIGp1c3QgZW5vdWdoIHNwYWNlLCBhbmQgdmVyaWZ5IHRoYXQgdGhlIGFsbG9jYXRlZAogICogc3BhY2UgZG9lcyBub3QgY3Jvc3MgYSA0S0IgYm91bmRhcnkgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm15cmkxMGdlX2FsbG9jX3NtYWxsKGludCBieXRlcykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm15cmkxMGdlX2FsbG9jX3NtYWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICBpbnQgYnl0ZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIHJvdW5kdXAsIGRhdGEsIGVuZDsKIAotCXNrYiA9IGRldl9hbGxvY19za2IoYnl0ZXMgKyAxNiArIE1YR0VGV19QQUQpOworCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBieXRlcyArIDE2ICsgTVhHRUZXX1BBRCk7CiAJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTg2OCwxNSArODgzLDE3IEBACiAJCSAgICAgICAibXlyaTEwZ2VfYWxsb2Nfc21hbGw6IHNtYWxsIHNrYiBjcm9zc2VkIDRLQiBib3VuZGFyeVxuIik7CiAJCW15cmkxMGdlX3NrYl9jcm9zc180ayA9IDE7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNrYiA9IG15cmkxMGdlX2FsbG9jX3NtYWxsX3NhZmUoYnl0ZXMpOworCQlza2IgPSBteXJpMTBnZV9hbGxvY19zbWFsbF9zYWZlKGRldiwgYnl0ZXMpOwogCX0KIAlyZXR1cm4gc2tiOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotbXlyaTEwZ2VfZ2V0YnVmKHN0cnVjdCBteXJpMTBnZV9yeF9idWYgKnJ4LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJ5dGVzLAotCQlpbnQgaWR4KQorbXlyaTEwZ2VfZ2V0YnVmKHN0cnVjdCBteXJpMTBnZV9yeF9idWYgKnJ4LCBzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwLAorCQlpbnQgYnl0ZXMsIGludCBpZHgpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1ncC0+ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gbWdwLT5wZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJZG1hX2FkZHJfdCBidXM7CiAJaW50IGxlbiwgcmV0dmFsID0gMDsKQEAgLTg4NCwxMSArOTAxLDExIEBACiAJYnl0ZXMgKz0gVkxBTl9ITEVOOwkvKiBhY2NvdW50IGZvciA4MDIuMXEgdmxhbiB0YWcgKi8KIAogCWlmICgoYnl0ZXMgKyBNWEdFRldfUEFEKSA+ICg0MDk2IC0gMTYpIC8qIGxpbnV4IG92ZXJoZWFkICovICkKLQkJc2tiID0gbXlyaTEwZ2VfYWxsb2NfYmlnKGJ5dGVzKTsKKwkJc2tiID0gbXlyaTEwZ2VfYWxsb2NfYmlnKGRldiwgYnl0ZXMpOwogCWVsc2UgaWYgKG15cmkxMGdlX3NrYl9jcm9zc180aykKLQkJc2tiID0gbXlyaTEwZ2VfYWxsb2Nfc21hbGxfc2FmZShieXRlcyk7CisJCXNrYiA9IG15cmkxMGdlX2FsbG9jX3NtYWxsX3NhZmUoZGV2LCBieXRlcyk7CiAJZWxzZQotCQlza2IgPSBteXJpMTBnZV9hbGxvY19zbWFsbChieXRlcyk7CisJCXNrYiA9IG15cmkxMGdlX2FsbG9jX3NtYWxsKGRldiwgYnl0ZXMpOwogCiAJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkgewogCQlyeC0+YWxsb2NfZmFpbCsrOwpAQCAtOTUxLDcgKzk2OCw3IEBACiAJdW5tYXBfbGVuID0gcGNpX3VubWFwX2xlbigmcngtPmluZm9baWR4XSwgbGVuKTsKIAogCS8qIHRyeSB0byByZXBsYWNlIHRoZSByZWNlaXZlZCBza2IgKi8KLQlpZiAobXlyaTEwZ2VfZ2V0YnVmKHJ4LCBtZ3AtPnBkZXYsIGJ5dGVzLCBpZHgpKSB7CisJaWYgKG15cmkxMGdlX2dldGJ1ZihyeCwgbWdwLCBieXRlcywgaWR4KSkgewogCQkvKiBkcm9wIHRoZSBmcmFtZSAtLSB0aGUgb2xkIHNrYnVmIGlzIHJlLWN5Y2xlZCAqLwogCQltZ3AtPnN0YXRzLnJ4X2Ryb3BwZWQgKz0gMTsKIAkJcmV0dXJuIDA7CkBAIC05NjgsNyArOTg1LDYgQEAKIAlza2JfcHV0KHNrYiwgbGVuKTsKIAogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG1ncC0+ZGV2KTsKLQlza2ItPmRldiA9IG1ncC0+ZGV2OwogCWlmIChtZ3AtPmNzdW1fZmxhZykgewogCQlpZiAoKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVApKSB8fAogCQkgICAgKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVBWNikpKSB7CkBAIC0xMDgxLDEzICsxMDk3LDE5IEBACiAJCWlmIChtZ3AtPmxpbmtfc3RhdGUgIT0gc3RhdHMtPmxpbmtfdXApIHsKIAkJCW1ncC0+bGlua19zdGF0ZSA9IHN0YXRzLT5saW5rX3VwOwogCQkJaWYgKG1ncC0+bGlua19zdGF0ZSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gIm15cmkxMGdlOiAlczogbGluayB1cFxuIiwKLQkJCQkgICAgICAgbWdwLT5kZXYtPm5hbWUpOworCQkJCWlmIChuZXRpZl9tc2dfbGluayhtZ3ApKQorCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAibXlyaTEwZ2U6ICVzOiBsaW5rIHVwXG4iLAorCQkJCQkgICAgICAgbWdwLT5kZXYtPm5hbWUpOwogCQkJCW5ldGlmX2NhcnJpZXJfb24obWdwLT5kZXYpOworCQkJCW1ncC0+bGlua19jaGFuZ2VzKys7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIm15cmkxMGdlOiAlczogbGluayBkb3duXG4iLAotCQkJCSAgICAgICBtZ3AtPmRldi0+bmFtZSk7CisJCQkJaWYgKG5ldGlmX21zZ19saW5rKG1ncCkpCisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICJteXJpMTBnZTogJXM6IGxpbmsgZG93blxuIiwKKwkJCQkJICAgICAgIG1ncC0+ZGV2LT5uYW1lKTsKIAkJCQluZXRpZl9jYXJyaWVyX29mZihtZ3AtPmRldik7CisJCQkJbWdwLT5saW5rX2NoYW5nZXMrKzsKIAkJCX0KIAkJfQogCQlpZiAobWdwLT5yZG1hX3RhZ3NfYXZhaWxhYmxlICE9CkBAIC0xMjg5LDcgKzEzMTEsOCBAQAogCSJzZXJpYWxfbnVtYmVyIiwgInR4X3BrdF9zdGFydCIsICJ0eF9wa3RfZG9uZSIsCiAJInR4X3JlcSIsICJ0eF9kb25lIiwgInJ4X3NtYWxsX2NudCIsICJyeF9iaWdfY250IiwKIAkid2FrZV9xdWV1ZSIsICJzdG9wX3F1ZXVlIiwgIndhdGNoZG9nX3Jlc2V0cyIsICJ0eF9saW5lYXJpemVkIiwKLQkibGlua191cCIsICJkcm9wcGVkX2xpbmtfb3ZlcmZsb3ciLCAiZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkIiwKKwkibGlua19jaGFuZ2VzIiwgImxpbmtfdXAiLCAiZHJvcHBlZF9saW5rX292ZXJmbG93IiwKKwkiZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkIiwgImRyb3BwZWRfbXVsdGljYXN0X2ZpbHRlcmVkIiwKIAkiZHJvcHBlZF9ydW50IiwgImRyb3BwZWRfb3ZlcnJ1biIsICJkcm9wcGVkX25vX3NtYWxsX2J1ZmZlciIsCiAJImRyb3BwZWRfbm9fYmlnX2J1ZmZlciIKIH07CkBAIC0xMzQxLDE2ICsxMzY0LDMxIEBACiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCltZ3AtPnN0b3BfcXVldWU7CiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCltZ3AtPndhdGNoZG9nX3Jlc2V0czsKIAlkYXRhW2krK10gPSAodW5zaWduZWQgaW50KW1ncC0+dHhfbGluZWFyaXplZDsKKwlkYXRhW2krK10gPSAodW5zaWduZWQgaW50KW1ncC0+bGlua19jaGFuZ2VzOwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbnRvaGwobWdwLT5md19zdGF0cy0+bGlua191cCk7CiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCludG9obChtZ3AtPmZ3X3N0YXRzLT5kcm9wcGVkX2xpbmtfb3ZlcmZsb3cpOwogCWRhdGFbaSsrXSA9CiAJICAgICh1bnNpZ25lZCBpbnQpbnRvaGwobWdwLT5md19zdGF0cy0+ZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkKTsKKwlkYXRhW2krK10gPQorCSAgICAodW5zaWduZWQgaW50KW50b2hsKG1ncC0+Zndfc3RhdHMtPmRyb3BwZWRfbXVsdGljYXN0X2ZpbHRlcmVkKTsKIAlkYXRhW2krK10gPSAodW5zaWduZWQgaW50KW50b2hsKG1ncC0+Zndfc3RhdHMtPmRyb3BwZWRfcnVudCk7CiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCludG9obChtZ3AtPmZ3X3N0YXRzLT5kcm9wcGVkX292ZXJydW4pOwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbnRvaGwobWdwLT5md19zdGF0cy0+ZHJvcHBlZF9ub19zbWFsbF9idWZmZXIpOwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbnRvaGwobWdwLT5md19zdGF0cy0+ZHJvcHBlZF9ub19iaWdfYnVmZmVyKTsKIH0KIAorc3RhdGljIHZvaWQgbXlyaTEwZ2Vfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwltZ3AtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIHUzMiBteXJpMTBnZV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gbWdwLT5tc2dfZW5hYmxlOworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG15cmkxMGdlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBteXJpMTBnZV9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gbXlyaTEwZ2VfZ2V0X2RydmluZm8sCkBAIC0xMzcxLDcgKzE0MDksOSBAQAogI2VuZGlmCiAJLmdldF9zdHJpbmdzID0gbXlyaTEwZ2VfZ2V0X3N0cmluZ3MsCiAJLmdldF9zdGF0c19jb3VudCA9IG15cmkxMGdlX2dldF9zdGF0c19jb3VudCwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBteXJpMTBnZV9nZXRfZXRodG9vbF9zdGF0cworCS5nZXRfZXRodG9vbF9zdGF0cyA9IG15cmkxMGdlX2dldF9ldGh0b29sX3N0YXRzLAorCS5zZXRfbXNnbGV2ZWwgPSBteXJpMTBnZV9zZXRfbXNnbGV2ZWwsCisJLmdldF9tc2dsZXZlbCA9IG15cmkxMGdlX2dldF9tc2dsZXZlbAogfTsKIAogc3RhdGljIGludCBteXJpMTBnZV9hbGxvY2F0ZV9yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTQzOSw3ICsxNDc5LDcgQEAKIAkvKiBGaWxsIHRoZSByZWNlaXZlIHJpbmdzICovCiAKIAlmb3IgKGkgPSAwOyBpIDw9IG1ncC0+cnhfc21hbGwubWFzazsgaSsrKSB7Ci0JCXN0YXR1cyA9IG15cmkxMGdlX2dldGJ1ZigmbWdwLT5yeF9zbWFsbCwgbWdwLT5wZGV2LAorCQlzdGF0dXMgPSBteXJpMTBnZV9nZXRidWYoJm1ncC0+cnhfc21hbGwsIG1ncCwKIAkJCQkJIG1ncC0+c21hbGxfYnl0ZXMsIGkpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTE0NTEsOCArMTQ5MSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IG1ncC0+cnhfYmlnLm1hc2s7IGkrKykgewogCQlzdGF0dXMgPQotCQkgICAgbXlyaTEwZ2VfZ2V0YnVmKCZtZ3AtPnJ4X2JpZywgbWdwLT5wZGV2LAotCQkJCSAgICBkZXYtPm10dSArIEVUSF9ITEVOLCBpKTsKKwkJICAgIG15cmkxMGdlX2dldGJ1ZigmbWdwLT5yeF9iaWcsIG1ncCwgZGV2LT5tdHUgKyBFVEhfSExFTiwgaSk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJteXJpMTBnZTogJXM6IGFsbG9jZWQgb25seSAlZCBiaWcgYnVmc1xuIiwKQEAgLTE2NDgsOSArMTY4NywxMSBAQAogCX0KIAogCWlmIChtZ3AtPm10cnIgPj0gMCkgewotCQltZ3AtPnR4LndjX2ZpZm8gPSAodTggX19pb21lbSAqKSBtZ3AtPnNyYW0gKyAweDIwMDAwMDsKLQkJbWdwLT5yeF9zbWFsbC53Y19maWZvID0gKHU4IF9faW9tZW0gKikgbWdwLT5zcmFtICsgMHgzMDAwMDA7Ci0JCW1ncC0+cnhfYmlnLndjX2ZpZm8gPSAodTggX19pb21lbSAqKSBtZ3AtPnNyYW0gKyAweDM0MDAwMDsKKwkJbWdwLT50eC53Y19maWZvID0gKHU4IF9faW9tZW0gKikgbWdwLT5zcmFtICsgTVhHRUZXX0VUSF9TRU5EXzQ7CisJCW1ncC0+cnhfc21hbGwud2NfZmlmbyA9CisJCSAgICAodTggX19pb21lbSAqKSBtZ3AtPnNyYW0gKyBNWEdFRldfRVRIX1JFQ1ZfU01BTEw7CisJCW1ncC0+cnhfYmlnLndjX2ZpZm8gPQorCQkgICAgKHU4IF9faW9tZW0gKikgbWdwLT5zcmFtICsgTVhHRUZXX0VUSF9SRUNWX0JJRzsKIAl9IGVsc2UgewogCQltZ3AtPnR4LndjX2ZpZm8gPSBOVUxMOwogCQltZ3AtPnJ4X3NtYWxsLndjX2ZpZm8gPSBOVUxMOwpAQCAtMTY4Niw3ICsxNzI3LDIxIEBACiAKIAljbWQuZGF0YTAgPSBNWVJJMTBHRV9MT1dQQVJUX1RPX1UzMihtZ3AtPmZ3X3N0YXRzX2J1cyk7CiAJY21kLmRhdGExID0gTVlSSTEwR0VfSElHSFBBUlRfVE9fVTMyKG1ncC0+Zndfc3RhdHNfYnVzKTsKLQlzdGF0dXMgPSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19DTURfU0VUX1NUQVRTX0RNQSwgJmNtZCwgMCk7CisJY21kLmRhdGEyID0gc2l6ZW9mKHN0cnVjdCBtY3BfaXJxX2RhdGEpOworCXN0YXR1cyA9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9TRVRfU1RBVFNfRE1BX1YyLCAmY21kLCAwKTsKKwlpZiAoc3RhdHVzID09IC1FTk9TWVMpIHsKKwkJZG1hX2FkZHJfdCBidXMgPSBtZ3AtPmZ3X3N0YXRzX2J1czsKKwkJYnVzICs9IG9mZnNldG9mKHN0cnVjdCBtY3BfaXJxX2RhdGEsIHNlbmRfZG9uZV9jb3VudCk7CisJCWNtZC5kYXRhMCA9IE1ZUkkxMEdFX0xPV1BBUlRfVE9fVTMyKGJ1cyk7CisJCWNtZC5kYXRhMSA9IE1ZUkkxMEdFX0hJR0hQQVJUX1RPX1UzMihidXMpOworCQlzdGF0dXMgPSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsCisJCQkJCSAgIE1YR0VGV19DTURfU0VUX1NUQVRTX0RNQV9PQlNPTEVURSwKKwkJCQkJICAgJmNtZCwgMCk7CisJCS8qIEZpcm13YXJlIGNhbm5vdCBzdXBwb3J0IG11bHRpY2FzdCB3aXRob3V0IFNUQVRTX0RNQV9WMiAqLworCQltZ3AtPmZ3X211bHRpY2FzdF9zdXBwb3J0ID0gMDsKKwl9IGVsc2UgeworCQltZ3AtPmZ3X211bHRpY2FzdF9zdXBwb3J0ID0gMTsKKwl9CiAJaWYgKHN0YXR1cykgewogCQlwcmludGsoS0VSTl9FUlIgIm15cmkxMGdlOiAlczogQ291bGRuJ3Qgc2V0IHN0YXRzIERNQVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSk7CkBAIC0xODQxLDcgKzE4OTYsOCBAQAogCWlmIChjbnQgPiAwKSB7CiAJCS8qIHBhZCBpdCB0byA2NCBieXRlcy4gIFRoZSBzcmMgaXMgNjQgYnl0ZXMgYmlnZ2VyIHRoYW4gaXQKIAkJICogbmVlZHMgdG8gYmUgc28gdGhhdCB3ZSBkb24ndCBvdmVycnVuIGl0ICovCi0JCW15cmkxMGdlX3Bpb19jb3B5KHR4LT53Y19maWZvICsgKGNudCA8PCAxOCksIHNyYywgNjQpOworCQlteXJpMTBnZV9waW9fY29weSh0eC0+d2NfZmlmbyArIE1YR0VGV19FVEhfU0VORF9PRkZTRVQoY250KSwKKwkJCQkgIHNyYywgNjQpOwogCQltYigpOwogCX0KIH0KQEAgLTIxNDAsOSArMjE5Niw4MSBAQAogCiBzdGF0aWMgdm9pZCBteXJpMTBnZV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgbXlyaTEwZ2VfY21kIGNtZDsKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdDsKKwlpbnQgZXJyOworCisJbWdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkvKiBjYW4gYmUgY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHRzLAogCSAqIHBhc3MgMSB0byBmb3JjZSBhdG9taWNpdHkgaW4gbXlyaTEwZ2Vfc2VuZF9jbWQoKSAqLwotCW15cmkxMGdlX2NoYW5nZV9wcm9taXNjKG5ldGRldl9wcml2KGRldiksIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQywgMSk7CisJbXlyaTEwZ2VfY2hhbmdlX3Byb21pc2MobWdwLCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MsIDEpOworCisJLyogVGhpcyBmaXJtd2FyZSBpcyBrbm93biB0byBub3Qgc3VwcG9ydCBtdWx0aWNhc3QgKi8KKwlpZiAoIW1ncC0+ZndfbXVsdGljYXN0X3N1cHBvcnQpCisJCXJldHVybjsKKworCS8qIERpc2FibGUgbXVsdGljYXN0IGZpbHRlcmluZyAqLworCisJZXJyID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLCBNWEdFRldfRU5BQkxFX0FMTE1VTFRJLCAmY21kLCAxKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJteXJpMTBnZTogJXM6IEZhaWxlZCBNWEdFRldfRU5BQkxFX0FMTE1VTFRJLCIKKwkJICAgICAgICIgZXJyb3Igc3RhdHVzOiAlZFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGFib3J0OworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIHJlcXVlc3QgdG8gZGlzYWJsZSBtdWx0aWNhc3QgZmlsdGVyaW5nLCBzbyBxdWl0IGhlcmUgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIEZsdXNoIHRoZSBmaWx0ZXJzICovCisKKwllcnIgPSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19MRUFWRV9BTExfTVVMVElDQVNUX0dST1VQUywKKwkJCQkmY21kLCAxKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAibXlyaTEwZ2U6ICVzOiBGYWlsZWQgTVhHRUZXX0xFQVZFX0FMTF9NVUxUSUNBU1RfR1JPVVBTIgorCQkgICAgICAgIiwgZXJyb3Igc3RhdHVzOiAlZFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGFib3J0OworCX0KKworCS8qIFdhbGsgdGhlIG11bHRpY2FzdCBsaXN0LCBhbmQgYWRkIGVhY2ggYWRkcmVzcyAqLworCWZvciAobWNfbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNfbGlzdCAhPSBOVUxMOyBtY19saXN0ID0gbWNfbGlzdC0+bmV4dCkgeworCQltZW1jcHkoJmNtZC5kYXRhMCwgJm1jX2xpc3QtPmRtaV9hZGRyLCA0KTsKKwkJbWVtY3B5KCZjbWQuZGF0YTEsICgoY2hhciAqKSZtY19saXN0LT5kbWlfYWRkcikgKyA0LCAyKTsKKwkJY21kLmRhdGEwID0gaHRvbmwoY21kLmRhdGEwKTsKKwkJY21kLmRhdGExID0gaHRvbmwoY21kLmRhdGExKTsKKwkJZXJyID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLCBNWEdFRldfSk9JTl9NVUxUSUNBU1RfR1JPVVAsCisJCQkJCSZjbWQsIDEpOworCisJCWlmIChlcnIgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJteXJpMTBnZTogJXM6IEZhaWxlZCAiCisJCQkgICAgICAgIk1YR0VGV19KT0lOX01VTFRJQ0FTVF9HUk9VUCwgZXJyb3Igc3RhdHVzOiIKKwkJCSAgICAgICAiJWRcdCIsIGRldi0+bmFtZSwgZXJyKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiTUFDICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgICgodW5zaWduZWQgY2hhciAqKSZtY19saXN0LT5kbWlfYWRkcilbMF0sCisJCQkgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJm1jX2xpc3QtPmRtaV9hZGRyKVsxXSwKKwkJCSAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmbWNfbGlzdC0+ZG1pX2FkZHIpWzJdLAorCQkJICAgICAgICgodW5zaWduZWQgY2hhciAqKSZtY19saXN0LT5kbWlfYWRkcilbM10sCisJCQkgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJm1jX2xpc3QtPmRtaV9hZGRyKVs0XSwKKwkJCSAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmbWNfbGlzdC0+ZG1pX2FkZHIpWzVdCisJCQkgICAgKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwl9CisJLyogRW5hYmxlIG11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KKwllcnIgPSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19ESVNBQkxFX0FMTE1VTFRJLCAmY21kLCAxKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJteXJpMTBnZTogJXM6IEZhaWxlZCBNWEdFRldfRElTQUJMRV9BTExNVUxUSSwiCisJCSAgICAgICAiZXJyb3Igc3RhdHVzOiAlZFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGFib3J0OworCX0KKworCXJldHVybjsKKworYWJvcnQ6CisJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IG15cmkxMGdlX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQpAQCAtMjI4OSw2ICsyNDE3LDggQEAKICAqLwogCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSFQyMDAwX1BDSUUJMHgwMTMyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRTUwMDBfUENJRTIzIDB4MjVmNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0U1MDAwX1BDSUU0NyAweDI1ZmEKIAogc3RhdGljIHZvaWQgbXlyaTEwZ2Vfc2VsZWN0X2Zpcm13YXJlKHN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3ApCiB7CkBAIC0yMjk4LDE1ICsyNDI4LDM0IEBACiAJbWdwLT5md19uYW1lID0gbXlyaTEwZ2VfZndfdW5hbGlnbmVkOwogCiAJaWYgKG15cmkxMGdlX2ZvcmNlX2Zpcm13YXJlID09IDApIHsKKwkJaW50IGxpbmtfd2lkdGgsIGV4cF9jYXA7CisJCXUxNiBsbms7CisKKwkJZXhwX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkobWdwLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKG1ncC0+cGRldiwgZXhwX2NhcCArIFBDSV9FWFBfTE5LU1RBLCAmbG5rKTsKKwkJbGlua193aWR0aCA9IChsbmsgPj4gNCkgJiAweDNmOworCiAJCW15cmkxMGdlX2VuYWJsZV9lY3JjKG1ncCk7CiAKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1cHN0cmVhbSBicmlkZ2UgaXMga25vd24gdG8KLQkJICogcHJvdmlkZSBhbGlnbmVkIGNvbXBsZXRpb25zICovCi0JCWlmIChicmlkZ2UKLQkJICAgIC8qIFNlcnZlcldvcmtzIEhUMjAwMC9IVDEwMDAgKi8KLQkJICAgICYmIGJyaWRnZS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MKLQkJICAgICYmIGJyaWRnZS0+ZGV2aWNlID09Ci0JCSAgICBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMjAwMF9QQ0lFKSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiBMaW5rIGlzIGxlc3MgdGhhbiA4IG9yIGlmIHRoZQorCQkgKiB1cHN0cmVhbSBicmlkZ2UgaXMga25vd24gdG8gcHJvdmlkZSBhbGlnbmVkCisJCSAqIGNvbXBsZXRpb25zICovCisJCWlmIChsaW5rX3dpZHRoIDwgOCkgeworCQkJZGV2X2luZm8oJm1ncC0+cGRldi0+ZGV2LCAiUENJRSB4JWQgTGlua1xuIiwKKwkJCQkgbGlua193aWR0aCk7CisJCQltZ3AtPnR4LmJvdW5kYXJ5ID0gNDA5NjsKKwkJCW1ncC0+ZndfbmFtZSA9IG15cmkxMGdlX2Z3X2FsaWduZWQ7CisJCX0gZWxzZSBpZiAoYnJpZGdlICYmCisJCQkgICAvKiBTZXJ2ZXJXb3JrcyBIVDIwMDAvSFQxMDAwICovCisJCQkgICAoKGJyaWRnZS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MKKwkJCSAgICAgJiYgYnJpZGdlLT5kZXZpY2UgPT0KKwkJCSAgICAgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDIwMDBfUENJRSkKKwkJCSAgICAvKiBBbGwgSW50ZWwgRTUwMDAgUENJRSBwb3J0cyAqLworCQkJICAgIHx8IChicmlkZ2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMCisJCQkJJiYgYnJpZGdlLT5kZXZpY2UgPj0KKwkJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0U1MDAwX1BDSUUyMworCQkJCSYmIGJyaWRnZS0+ZGV2aWNlIDw9CisJCQkJUENJX0RFVklDRV9JRF9JTlRFTF9FNTAwMF9QQ0lFNDcpKSkgewogCQkJZGV2X2luZm8oJm1ncC0+cGRldi0+ZGV2LAogCQkJCSAiQXNzdW1pbmcgYWxpZ25lZCBjb21wbGV0aW9ucyAoMHgleDoweCV4KVxuIiwKIAkJCQkgYnJpZGdlLT52ZW5kb3IsIGJyaWRnZS0+ZGV2aWNlKTsKQEAgLTI1ODEsNiArMjczMCw3IEBACiAJbWdwLT5jc3VtX2ZsYWcgPSBNWEdFRldfRkxBR1NfQ0tTVU07CiAJbWdwLT5wYXVzZSA9IG15cmkxMGdlX2Zsb3dfY29udHJvbDsKIAltZ3AtPmludHJfY29hbF9kZWxheSA9IG15cmkxMGdlX2ludHJfY29hbF9kZWxheTsKKwltZ3AtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChteXJpMTBnZV9kZWJ1ZywgTVlSSTEwR0VfTVNHX0RFRkFVTFQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1ncC0+ZG93bl93cSk7CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlX21jcC5oIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKaW5kZXggMGE2Y2FlNi4uOTUxOWFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKQEAgLTkxLDcgKzkxLDE5IEBACiAKIC8qIENvbW1hbmRzICovCiAKLSNkZWZpbmUgTVhHRUZXX0NNRF9PRkZTRVQgMHhmODAwMDAKKyNkZWZpbmUJTVhHRUZXX0JPT1RfSEFORE9GRgkweGZjMDAwMAorI2RlZmluZQlNWEdFRldfQk9PVF9EVU1NWV9SRE1BCTB4ZmMwMWMwCisKKyNkZWZpbmUJTVhHRUZXX0VUSF9DTUQJCTB4ZjgwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF80CTB4MjAwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF8xCTB4MjQwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF8yCTB4MjgwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF8zCTB4MmMwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfUkVDVl9TTUFMTAkweDMwMDAwMAorI2RlZmluZQlNWEdFRldfRVRIX1JFQ1ZfQklHCTB4MzQwMDAwCisKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EKG4pCQkoMHgyMDAwMDAgKyAoKChuKSAmIDB4MDMpICogMHg0MDAwMCkpCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF9PRkZTRVQobikJKE1YR0VGV19FVEhfU0VORChuKSAtIE1YR0VGV19FVEhfU0VORF80KQogCiBlbnVtIG15cmkxMGdlX21jcF9jbWRfdHlwZSB7CiAJTVhHRUZXX0NNRF9OT05FID0gMCwKQEAgLTE1NCw3ICsxNjYsNyBAQAogCU1YR0VGV19DTURfU0VUX01UVSwKIAlNWEdFRldfQ01EX0dFVF9JTlRSX0NPQUxfREVMQVlfT0ZGU0VULAkvKiBpbiBtaWNyb3NlY29uZHMgKi8KIAlNWEdFRldfQ01EX1NFVF9TVEFUU19JTlRFUlZBTCwJLyogaW4gbWljcm9zZWNvbmRzICovCi0JTVhHRUZXX0NNRF9TRVRfU1RBVFNfRE1BLAorCU1YR0VGV19DTURfU0VUX1NUQVRTX0RNQV9PQlNPTEVURSwJLyogcmVwbGFjZWQgYnkgU0VUX1NUQVRTX0RNQV9WMiAqLwogCiAJTVhHRUZXX0VOQUJMRV9QUk9NSVNDLAogCU1YR0VGV19ESVNBQkxFX1BST01JU0MsCkBAIC0xNjgsNyArMTgwLDI2IEBACiAJICogZGF0YTIgICAgICAgPSBSRE1BIGxlbmd0aCAoTVNIKSwgV0RNQSBsZW5ndGggKExTSCkKIAkgKiBjb21tYW5kIHJldHVybiBkYXRhID0gcmVwZXRpdGlvbnMgKE1TSCksIDAuNS1tcyB0aWNrcyAoTFNIKQogCSAqLwotCU1YR0VGV19ETUFfVEVTVAorCU1YR0VGV19ETUFfVEVTVCwKKworCU1YR0VGV19FTkFCTEVfQUxMTVVMVEksCisJTVhHRUZXX0RJU0FCTEVfQUxMTVVMVEksCisKKwkvKiByZXR1cm5zIE1YR0VGV19DTURfRVJST1JfTVVMVElDQVNUCisJICogaWYgdGhlcmUgaXMgbm8gcm9vbSBpbiB0aGUgY2FjaGUKKwkgKiBkYXRhMCxNU0goZGF0YTEpID0gbXVsdGljYXN0IGdyb3VwIGFkZHJlc3MgKi8KKwlNWEdFRldfSk9JTl9NVUxUSUNBU1RfR1JPVVAsCisJLyogcmV0dXJucyBNWEdFRldfQ01EX0VSUk9SX01VTFRJQ0FTVAorCSAqIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUgY2FjaGUsCisJICogb3IgaXMgZXF1YWwgdG8gRkYtRkYtRkYtRkYtRkYtRkYKKwkgKiBkYXRhMCxNU0goZGF0YTEpID0gbXVsdGljYXN0IGdyb3VwIGFkZHJlc3MgKi8KKwlNWEdFRldfTEVBVkVfTVVMVElDQVNUX0dST1VQLAorCU1YR0VGV19MRUFWRV9BTExfTVVMVElDQVNUX0dST1VQUywKKworCU1YR0VGV19DTURfU0VUX1NUQVRTX0RNQV9WMiwKKwkvKiBkYXRhMCwgZGF0YTEgPSBidXMgYWRkciwKKwkgKiBkYXRhMiA9IHNpemVvZihzdHJ1Y3QgbWNwX2lycV9kYXRhKSBmcm9tIGRyaXZlciBwb2ludCBvZiB2aWV3LCBhbGxvd3MKKwkgKiBhZGRpbmcgbmV3IHN0dWZmIHRvIG1jcF9pcnFfZGF0YSB3aXRob3V0IGNoYW5naW5nIHRoZSBBQkkgKi8KIH07CiAKIGVudW0gbXlyaTEwZ2VfbWNwX2NtZF9zdGF0dXMgewpAQCAtMTgwLDExICsyMTEsMTcgQEAKIAlNWEdFRldfQ01EX0VSUk9SX0NMT1NFRCwKIAlNWEdFRldfQ01EX0VSUk9SX0hBU0hfRVJST1IsCiAJTVhHRUZXX0NNRF9FUlJPUl9CQURfUE9SVCwKLQlNWEdFRldfQ01EX0VSUk9SX1JFU09VUkNFUworCU1YR0VGV19DTURfRVJST1JfUkVTT1VSQ0VTLAorCU1YR0VGV19DTURfRVJST1JfTVVMVElDQVNUCiB9OwogCi0vKiA0MCBCeXRlcyAqLworI2RlZmluZSBNWEdFRldfT0xEX0lSUV9EQVRBX0xFTiA0MAorCiBzdHJ1Y3QgbWNwX2lycV9kYXRhIHsKKwkvKiBhZGQgbmV3IGNvdW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgKi8KKwl1MzIgZnV0dXJlX3VzZVs1XTsKKwl1MzIgZHJvcHBlZF9tdWx0aWNhc3RfZmlsdGVyZWQ7CisJLyogNDAgQnl0ZXMgKi8KIAl1MzIgc2VuZF9kb25lX2NvdW50OwogCiAJdTMyIGxpbmtfdXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggZGIwNDc1YS4uOTUxMDAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMzI0Niw3ICszMjQ2LDcgQEAKIAlwcmludGsodmVyc2lvbik7CiAjZW5kaWYKIAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuYXRzZW1pX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5hdHNlbWlfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG5hdHNlbWlfZXhpdF9tb2QgKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwppbmRleCAzNGJkYmE5Li42NTRiNDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L25lMmstcGNpLmMKQEAgLTcwMiw3ICs3MDIsNyBAQAogI2lmZGVmIE1PRFVMRQogCXByaW50ayh2ZXJzaW9uKTsKICNlbmRpZgotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuZTJrX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5lMmtfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4LWV0aC5jIGIvZHJpdmVycy9uZXQvbmV0eC1ldGguYwppbmRleCBiMTMxMWFlLi4zMGVkOWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IDBlNzY4NTkuLjBkZWRkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTIxNzgsNyArMjE3OCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBuczgzODIwX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJuczgzODIwLmM6IE5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4MzgyMCAxMC8xMDAvMTAwMCBkcml2ZXIuXG4iKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbnM4MzgyMF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYyBiL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCmluZGV4IGUwZTI5MzkuLmU2MzQ3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCkBAIC0xOTYzLDcgKzE5NjMsNyBAQAogI2lmZGVmIE1PRFVMRQogCXByaW50ayh2ZXJzaW9uKTsKICNlbmRpZgotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuZXRkcnZfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5ldGRydl9wY2lfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCmluZGV4IDI5N2U5ZjguLmM1NGY2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCkBAIC03NzEsNiArNzcxLDcgQEAKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwOSksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDExMDYpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4OGEwMSwgMHhjMWFiKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyMWIsIDB4MDIwMiksIAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbWJpQ29tLEluYy4iLCAiRmFzdCBFdGhlcm5ldCBQQyBDYXJkKEFNQjgxMTApIiwgMHg0OWIwMjBhNywgMHgxMTljYzlmYyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTI0KCJGYXN0IEV0aGVybmV0IiwgIjE2LWJpdCBQQyBDYXJkIiwgIkFYODgxOTAiLCAweGI0YmUxNGUzLCAweDlhMTJlYjZhLCAweGFiOWJlNWVmKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNJWCIsICJBWDg4MTkwIiwgMHgwOTU5ODIzYiwgMHhhYjliZTVlZiksCkBAIC03ODYsOCArNzg3LDYgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkZhc3RFdGhlckNhcmQiLCAweDI4MWYxYzVkLCAweDdlZjI2MTE2KSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkZFUDUwMSIsIDB4MjgxZjFjNWQsIDB4MmUyNzIwNTgpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDE0KCJOZXR3b3JrIEV2ZXJ5d2hlcmUiLCAiQVg4ODE5MCIsIDB4ODIwYTY3YjYsICAweGFiOWJlNWVmKSwKLQkvKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyBlbm91Z2ggKi8KLQkvKiBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyMWIsIDB4MDIwMiksICovCiAJUENNQ0lBX0RFVklDRV9OVUxMLAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBheG5ldF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwppbmRleCAwZWNlYmZjLi5jYzBkY2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwpAQCAtNjU0LDExICs2NTQsOCBAQAogICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOwogCiAgICAgaWYgKGluZm8tPmZsYWdzICYgKElTX0RMMTAwMTl8SVNfREwxMDAyMikpIHsKLQl1X2NoYXIgaWQgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAweDFhKTsKIAlkZXYtPmRvX2lvY3RsID0gJmVpX2lvY3RsOwogCW1paV9waHlfcHJvYmUoZGV2KTsKLQlpZiAoKGlkID09IDB4MzApICYmICFpbmZvLT5wbmFfcGh5ICYmIChpbmZvLT5ldGhfcGh5ID09IDQpKQotCSAgICBpbmZvLT5ldGhfcGh5ID0gMDsKICAgICB9CiAKICAgICBsaW5rLT5kZXZfbm9kZSA9ICZpbmZvLT5ub2RlOwpAQCAtODIxLDE1ICs4MTgsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgbWRpb19yZXNldChraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQpCi17Ci0gICAgb3V0Yl9wKDB4MDgsIGFkZHIpOwotICAgIG91dGJfcCgweDBjLCBhZGRyKTsKLSAgICBvdXRiX3AoMHgwOCwgYWRkcik7Ci0gICAgb3V0Yl9wKDB4MGMsIGFkZHIpOwotICAgIG91dGJfcCgweDAwLCBhZGRyKTsKLX0KLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICBFRVBST00gYWNjZXNzIHJvdXRpbmVzIGZvciBETDEwMDE5IGFuZCBETDEwMDIyIGJhc2VkIGNhcmRzCkBAIC05NDIsNyArOTMwLDggQEAKICAgICB9CiAgICAgaWYgKGluZm8tPmZsYWdzICYgSVNfREwxMDAyMikgewogCWlmIChpbmZvLT5mbGFncyAmIEhBU19NSUkpIHsKLQkgICAgbWRpb19yZXNldChuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHkpOworCSAgICAvKiBBZHZlcnRpc2UgMTAwRiwgMTAwSCwgMTBGLCAxMEggKi8KKwkgICAgbWRpb193cml0ZShuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHksIDQsIDB4MDFlMSk7CiAJICAgIC8qIFJlc3RhcnQgTUlJIGF1dG9uZWdvdGlhdGlvbiAqLwogCSAgICBtZGlvX3dyaXRlKG5pY19iYXNlICsgRExJTktfR1BJTywgaW5mby0+ZXRoX3BoeSwgMCwgMHgwMDAwKTsKIAkgICAgbWRpb193cml0ZShuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHksIDAsIDB4MTIwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY25ldDMyLmMgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKaW5kZXggZDUwYmNiOC4uNWUyNmZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpAQCAtMjk3OCw3ICsyOTc4LDcgQEAKIAkJdHhfc3RhcnQgPSB0eF9zdGFydF9wdDsKIAogCS8qIGZpbmQgdGhlIFBDSSBkZXZpY2VzICovCi0JaWYgKCFwY2lfbW9kdWxlX2luaXQoJnBjbmV0MzJfZHJpdmVyKSkKKwlpZiAoIXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjbmV0MzJfZHJpdmVyKSkKIAkJcGNuZXQzMl9oYXZlX3BjaSA9IDE7CiAKIAkvKiBzaG91bGQgd2UgZmluZCBhbnkgcmVtYWluaW5nIFZMYnVzIGRldmljZXMgPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3Ntc2MuYyBiL2RyaXZlcnMvbmV0L3BoeS9zbXNjLmMKaW5kZXggMjVlMzFmYi4uYjFkOGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3Ntc2MuYworKysgYi9kcml2ZXJzL25ldC9waHkvc21zYy5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMgYi9kcml2ZXJzL25ldC9waHkvdml0ZXNzZS5jCmluZGV4IGZmZDIxNWQuLjc5MjcxNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYwpAQCAtMTIsNyArMTIsNiBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGEzeHh4LmMgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyOWFlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwpAQCAtMCwwICsxLDM1MzcgQEAKKy8qCisgKiBRTG9naWMgUUxBM3h4eCBOSUMgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA2IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTN4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlICJxbGEzeHh4LmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIAkicWxhM3h4eCIKKyNkZWZpbmUgRFJWX1NUUklORyAJIlFMb2dpYyBJU1AzWFhYIE5ldHdvcmsgRHJpdmVyIgorI2RlZmluZSBEUlZfVkVSU0lPTgkidjIuMDIuMDAtazM2IgorI2RlZmluZSBQRlgJCURSVl9OQU1FICIgIgorCitzdGF0aWMgY29uc3QgY2hhciBxbDN4eHhfZHJpdmVyX25hbWVbXSA9IERSVl9OQU1FOworc3RhdGljIGNvbnN0IGNoYXIgcWwzeHh4X2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBJU1AzWFhYIE5ldHdvcmsgRHJpdmVyICIgRFJWX1ZFUlNJT04gIiAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X21zZworICAgID0gTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LCisgICAgfCBORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19JRkRPV047CisKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsJCS8qIGRlZmF1bHRzIGFib3ZlICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworCitzdGF0aWMgaW50IG1zaTsKK21vZHVsZV9wYXJhbShtc2ksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zaSwgIlR1cm4gb24gTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzLiIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcWwzeHh4X3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBRTDMwMjJfREVWSUNFX0lEKX0sCisJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLworCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbDN4eHhfcGNpX3RibCk7CisKKy8qCisgKiBDYWxsZXIgbXVzdCB0YWtlIGh3X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgcWxfc2VtX3NwaW5sb2NrKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwKKwkJCSAgICB1MzIgc2VtX21hc2ssIHUzMiBzZW1fYml0cykKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kcyA9IDM7CisKKwlkbyB7CisJCXdyaXRlbCgoc2VtX21hc2sgfCBzZW1fYml0cyksCisJCSAgICAgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlbWFwaG9yZVJlZyk7CisJCXZhbHVlID0gcmVhZGwoJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZW1hcGhvcmVSZWcpOworCQlpZiAoKHZhbHVlICYgKHNlbV9tYXNrID4+IDE2KSkgPT0gc2VtX2JpdHMpCisJCQlyZXR1cm4gMDsKKwkJc3NsZWVwKDEpOworCX0gd2hpbGUoLS1zZWNvbmRzKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3NlbV91bmxvY2soc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgc2VtX21hc2spCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl3cml0ZWwoc2VtX21hc2ssICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VtYXBob3JlUmVnKTsKKwlyZWFkbCgmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlbWFwaG9yZVJlZyk7Cit9CisKK3N0YXRpYyBpbnQgcWxfc2VtX2xvY2soc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgc2VtX21hc2ssIHUzMiBzZW1fYml0cykKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiB2YWx1ZTsKKworCXdyaXRlbCgoc2VtX21hc2sgfCBzZW1fYml0cyksICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VtYXBob3JlUmVnKTsKKwl2YWx1ZSA9IHJlYWRsKCZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VtYXBob3JlUmVnKTsKKwlyZXR1cm4gKCh2YWx1ZSAmIChzZW1fbWFzayA+PiAxNikpID09IHNlbV9iaXRzKTsKK30KKworLyoKKyAqIENhbGxlciBob2xkcyBod19sb2NrLgorICovCitzdGF0aWMgaW50IHFsX3dhaXRfZm9yX2RydnJfbG9jayhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFxbF9zZW1fbG9jayhxZGV2LAorCQkJCSBRTF9EUlZSX1NFTV9NQVNLLAorCQkJCSAoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KQorCQkJCSAgKiAyKSA8PCAxKSkgeworCQkJaWYgKGkgPCAxMCkgeworCQkJCXNzbGVlcCgxKTsKKwkJCQlpKys7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgIgorCQkJCSAgICAgICAiZHJpdmVyIGxvY2suLi5cbiIsCisJCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCisJCQkgICAgICAgIiVzOiBkcml2ZXIgbG9jayBhY3F1aXJlZC5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcWxfc2V0X3JlZ2lzdGVyX3BhZ2Uoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgcGFnZSkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJd3JpdGVsKCgoSVNQX0NPTlRST0xfTlBfTUFTSyA8PCAxNikgfCBwYWdlKSwKKwkJCSZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwQ29udHJvbFN0YXR1cyk7CisJcmVhZGwoJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzKTsKKwlxZGV2LT5jdXJyZW50X3BhZ2UgPSBwYWdlOworfQorCitzdGF0aWMgdTMyIHFsX3JlYWRfY29tbW9uX3JlZ19sKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwKKwkJCSAgICAgIHUzMiBfX2lvbWVtICogcmVnKQoreworCXUzMiB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKwl2YWx1ZSA9IHJlYWRsKHJlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdTMyIHFsX3JlYWRfY29tbW9uX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkgICAgICB1MzIgX19pb21lbSAqIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwocmVnKTsKK30KKworc3RhdGljIHUzMiBxbF9yZWFkX3BhZ2UwX3JlZ19sKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIF9faW9tZW0gKnJlZykKK3sKKwl1MzIgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBod19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisKKwlpZiAocWRldi0+Y3VycmVudF9wYWdlICE9IDApCisJCXFsX3NldF9yZWdpc3Rlcl9wYWdlKHFkZXYsMCk7CisJdmFsdWUgPSByZWFkbChyZWcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHUzMiBxbF9yZWFkX3BhZ2UwX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBfX2lvbWVtICpyZWcpCit7CisJaWYgKHFkZXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LDApOworCXJldHVybiByZWFkbChyZWcpOworfQorCitzdGF0aWMgdm9pZCBxbF93cml0ZV9jb21tb25fcmVnX2woc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAorCQkJCXUzMiAqIHJlZywgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCXdyaXRlbCh2YWx1ZSwgKHUzMiAqKSByZWcpOworCXJlYWRsKHJlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcWxfd3JpdGVfY29tbW9uX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkJdTMyICogcmVnLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCAodTMyICopIHJlZyk7CisJcmVhZGwocmVnKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHFsX3dyaXRlX3BhZ2UwX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkgICAgICAgdTMyICogcmVnLCB1MzIgdmFsdWUpCit7CisJaWYgKHFkZXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LDApOworCXdyaXRlbCh2YWx1ZSwgKHUzMiAqKSByZWcpOworCXJlYWRsKHJlZyk7CisJcmV0dXJuOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suIE9ubHkgY2FsbGVkIGR1cmluZyBpbml0LgorICovCitzdGF0aWMgdm9pZCBxbF93cml0ZV9wYWdlMV9yZWcoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAorCQkJICAgICAgIHUzMiAqIHJlZywgdTMyIHZhbHVlKQoreworCWlmIChxZGV2LT5jdXJyZW50X3BhZ2UgIT0gMSkKKwkJcWxfc2V0X3JlZ2lzdGVyX3BhZ2UocWRldiwxKTsKKwl3cml0ZWwodmFsdWUsICh1MzIgKikgcmVnKTsKKwlyZWFkbChyZWcpOworCXJldHVybjsKK30KKworLyoKKyAqIENhbGxlciBob2xkcyBod19sb2NrLiBPbmx5IGNhbGxlZCBkdXJpbmcgaW5pdC4KKyAqLworc3RhdGljIHZvaWQgcWxfd3JpdGVfcGFnZTJfcmVnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwKKwkJCSAgICAgICB1MzIgKiByZWcsIHUzMiB2YWx1ZSkKK3sKKwlpZiAocWRldi0+Y3VycmVudF9wYWdlICE9IDIpCisJCXFsX3NldF9yZWdpc3Rlcl9wYWdlKHFkZXYsMik7CisJd3JpdGVsKHZhbHVlLCAodTMyICopIHJlZyk7CisJcmVhZGwocmVnKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHFsX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKworCXFsX3dyaXRlX2NvbW1vbl9yZWdfbChxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcEludGVycnVwdE1hc2tSZWcsCisJCQkgICAgKElTUF9JTVJfRU5BQkxFX0lOVCA8PCAxNikpOworCit9CisKK3N0YXRpYyB2b2lkIHFsX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJcWxfd3JpdGVfY29tbW9uX3JlZ19sKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwSW50ZXJydXB0TWFza1JlZywKKwkJCSAgICAoKDB4ZmYgPDwgMTYpIHwgSVNQX0lNUl9FTkFCTEVfSU5UKSk7CisKK30KKworc3RhdGljIHZvaWQgcWxfcmVsZWFzZV90b19scmdfYnVmX2ZyZWVfbGlzdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkJCSAgICBzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYikKK3sKKwl1NjQgbWFwOworCWxyZ19idWZfY2ItPm5leHQgPSBOVUxMOworCisJaWYgKHFkZXYtPmxyZ19idWZfZnJlZV90YWlsID09IE5VTEwpIHsJLyogVGhlIGxpc3QgaXMgZW1wdHkgICovCisJCXFkZXYtPmxyZ19idWZfZnJlZV9oZWFkID0gcWRldi0+bHJnX2J1Zl9mcmVlX3RhaWwgPSBscmdfYnVmX2NiOworCX0gZWxzZSB7CisJCXFkZXYtPmxyZ19idWZfZnJlZV90YWlsLT5uZXh0ID0gbHJnX2J1Zl9jYjsKKwkJcWRldi0+bHJnX2J1Zl9mcmVlX3RhaWwgPSBscmdfYnVmX2NiOworCX0KKworCWlmICghbHJnX2J1Zl9jYi0+c2tiKSB7CisJCWxyZ19idWZfY2ItPnNrYiA9IGRldl9hbGxvY19za2IocWRldi0+bHJnX2J1ZmZlcl9sZW4pOworCQlpZiAodW5saWtlbHkoIWxyZ19idWZfY2ItPnNrYikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBmYWlsZWQgZGV2X2FsbG9jX3NrYigpLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJCXFkZXYtPmxyZ19idWZfc2tiX2NoZWNrKys7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2Ugc2F2ZSBzb21lIHNwYWNlIHRvIGNvcHkgdGhlIGV0aGhkciBmcm9tIGZpcnN0CisJCQkgKiBidWZmZXIKKwkJCSAqLworCQkJc2tiX3Jlc2VydmUobHJnX2J1Zl9jYi0+c2tiLCBRTF9IRUFERVJfU1BBQ0UpOworCQkJbWFwID0gcGNpX21hcF9zaW5nbGUocWRldi0+cGRldiwKKwkJCQkJICAgICBscmdfYnVmX2NiLT5za2ItPmRhdGEsCisJCQkJCSAgICAgcWRldi0+bHJnX2J1ZmZlcl9sZW4gLQorCQkJCQkgICAgIFFMX0hFQURFUl9TUEFDRSwKKwkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2xvdyA9CisJCQkgICAgY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2hpZ2ggPQorCQkJICAgIGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChscmdfYnVmX2NiLCBtYXBhZGRyLCBtYXApOworCQkJcGNpX3VubWFwX2xlbl9zZXQobHJnX2J1Zl9jYiwgbWFwbGVuLAorCQkJCQkgIHFkZXYtPmxyZ19idWZmZXJfbGVuIC0KKwkJCQkJICBRTF9IRUFERVJfU1BBQ0UpOworCQl9CisJfQorCisJcWRldi0+bHJnX2J1Zl9mcmVlX2NvdW50Kys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqcWxfZ2V0X2Zyb21fbHJnX2J1Zl9mcmVlX2xpc3Qoc3RydWN0IHFsM19hZGFwdGVyCisJCQkJCQkJICAgKnFkZXYpCit7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2I7CisKKwlpZiAoKGxyZ19idWZfY2IgPSBxZGV2LT5scmdfYnVmX2ZyZWVfaGVhZCkgIT0gTlVMTCkgeworCQlpZiAoKHFkZXYtPmxyZ19idWZfZnJlZV9oZWFkID0gbHJnX2J1Zl9jYi0+bmV4dCkgPT0gTlVMTCkKKwkJCXFkZXYtPmxyZ19idWZfZnJlZV90YWlsID0gTlVMTDsKKwkJcWRldi0+bHJnX2J1Zl9mcmVlX2NvdW50LS07CisJfQorCisJcmV0dXJuIGxyZ19idWZfY2I7Cit9CisKK3N0YXRpYyB1MzIgYWRkckJpdHMgPSBFRVBST01fTk9fQUREUl9CSVRTOworc3RhdGljIHUzMiBkYXRhQml0cyA9IEVFUFJPTV9OT19EQVRBX0JJVFM7CisKK3N0YXRpYyB2b2lkIGZtOTNjNTZhX2Rlc2VsZWN0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldik7CitzdGF0aWMgdm9pZCBlZXByb21fcmVhZHdvcmQoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgZWVwcm9tQWRkciwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpOworCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGZtOTNjNTZhX3NlbGVjdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJcWRldi0+ZWVwcm9tX2NtZF9kYXRhID0gQVVCVVJOX0VFUFJPTV9DU18xOworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhKTsKKwlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwkJCSAgICAoKElTUF9OVlJBTV9NQVNLIDw8IDE2KSB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSkpOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGZtOTNjNTZhX2NtZChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBjbWQsIHUzMiBlZXByb21BZGRyKQoreworCWludCBpOworCXUzMiBtYXNrOworCXUzMiBkYXRhQml0OworCXUzMiBwcmV2aW91c0JpdDsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwkvKiBDbG9jayBpbiBhIHplcm8sIHRoZW4gZG8gdGhlIHN0YXJ0IGJpdCAqLworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCSAgICBBVUJVUk5fRUVQUk9NX0RPXzEpOworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+CisJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgQVVCVVJOX0VFUFJPTV9ET18xIHwKKwkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19SSVNFKTsKKwlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwkJCSAgICBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPgorCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IEFVQlVSTl9FRVBST01fRE9fMSB8CisJCQkgICAgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTCk7CisKKwltYXNrID0gMSA8PCAoRk05M0M1NkFfQ01EX0JJVFMgLSAxKTsKKwkvKiBGb3JjZSB0aGUgcHJldmlvdXMgZGF0YSBiaXQgdG8gYmUgZGlmZmVyZW50ICovCisJcHJldmlvdXNCaXQgPSAweGZmZmY7CisJZm9yIChpID0gMDsgaSA8IEZNOTNDNTZBX0NNRF9CSVRTOyBpKyspIHsKKwkJZGF0YUJpdCA9CisJCSAgICAoY21kICYgbWFzaykgPyBBVUJVUk5fRUVQUk9NX0RPXzEgOiBBVUJVUk5fRUVQUk9NX0RPXzA7CisJCWlmIChwcmV2aW91c0JpdCAhPSBkYXRhQml0KSB7CisJCQkvKgorCQkJICogSWYgdGhlIGJpdCBjaGFuZ2VkLCB0aGVuIGNoYW5nZSB0aGUgRE8gc3RhdGUgdG8KKwkJCSAqIG1hdGNoCisJCQkgKi8KKwkJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJCSAgICBzZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KKwkJCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQpOworCQkJcHJldmlvdXNCaXQgPSBkYXRhQml0OworCQl9CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KKwkJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8CisJCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpOworCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCisJCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+CisJCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAorCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKKwkJY21kID0gY21kIDw8IDE7CisJfQorCisJbWFzayA9IDEgPDwgKGFkZHJCaXRzIC0gMSk7CisJLyogRm9yY2UgdGhlIHByZXZpb3VzIGRhdGEgYml0IHRvIGJlIGRpZmZlcmVudCAqLworCXByZXZpb3VzQml0ID0gMHhmZmZmOworCWZvciAoaSA9IDA7IGkgPCBhZGRyQml0czsgaSsrKSB7CisJCWRhdGFCaXQgPQorCQkgICAgKGVlcHJvbUFkZHIgJiBtYXNrKSA/IEFVQlVSTl9FRVBST01fRE9fMSA6CisJCSAgICBBVUJVUk5fRUVQUk9NX0RPXzA7CisJCWlmIChwcmV2aW91c0JpdCAhPSBkYXRhQml0KSB7CisJCQkvKgorCQkJICogSWYgdGhlIGJpdCBjaGFuZ2VkLCB0aGVuIGNoYW5nZSB0aGUgRE8gc3RhdGUgdG8KKwkJCSAqIG1hdGNoCisJCQkgKi8KKwkJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJCSAgICBzZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KKwkJCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQpOworCQkJcHJldmlvdXNCaXQgPSBkYXRhQml0OworCQl9CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KKwkJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8CisJCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpOworCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCisJCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+CisJCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAorCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKKwkJZWVwcm9tQWRkciA9IGVlcHJvbUFkZHIgPDwgMTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZXIgaG9sZHMgaHdfbG9jay4KKyAqLworc3RhdGljIHZvaWQgZm05M2M1NmFfZGVzZWxlY3Qoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlxZGV2LT5lZXByb21fY21kX2RhdGEgPSBBVUJVUk5fRUVQUk9NX0NTXzA7CisJcWxfd3JpdGVfY29tbW9uX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCisJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEpOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGZtOTNjNTZhX2RhdGFpbihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKK3sKKwlpbnQgaTsKKwl1MzIgZGF0YSA9IDA7CisJdTMyIGRhdGFCaXQ7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJLyogUmVhZCB0aGUgZGF0YSBiaXRzICovCisJLyogVGhlIGZpcnN0IGJpdCBpcyBhIGR1bW15LiAgQ2xvY2sgcmlnaHQgb3ZlciBpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YUJpdHM7IGkrKykgeworCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCisJCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCQkgICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSk7CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEgfAorCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKKwkJZGF0YUJpdCA9CisJCSAgICAocWxfcmVhZF9jb21tb25fcmVnCisJCSAgICAgKHFkZXYsCisJCSAgICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCSAgICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcpICYgQVVCVVJOX0VFUFJPTV9ESV8xKSA/IDEgOiAwOworCQlkYXRhID0gKGRhdGEgPDwgMSkgfCBkYXRhQml0OworCX0KKwkqdmFsdWUgPSAodTE2KSBkYXRhOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGVlcHJvbV9yZWFkd29yZChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkgICAgdTMyIGVlcHJvbUFkZHIsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKK3sKKwlmbTkzYzU2YV9zZWxlY3QocWRldik7CisJZm05M2M1NmFfY21kKHFkZXYsIChpbnQpRk05M0M1NkFfUkVBRCwgZWVwcm9tQWRkcik7CisJZm05M2M1NmFfZGF0YWluKHFkZXYsIHZhbHVlKTsKKwlmbTkzYzU2YV9kZXNlbGVjdChxZGV2KTsKK30KKworc3RhdGljIHZvaWQgcWxfc3dhcF9tYWNfYWRkcih1OCAqIG1hY0FkZHJlc3MpCit7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTggdGVtcDsKKwl0ZW1wID0gbWFjQWRkcmVzc1swXTsKKwltYWNBZGRyZXNzWzBdID0gbWFjQWRkcmVzc1sxXTsKKwltYWNBZGRyZXNzWzFdID0gdGVtcDsKKwl0ZW1wID0gbWFjQWRkcmVzc1syXTsKKwltYWNBZGRyZXNzWzJdID0gbWFjQWRkcmVzc1szXTsKKwltYWNBZGRyZXNzWzNdID0gdGVtcDsKKwl0ZW1wID0gbWFjQWRkcmVzc1s0XTsKKwltYWNBZGRyZXNzWzRdID0gbWFjQWRkcmVzc1s1XTsKKwltYWNBZGRyZXNzWzVdID0gdGVtcDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHFsX2dldF9udnJhbV9wYXJhbXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXUxNiAqcEVFUFJPTURhdGE7CisJdTE2IGNoZWNrc3VtID0gMDsKKwl1MzIgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBod19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisKKwlwRUVQUk9NRGF0YSA9ICh1MTYgKikgJiBxZGV2LT5udnJhbV9kYXRhOworCXFkZXYtPmVlcHJvbV9jbWRfZGF0YSA9IDA7CisJaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX05WUkFNX1NFTV9NQVNLLAorCQkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgorCQkJIDIpIDw8IDEwKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYIiVzOiBGYWlsZWQgcWxfc2VtX3NwaW5sb2NrKCkuXG4iLAorCQkJX19mdW5jX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBFRVBST01fU0laRTsgaW5kZXgrKykgeworCQllZXByb21fcmVhZHdvcmQocWRldiwgaW5kZXgsIHBFRVBST01EYXRhKTsKKwkJY2hlY2tzdW0gKz0gKnBFRVBST01EYXRhOworCQlwRUVQUk9NRGF0YSsrOworCX0KKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX05WUkFNX1NFTV9NQVNLKTsKKworCWlmIChjaGVja3N1bSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjaGVja3N1bSBzaG91bGQgYmUgemVybywgaXMgJXghIVxuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsIGNoZWNrc3VtKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIGEgcHJvYmxlbSB3aXRoIGVuZGlhbm5lc3MgZm9yIHRoZSBNQUMgYWRkcmVzc2VzCisJICogYW5kIHRoZSB0d28gOC1iaXQgdmFsdWVzIHZlcnNpb24sIGFuZCBudW1Qb3J0cy4gIFdlCisJICogaGF2ZSB0byBzd2FwIHRoZW0gb24gYmlnIGVuZGlhbiBzeXN0ZW1zLgorCSAqLworCXFsX3N3YXBfbWFjX2FkZHIocWRldi0+bnZyYW1fZGF0YS5mdW5jQ2ZnX2ZuMC5tYWNBZGRyZXNzKTsKKwlxbF9zd2FwX21hY19hZGRyKHFkZXYtPm52cmFtX2RhdGEuZnVuY0NmZ19mbjEubWFjQWRkcmVzcyk7CisJcWxfc3dhcF9tYWNfYWRkcihxZGV2LT5udnJhbV9kYXRhLmZ1bmNDZmdfZm4yLm1hY0FkZHJlc3MpOworCXFsX3N3YXBfbWFjX2FkZHIocWRldi0+bnZyYW1fZGF0YS5mdW5jQ2ZnX2ZuMy5tYWNBZGRyZXNzKTsKKwlwRUVQUk9NRGF0YSA9ICh1MTYgKikgJiBxZGV2LT5udnJhbV9kYXRhLnZlcnNpb247CisJKnBFRVBST01EYXRhID0gbGUxNl90b19jcHUoKnBFRVBST01EYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKwlyZXR1cm4gY2hlY2tzdW07Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgUEhZQWRkclsyXSA9IHsKKwlQT1JUMF9QSFlfQUREUkVTUywgUE9SVDFfUEhZX0FERFJFU1MKK307CisKK3N0YXRpYyBpbnQgcWxfd2FpdF9mb3JfbWlpX3JlYWR5KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIHRlbXA7CisJaW50IGNvdW50ID0gMTAwMDsKKworCXdoaWxlIChjb3VudCkgeworCQl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJU3RhdHVzUmVnKTsKKwkJaWYgKCEodGVtcCAmIE1BQ19NSUlfU1RBVFVTX0JTWSkpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEwKTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBxbF9taWlfZW5hYmxlX3NjYW5fbW9kZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiBzY2FuQ29udHJvbDsKKworCWlmIChxZGV2LT5udW1Qb3J0cyA+IDEpIHsKKwkJLyogQXV0byBzY2FuIHdpbGwgY3ljbGUgdGhyb3VnaCBtdWx0aXBsZSBwb3J0cyAqLworCQlzY2FuQ29udHJvbCA9IE1BQ19NSUlfQ09OVFJPTF9BUyB8IE1BQ19NSUlfQ09OVFJPTF9TQzsKKwl9IGVsc2UgeworCQlzY2FuQ29udHJvbCA9IE1BQ19NSUlfQ09OVFJPTF9TQzsKKwl9CisKKwkvKgorCSAqIFNjYW4gcmVnaXN0ZXIgMSBvZiBQSFkvUEVUQkksCisJICogU2V0IHVwIHRvIHNjYW4gYm90aCBkZXZpY2VzCisJICogVGhlIGF1dG9zY2FuIHN0YXJ0cyBmcm9tIHRoZSBmaXJzdCByZWdpc3RlciwgY29tcGxldGVzCisJICogdGhlIGxhc3Qgb25lIGJlZm9yZSByb2xsaW5nIG92ZXIgdG8gdGhlIGZpcnN0CisJICovCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRBZGRyUmVnLAorCQkJICAgUEhZQWRkclswXSB8IE1JSV9TQ0FOX1JFR0lTVEVSKTsKKworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210Q29udHJvbFJlZywKKwkJCSAgIChzY2FuQ29udHJvbCkgfAorCQkJICAgKChNQUNfTUlJX0NPTlRST0xfU0MgfCBNQUNfTUlJX0NPTlRST0xfQVMpIDw8IDE2KSk7Cit9CisKK3N0YXRpYyB1OCBxbF9taWlfZGlzYWJsZV9zY2FuX21vZGUoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXU4IHJldDsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKworCS8qIFNlZSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCBiZWZvcmUgd2UgdHVybiBpdCBvZmYgKi8KKwlpZiAocWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdENvbnRyb2xSZWcpICYKKwkgICAgKE1BQ19NSUlfQ09OVFJPTF9BUyB8IE1BQ19NSUlfQ09OVFJPTF9TQykpIHsKKwkJLyogU2NhbiBpcyBlbmFibGVkICovCisJCXJldCA9IDE7CisJfSBlbHNlIHsKKwkJLyogU2NhbiBpcyBkaXNhYmxlZCAqLworCQlyZXQgPSAwOworCX0KKworCS8qCisJICogV2hlbiBkaXNhYmxpbmcgc2NhbiBtb2RlIHlvdSBtdXN0IGZpcnN0IGNoYW5nZSB0aGUgTUlJIHJlZ2lzdGVyCisJICogYWRkcmVzcworCSAqLworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210QWRkclJlZywKKwkJCSAgIFBIWUFkZHJbMF0gfCBNSUlfU0NBTl9SRUdJU1RFUik7CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdENvbnRyb2xSZWcsCisJCQkgICAoKE1BQ19NSUlfQ09OVFJPTF9TQyB8IE1BQ19NSUlfQ09OVFJPTF9BUyB8CisJCQkgICAgIE1BQ19NSUlfQ09OVFJPTF9SQykgPDwgMTYpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWxfbWlpX3dyaXRlX3JlZ19leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkgICAgICAgdTE2IHJlZ0FkZHIsIHUxNiB2YWx1ZSwgdTMyIG1hY19pbmRleCkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTggc2Nhbldhc0VuYWJsZWQ7CisKKwlzY2FuV2FzRW5hYmxlZCA9IHFsX21paV9kaXNhYmxlX3NjYW5fbW9kZShxZGV2KTsKKworCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKKwkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiJXMgVGltZWQgb3V0IHdhaXRpbmcgZm9yIG1hbmFnZW1lbnQgcG9ydCB0byAiCisJCQkgICAgICAgImdldCBmcmVlIGJlZm9yZSBpc3N1aW5nIGNvbW1hbmQuXG4iLAorCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRBZGRyUmVnLAorCQkJICAgUEhZQWRkclttYWNfaW5kZXhdIHwgcmVnQWRkcik7CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdERhdGFSZWcsIHZhbHVlKTsKKworCS8qIFdhaXQgZm9yIHdyaXRlIHRvIGNvbXBsZXRlIDkvMTAvMDQgU0pQICovCisJaWYgKHFsX3dhaXRfZm9yX21paV9yZWFkeShxZGV2KSkgeworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJICAgICAgICIlczogVGltZWQgb3V0IHdhaXRpbmcgZm9yIG1hbmFnZW1lbnQgcG9ydCB0byIKKwkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2Nhbldhc0VuYWJsZWQpCisJCXFsX21paV9lbmFibGVfc2Nhbl9tb2RlKHFkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfbWlpX3JlYWRfcmVnX2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTE2IHJlZ0FkZHIsCisJCQkgICAgICB1MTYgKiB2YWx1ZSwgdTMyIG1hY19pbmRleCkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTggc2Nhbldhc0VuYWJsZWQ7CisJdTMyIHRlbXA7CisKKwlzY2FuV2FzRW5hYmxlZCA9IHFsX21paV9kaXNhYmxlX3NjYW5fbW9kZShxZGV2KTsKKworCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKKwkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gIgorCQkJICAgICAgICJnZXQgZnJlZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210QWRkclJlZywKKwkJCSAgIFBIWUFkZHJbbWFjX2luZGV4XSB8IHJlZ0FkZHIpOworCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRDb250cm9sUmVnLAorCQkJICAgKE1BQ19NSUlfQ09OVFJPTF9SQyA8PCAxNikpOworCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRDb250cm9sUmVnLAorCQkJICAgKE1BQ19NSUlfQ09OVFJPTF9SQyA8PCAxNikgfCBNQUNfTUlJX0NPTlRST0xfUkMpOworCisJLyogV2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKi8KKwlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKKwkJCSAgICAgICAiZ2V0IGZyZWUgYWZ0ZXIgaXNzdWluZyBjb21tYW5kLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRlbXAgPSBxbF9yZWFkX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210RGF0YVJlZyk7CisJKnZhbHVlID0gKHUxNikgdGVtcDsKKworCWlmIChzY2FuV2FzRW5hYmxlZCkKKwkJcWxfbWlpX2VuYWJsZV9zY2FuX21vZGUocWRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbF9taWlfd3JpdGVfcmVnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTE2IHJlZ0FkZHIsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwlxbF9taWlfZGlzYWJsZV9zY2FuX21vZGUocWRldik7CisKKwlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKKwkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdEFkZHJSZWcsCisJCQkgICBxZGV2LT5QSFlBZGRyIHwgcmVnQWRkcik7CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdERhdGFSZWcsIHZhbHVlKTsKKworCS8qIFdhaXQgZm9yIHdyaXRlIHRvIGNvbXBsZXRlLiAqLworCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKKwkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gIgorCQkJICAgICAgICJnZXQgZnJlZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXFsX21paV9lbmFibGVfc2Nhbl9tb2RlKHFkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfbWlpX3JlYWRfcmVnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTE2IHJlZ0FkZHIsIHUxNiAqdmFsdWUpCit7CisJdTMyIHRlbXA7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJcWxfbWlpX2Rpc2FibGVfc2Nhbl9tb2RlKHFkZXYpOworCisJaWYgKHFsX3dhaXRfZm9yX21paV9yZWFkeShxZGV2KSkgeworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJICAgICAgICIlczogVGltZWQgb3V0IHdhaXRpbmcgZm9yIG1hbmFnZW1lbnQgcG9ydCB0byAiCisJCQkgICAgICAgImdldCBmcmVlIGJlZm9yZSBpc3N1aW5nIGNvbW1hbmQuXG4iLAorCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRBZGRyUmVnLAorCQkJICAgcWRldi0+UEhZQWRkciB8IHJlZ0FkZHIpOworCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRDb250cm9sUmVnLAorCQkJICAgKE1BQ19NSUlfQ09OVFJPTF9SQyA8PCAxNikpOworCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRDb250cm9sUmVnLAorCQkJICAgKE1BQ19NSUlfQ09OVFJPTF9SQyA8PCAxNikgfCBNQUNfTUlJX0NPTlRST0xfUkMpOworCisJLyogV2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKi8KKwlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKKwkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdERhdGFSZWcpOworCSp2YWx1ZSA9ICh1MTYpIHRlbXA7CisKKwlxbF9taWlfZW5hYmxlX3NjYW5fbW9kZShxZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxbF9wZXRiaV9yZXNldChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCBQRVRCSV9DT05UUk9MX1JFRywgUEVUQklfQ1RSTF9TT0ZUX1JFU0VUKTsKK30KKworc3RhdGljIHZvaWQgcWxfcGV0Ymlfc3RhcnRfbmVnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwl1MTYgcmVnOworCisJLyogRW5hYmxlIEF1dG8tbmVnb3RpYXRpb24gc2Vuc2UgKi8KKwlxbF9taWlfcmVhZF9yZWcocWRldiwgUEVUQklfVEJJX0NUUkwsICZyZWcpOworCXJlZyB8PSBQRVRCSV9UQklfQVVUT19TRU5TRTsKKwlxbF9taWlfd3JpdGVfcmVnKHFkZXYsIFBFVEJJX1RCSV9DVFJMLCByZWcpOworCisJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCBQRVRCSV9ORUdfQURWRVIsCisJCQkgUEVUQklfTkVHX1BBVVNFIHwgUEVUQklfTkVHX0RVUExFWCk7CisKKwlxbF9taWlfd3JpdGVfcmVnKHFkZXYsIFBFVEJJX0NPTlRST0xfUkVHLAorCQkJIFBFVEJJX0NUUkxfQVVUT19ORUcgfCBQRVRCSV9DVFJMX1JFU1RBUlRfTkVHIHwKKwkJCSBQRVRCSV9DVFJMX0ZVTExfRFVQTEVYIHwgUEVUQklfQ1RSTF9TUEVFRF8xMDAwKTsKKworfQorCitzdGF0aWMgdm9pZCBxbF9wZXRiaV9yZXNldF9leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCit7CisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQRVRCSV9DT05UUk9MX1JFRywgUEVUQklfQ1RSTF9TT0ZUX1JFU0VULAorCQkJICAgIG1hY19pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3BldGJpX3N0YXJ0X25lZ19leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCit7CisJdTE2IHJlZzsKKworCS8qIEVuYWJsZSBBdXRvLW5lZ290aWF0aW9uIHNlbnNlICovCisJcWxfbWlpX3JlYWRfcmVnX2V4KHFkZXYsIFBFVEJJX1RCSV9DVFJMLCAmcmVnLCBtYWNfaW5kZXgpOworCXJlZyB8PSBQRVRCSV9UQklfQVVUT19TRU5TRTsKKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIFBFVEJJX1RCSV9DVFJMLCByZWcsIG1hY19pbmRleCk7CisKKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIFBFVEJJX05FR19BRFZFUiwKKwkJCSAgICBQRVRCSV9ORUdfUEFVU0UgfCBQRVRCSV9ORUdfRFVQTEVYLCBtYWNfaW5kZXgpOworCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQRVRCSV9DT05UUk9MX1JFRywKKwkJCSAgICBQRVRCSV9DVFJMX0FVVE9fTkVHIHwgUEVUQklfQ1RSTF9SRVNUQVJUX05FRyB8CisJCQkgICAgUEVUQklfQ1RSTF9GVUxMX0RVUExFWCB8IFBFVEJJX0NUUkxfU1BFRURfMTAwMCwKKwkJCSAgICBtYWNfaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBxbF9wZXRiaV9pbml0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlxbF9wZXRiaV9yZXNldChxZGV2KTsKKwlxbF9wZXRiaV9zdGFydF9uZWcocWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3BldGJpX2luaXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgbWFjX2luZGV4KQoreworCXFsX3BldGJpX3Jlc2V0X2V4KHFkZXYsIG1hY19pbmRleCk7CisJcWxfcGV0Ymlfc3RhcnRfbmVnX2V4KHFkZXYsIG1hY19pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgcWxfaXNfcGV0YmlfbmVnX3BhdXNlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwl1MTYgcmVnOworCisJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBQRVRCSV9ORUdfUEFSVE5FUiwgJnJlZykgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAocmVnICYgUEVUQklfTkVHX1BBVVNFX01BU0spID09IFBFVEJJX05FR19QQVVTRTsKK30KKworc3RhdGljIGludCBxbF9waHlfZ2V0X3NwZWVkKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwl1MTYgcmVnOworCisJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBBVVhfQ09OVFJPTF9TVEFUVVMsICZyZWcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZWcgPSAoKChyZWcgJiAweDE4KSA+PiAzKSAmIDMpOworCisJaWYgKHJlZyA9PSAyKQorCQlyZXR1cm4gU1BFRURfMTAwMDsKKwllbHNlIGlmIChyZWcgPT0gMSkKKwkJcmV0dXJuIFNQRUVEXzEwMDsKKwllbHNlIGlmIChyZWcgPT0gMCkKKwkJcmV0dXJuIFNQRUVEXzEwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHFsX2lzX2Z1bGxfZHVwKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwl1MTYgcmVnOworCisJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBBVVhfQ09OVFJPTF9TVEFUVVMsICZyZWcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHJlZyAmIFBIWV9BVVhfRFVQTEVYX1NUQVQpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfaXNfcGh5X25lZ19wYXVzZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTE2IHJlZzsKKworCWlmIChxbF9taWlfcmVhZF9yZWcocWRldiwgUEhZX05FR19QQVJUTkVSLCAmcmVnKSA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZWcgJiBQSFlfTkVHX1BBVVNFKSAhPSAwOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHFsX21hY19lbmFibGUoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgZW5hYmxlKQoreworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgdmFsdWU7CisKKwlpZiAoZW5hYmxlKQorCQl2YWx1ZSA9IChNQUNfQ09ORklHX1JFR19QRSB8IChNQUNfQ09ORklHX1JFR19QRSA8PCAxNikpOworCWVsc2UKKwkJdmFsdWUgPSAoTUFDX0NPTkZJR19SRUdfUEUgPDwgMTYpOworCisJaWYgKHFkZXYtPm1hY19pbmRleCkKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hYzFDb25maWdSZWcsIHZhbHVlKTsKKwllbHNlCisJCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMwQ29uZmlnUmVnLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBDYWxsZXIgaG9sZHMgaHdfbG9jay4KKyAqLworc3RhdGljIHZvaWQgcWxfbWFjX2NmZ19zb2Z0X3Jlc2V0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIHZhbHVlOworCisJaWYgKGVuYWJsZSkKKwkJdmFsdWUgPSAoTUFDX0NPTkZJR19SRUdfU1IgfCAoTUFDX0NPTkZJR19SRUdfU1IgPDwgMTYpKTsKKwllbHNlCisJCXZhbHVlID0gKE1BQ19DT05GSUdfUkVHX1NSIDw8IDE2KTsKKworCWlmIChxZGV2LT5tYWNfaW5kZXgpCisJCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMxQ29uZmlnUmVnLCB2YWx1ZSk7CisJZWxzZQorCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjMENvbmZpZ1JlZywgdmFsdWUpOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHFsX21hY19jZmdfZ2lnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIHZhbHVlOworCisJaWYgKGVuYWJsZSkKKwkJdmFsdWUgPSAoTUFDX0NPTkZJR19SRUdfR00gfCAoTUFDX0NPTkZJR19SRUdfR00gPDwgMTYpKTsKKwllbHNlCisJCXZhbHVlID0gKE1BQ19DT05GSUdfUkVHX0dNIDw8IDE2KTsKKworCWlmIChxZGV2LT5tYWNfaW5kZXgpCisJCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMxQ29uZmlnUmVnLCB2YWx1ZSk7CisJZWxzZQorCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjMENvbmZpZ1JlZywgdmFsdWUpOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHFsX21hY19jZmdfZnVsbF9kdXAoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgZW5hYmxlKQoreworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgdmFsdWU7CisKKwlpZiAoZW5hYmxlKQorCQl2YWx1ZSA9IChNQUNfQ09ORklHX1JFR19GRCB8IChNQUNfQ09ORklHX1JFR19GRCA8PCAxNikpOworCWVsc2UKKwkJdmFsdWUgPSAoTUFDX0NPTkZJR19SRUdfRkQgPDwgMTYpOworCisJaWYgKHFkZXYtPm1hY19pbmRleCkKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hYzFDb25maWdSZWcsIHZhbHVlKTsKKwllbHNlCisJCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMwQ29uZmlnUmVnLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBDYWxsZXIgaG9sZHMgaHdfbG9jay4KKyAqLworc3RhdGljIHZvaWQgcWxfbWFjX2NmZ19wYXVzZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBlbmFibGUpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiB2YWx1ZTsKKworCWlmIChlbmFibGUpCisJCXZhbHVlID0KKwkJICAgICgoTUFDX0NPTkZJR19SRUdfVEYgfCBNQUNfQ09ORklHX1JFR19SRikgfAorCQkgICAgICgoTUFDX0NPTkZJR19SRUdfVEYgfCBNQUNfQ09ORklHX1JFR19SRikgPDwgMTYpKTsKKwllbHNlCisJCXZhbHVlID0gKChNQUNfQ09ORklHX1JFR19URiB8IE1BQ19DT05GSUdfUkVHX1JGKSA8PCAxNik7CisKKwlpZiAocWRldi0+bWFjX2luZGV4KQorCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjMUNvbmZpZ1JlZywgdmFsdWUpOworCWVsc2UKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hYzBDb25maWdSZWcsIHZhbHVlKTsKK30KKworLyoKKyAqIENhbGxlciBob2xkcyBod19sb2NrLgorICovCitzdGF0aWMgaW50IHFsX2lzX2ZpYmVyKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIGJpdFRvQ2hlY2sgPSAwOworCXUzMiB0ZW1wOworCisJc3dpdGNoIChxZGV2LT5tYWNfaW5kZXgpIHsKKwljYXNlIDA6CisJCWJpdFRvQ2hlY2sgPSBQT1JUX1NUQVRVU19TTTA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYml0VG9DaGVjayA9IFBPUlRfU1RBVFVTX1NNMTsKKwkJYnJlYWs7CisJfQorCisJdGVtcCA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRTdGF0dXMpOworCXJldHVybiAodGVtcCAmIGJpdFRvQ2hlY2spICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfaXNfYXV0b19jZmcoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXUxNiByZWc7CisJcWxfbWlpX3JlYWRfcmVnKHFkZXYsIDB4MDAsICZyZWcpOworCXJldHVybiAocmVnICYgMHgxMDAwKSAhPSAwOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgcWxfaXNfYXV0b19uZWdfY29tcGxldGUoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgYml0VG9DaGVjayA9IDA7CisJdTMyIHRlbXA7CisKKwlzd2l0Y2ggKHFkZXYtPm1hY19pbmRleCkgeworCWNhc2UgMDoKKwkJYml0VG9DaGVjayA9IFBPUlRfU1RBVFVTX0FDMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfQUMxOworCQlicmVhazsKKwl9CisKKwl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CisJaWYgKHRlbXAgJiBiaXRUb0NoZWNrKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkgICAgICAgIiVzOiBBdXRvLU5lZ290aWF0ZSBjb21wbGV0ZS5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIiVzOiBBdXRvLU5lZ290aWF0ZSBpbmNvbXBsZXRlLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHFsX2lzX25lZ19wYXVzZSgpIHJldHVybnMgMSBpZiBwYXVzZSB3YXMgbmVnb3RpYXRlZCB0byBiZSBvbgorICovCitzdGF0aWMgaW50IHFsX2lzX25lZ19wYXVzZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJaWYgKHFsX2lzX2ZpYmVyKHFkZXYpKQorCQlyZXR1cm4gcWxfaXNfcGV0YmlfbmVnX3BhdXNlKHFkZXYpOworCWVsc2UKKwkJcmV0dXJuIHFsX2lzX3BoeV9uZWdfcGF1c2UocWRldik7Cit9CisKK3N0YXRpYyBpbnQgcWxfYXV0b19uZWdfZXJyb3Ioc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgYml0VG9DaGVjayA9IDA7CisJdTMyIHRlbXA7CisKKwlzd2l0Y2ggKHFkZXYtPm1hY19pbmRleCkgeworCWNhc2UgMDoKKwkJYml0VG9DaGVjayA9IFBPUlRfU1RBVFVTX0FFMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfQUUxOworCQlicmVhazsKKwl9CisJdGVtcCA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRTdGF0dXMpOworCXJldHVybiAodGVtcCAmIGJpdFRvQ2hlY2spICE9IDA7Cit9CisKK3N0YXRpYyB1MzIgcWxfZ2V0X2xpbmtfc3BlZWQoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCWlmIChxbF9pc19maWJlcihxZGV2KSkKKwkJcmV0dXJuIFNQRUVEXzEwMDA7CisJZWxzZQorCQlyZXR1cm4gcWxfcGh5X2dldF9zcGVlZChxZGV2KTsKK30KKworc3RhdGljIGludCBxbF9pc19saW5rX2Z1bGxfZHVwKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpZiAocWxfaXNfZmliZXIocWRldikpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIHFsX2lzX2Z1bGxfZHVwKHFkZXYpOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgcWxfbGlua19kb3duX2RldGVjdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiBiaXRUb0NoZWNrID0gMDsKKwl1MzIgdGVtcDsKKworCXN3aXRjaCAocWRldi0+bWFjX2luZGV4KSB7CisJY2FzZSAwOgorCQliaXRUb0NoZWNrID0gSVNQX0NPTlRST0xfTElOS19ETl8wOworCQlicmVhazsKKwljYXNlIDE6CisJCWJpdFRvQ2hlY2sgPSBJU1BfQ09OVFJPTF9MSU5LX0ROXzE7CisJCWJyZWFrOworCX0KKworCXRlbXAgPQorCSAgICBxbF9yZWFkX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzKTsKKwlyZXR1cm4gKHRlbXAgJiBiaXRUb0NoZWNrKSAhPSAwOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgcWxfbGlua19kb3duX2RldGVjdF9jbGVhcihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJc3dpdGNoIChxZGV2LT5tYWNfaW5kZXgpIHsKKwljYXNlIDA6CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzLAorCQkJCSAgICAoSVNQX0NPTlRST0xfTElOS19ETl8wKSB8CisJCQkJICAgIChJU1BfQ09OVFJPTF9MSU5LX0ROXzAgPDwgMTYpKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzLAorCQkJCSAgICAoSVNQX0NPTlRST0xfTElOS19ETl8xKSB8CisJCQkJICAgIChJU1BfQ09OVFJPTF9MSU5LX0ROXzEgPDwgMTYpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlciBob2xkcyBod19sb2NrLgorICovCitzdGF0aWMgaW50IHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwKKwkJCQkJIHUzMiBtYWNfaW5kZXgpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiBiaXRUb0NoZWNrID0gMDsKKwl1MzIgdGVtcDsKKworCXN3aXRjaCAobWFjX2luZGV4KSB7CisJY2FzZSAwOgorCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfRjFfRU5BQkxFRDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfRjNfRU5BQkxFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJdGVtcCA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRTdGF0dXMpOworCWlmICh0ZW1wICYgYml0VG9DaGVjaykgeworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCSAgICAgICAiJXM6IGlzIG5vdCBsaW5rIG1hc3Rlci5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCSAgICAgICAiJXM6IGlzIGxpbmsgbWFzdGVyLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfcGh5X3Jlc2V0X2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIG1hY19pbmRleCkKK3sKKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIENPTlRST0xfUkVHLCBQSFlfQ1RSTF9TT0ZUX1JFU0VULCBtYWNfaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBxbF9waHlfc3RhcnRfbmVnX2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIG1hY19pbmRleCkKK3sKKwl1MTYgcmVnOworCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQSFlfTkVHX0FEVkVSLAorCQkJICAgIFBIWV9ORUdfUEFVU0UgfCBQSFlfTkVHX0FEVl9TUEVFRCB8IDEsIG1hY19pbmRleCk7CisKKwlxbF9taWlfcmVhZF9yZWdfZXgocWRldiwgQ09OVFJPTF9SRUcsICZyZWcsIG1hY19pbmRleCk7CisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBDT05UUk9MX1JFRywgcmVnIHwgUEhZX0NUUkxfUkVTVEFSVF9ORUcsCisJCQkgICAgbWFjX2luZGV4KTsKK30KKworc3RhdGljIHZvaWQgcWxfcGh5X2luaXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgbWFjX2luZGV4KQoreworCXFsX3BoeV9yZXNldF9leChxZGV2LCBtYWNfaW5kZXgpOworCXFsX3BoeV9zdGFydF9uZWdfZXgocWRldiwgbWFjX2luZGV4KTsKK30KKworLyoKKyAqIENhbGxlciBob2xkcyBod19sb2NrLgorICovCitzdGF0aWMgdTMyIHFsX2dldF9saW5rX3N0YXRlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIGJpdFRvQ2hlY2sgPSAwOworCXUzMiB0ZW1wLCBsaW5rU3RhdGU7CisKKwlzd2l0Y2ggKHFkZXYtPm1hY19pbmRleCkgeworCWNhc2UgMDoKKwkJYml0VG9DaGVjayA9IFBPUlRfU1RBVFVTX1VQMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfVVAxOworCQlicmVhazsKKwl9CisJdGVtcCA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRTdGF0dXMpOworCWlmICh0ZW1wICYgYml0VG9DaGVjaykgeworCQlsaW5rU3RhdGUgPSBMU19VUDsKKwl9IGVsc2UgeworCQlsaW5rU3RhdGUgPSBMU19ET1dOOworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJICAgICAgICIlczogTGluayBpcyBkb3duLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJfQorCXJldHVybiBsaW5rU3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgcWxfcG9ydF9zdGFydChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCisJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKKwkJCSAyKSA8PCA3KSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHFsX2lzX2ZpYmVyKHFkZXYpKSB7CisJCXFsX3BldGJpX2luaXQocWRldik7CisJfSBlbHNlIHsKKwkJLyogQ29wcGVyIHBvcnQgKi8KKwkJcWxfcGh5X2luaXRfZXgocWRldiwgcWRldi0+bWFjX2luZGV4KTsKKwl9CisKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFsX2ZpbmlzaF9hdXRvX25lZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisKKwlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgorCQkJIDIpIDw8IDcpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXFsX2F1dG9fbmVnX2Vycm9yKHFkZXYpKSB7CisJCWlmICh0ZXN0X2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpKSB7CisJCQkvKiBjb25maWd1cmUgdGhlIE1BQyAqLworCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJCSAgICAgICAiJXM6IENvbmZpZ3VyaW5nIGxpbmsuXG4iLAorCQkJCSAgICAgICBxZGV2LT5uZGV2LT4KKwkJCQkgICAgICAgbmFtZSk7CisJCQlxbF9tYWNfY2ZnX3NvZnRfcmVzZXQocWRldiwgMSk7CisJCQlxbF9tYWNfY2ZnX2dpZyhxZGV2LAorCQkJCSAgICAgICAocWxfZ2V0X2xpbmtfc3BlZWQKKwkJCQkJKHFkZXYpID09CisJCQkJCVNQRUVEXzEwMDApKTsKKwkJCXFsX21hY19jZmdfZnVsbF9kdXAocWRldiwKKwkJCQkJICAgIHFsX2lzX2xpbmtfZnVsbF9kdXAKKwkJCQkJICAgIChxZGV2KSk7CisJCQlxbF9tYWNfY2ZnX3BhdXNlKHFkZXYsCisJCQkJCSBxbF9pc19uZWdfcGF1c2UKKwkJCQkJIChxZGV2KSk7CisJCQlxbF9tYWNfY2ZnX3NvZnRfcmVzZXQocWRldiwgMCk7CisKKwkJCS8qIGVuYWJsZSB0aGUgTUFDICovCisJCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCisJCQkJICAgICAgICIlczogRW5hYmxpbmcgbWFjLlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+CisJCQkJCSAgICAgICBuYW1lKTsKKwkJCXFsX21hY19lbmFibGUocWRldiwgMSk7CisJCX0KKworCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCSAgICAgICAiJXM6IENoYW5nZSBwb3J0X2xpbmtfc3RhdGUgTFNfRE9XTiB0byBMU19VUC5cbiIsCisJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCXFkZXYtPnBvcnRfbGlua19zdGF0ZSA9IExTX1VQOworCQluZXRpZl9zdGFydF9xdWV1ZShxZGV2LT5uZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vbihxZGV2LT5uZGV2KTsKKwkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJCSAgICAgICAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLAorCQkJICAgICAgIHFsX2dldF9saW5rX3NwZWVkKHFkZXYpLAorCQkJICAgICAgIHFsX2lzX2xpbmtfZnVsbF9kdXAocWRldikKKwkJCSAgICAgICA/ICJmdWxsIiA6ICJoYWxmIik7CisKKwl9IGVsc2UgewkvKiBSZW1vdGUgZXJyb3IgZGV0ZWN0ZWQgKi8KKworCQlpZiAodGVzdF9iaXQoUUxfTElOS19NQVNURVIsJnFkZXYtPmZsYWdzKSkgeworCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJCSAgICAgICAiJXM6IFJlbW90ZSBlcnJvciBkZXRlY3RlZC4gIgorCQkJCSAgICAgICAiQ2FsbGluZyBxbF9wb3J0X3N0YXJ0KCkuXG4iLAorCQkJCSAgICAgICBxZGV2LT5uZGV2LT4KKwkJCQkgICAgICAgbmFtZSk7CisJCQkvKgorCQkJICogcWxfcG9ydF9zdGFydCgpIGlzIHNoYXJlZCBjb2RlIGFuZCBuZWVkcworCQkJICogdG8gbG9jayB0aGUgUEhZIG9uIGl0J3Mgb3duLgorCQkJICovCisJCQlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOworCQkJaWYocWxfcG9ydF9zdGFydChxZGV2KSkJey8qIFJlc3RhcnQgcG9ydCAqLworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXFsX3NlbV91bmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2xpbmtfc3RhdGVfbWFjaGluZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIGN1cnJfbGlua19zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKworCWN1cnJfbGlua19zdGF0ZSA9IHFsX2dldF9saW5rX3N0YXRlKHFkZXYpOworCisJaWYgKHRlc3RfYml0KFFMX1JFU0VUX0FDVElWRSwmcWRldi0+ZmxhZ3MpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkgICAgICAgIiVzOiBSZXNldCBpbiBwcm9ncmVzcywgc2tpcCBwcm9jZXNzaW5nIGxpbmsgIgorCQkJICAgICAgICJzdGF0ZS5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChxZGV2LT5wb3J0X2xpbmtfc3RhdGUpIHsKKwlkZWZhdWx0OgorCQlpZiAodGVzdF9iaXQoUUxfTElOS19NQVNURVIsJnFkZXYtPmZsYWdzKSkgeworCQkJcWxfcG9ydF9zdGFydChxZGV2KTsKKwkJfQorCQlxZGV2LT5wb3J0X2xpbmtfc3RhdGUgPSBMU19ET1dOOworCQkvKiBGYWxsIFRocm91Z2ggKi8KKworCWNhc2UgTFNfRE9XTjoKKwkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCisJCQkgICAgICAgIiVzOiBwb3J0X2xpbmtfc3RhdGUgPSBMU19ET1dOLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJaWYgKGN1cnJfbGlua19zdGF0ZSA9PSBMU19VUCkgeworCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJCSAgICAgICAiJXM6IGN1cnJfbGlua19zdGF0ZSA9IExTX1VQLlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQlpZiAocWxfaXNfYXV0b19uZWdfY29tcGxldGUocWRldikpCisJCQkJcWxfZmluaXNoX2F1dG9fbmVnKHFkZXYpOworCisJCQlpZiAocWRldi0+cG9ydF9saW5rX3N0YXRlID09IExTX1VQKQorCQkJCXFsX2xpbmtfZG93bl9kZXRlY3RfY2xlYXIocWRldik7CisKKwkJfQorCQlicmVhazsKKworCWNhc2UgTFNfVVA6CisJCS8qCisJCSAqIFNlZSBpZiB0aGUgbGluayBpcyBjdXJyZW50bHkgZG93biBvciB3ZW50IGRvd24gYW5kIGNhbWUKKwkJICogYmFjayB1cAorCQkgKi8KKwkJaWYgKChjdXJyX2xpbmtfc3RhdGUgPT0gTFNfRE9XTikgfHwgcWxfbGlua19kb3duX2RldGVjdChxZGV2KSkgeworCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQorCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyBkb3duLlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQlxZGV2LT5wb3J0X2xpbmtfc3RhdGUgPSBMU19ET1dOOworCQl9CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7Cit9CisKKy8qCisgKiBDYWxsZXIgbXVzdCB0YWtlIGh3X2xvY2sgYW5kIFFMX1BIWV9HSU9fU0VNLgorICovCitzdGF0aWMgdm9pZCBxbF9nZXRfcGh5X293bmVyKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpZiAocWxfdGhpc19hZGFwdGVyX2NvbnRyb2xzX3BvcnQocWRldiwgcWRldi0+bWFjX2luZGV4KSkKKwkJc2V0X2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KFFMX0xJTktfTUFTVEVSLCZxZGV2LT5mbGFncyk7Cit9CisKKy8qCisgKiBDYWxsZXIgbXVzdCB0YWtlIGh3X2xvY2sgYW5kIFFMX1BIWV9HSU9fU0VNLgorICovCitzdGF0aWMgdm9pZCBxbF9pbml0X3NjYW5fbW9kZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJcWxfbWlpX2VuYWJsZV9zY2FuX21vZGUocWRldik7CisKKwlpZiAodGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncykpIHsKKwkJaWYgKHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHFkZXYsIHFkZXYtPm1hY19pbmRleCkpCisJCQlxbF9wZXRiaV9pbml0X2V4KHFkZXYsIHFkZXYtPm1hY19pbmRleCk7CisJfSBlbHNlIHsKKwkJaWYgKHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHFkZXYsIHFkZXYtPm1hY19pbmRleCkpCisJCQlxbF9waHlfaW5pdF9leChxZGV2LCBxZGV2LT5tYWNfaW5kZXgpOworCX0KK30KKworLyoKKyAqIE1JSV9TZXR1cCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHRha2luZyB0aGUgUEhZIG91dCBvZiByZXNldCBzbyB0aGF0IHRoZQorICogbWFuYWdlbWVudCBpbnRlcmZhY2UgY2xvY2sgc3BlZWQgY2FuIGJlIHNldCBwcm9wZXJseS4gIEl0IHdvdWxkIGJlIGJldHRlciBpZgorICogd2UgaGFkIGEgd2F5IHRvIGRpc2FibGUgTURDIHVudGlsIGFmdGVyIHRoZSBQSFkgaXMgb3V0IG9mIHJlc2V0LCBidXQgd2UKKyAqIGRvbid0IGhhdmUgdGhhdCBjYXBhYmlsaXR5LgorICovCitzdGF0aWMgaW50IHFsX21paV9zZXR1cChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIHJlZzsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwkJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKKwkJCSAyKSA8PCA3KSkKKwkJcmV0dXJuIC0xOworCisJLyogRGl2aWRlIDEyNU1IeiBjbG9jayBieSAyOCB0byBtZWV0IFBIWSB0aW1pbmcgcmVxdWlyZW1lbnRzICovCisJcmVnID0gTUFDX01JSV9DT05UUk9MX0NMS19TRUxfRElWMjg7CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdENvbnRyb2xSZWcsCisJCQkgICByZWcgfCAoKE1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX01BU0spIDw8IDE2KSk7CisKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHFsX3N1cHBvcnRlZF9tb2RlcyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIHN1cHBvcnRlZDsKKworCWlmICh0ZXN0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKSkgeworCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUKKwkJICAgIHwgU1VQUE9SVEVEX0F1dG9uZWc7CisJfSBlbHNlIHsKKwkJc3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkgICAgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsCisJCSAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCSAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCisJCSAgICB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgorCQkgICAgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwKKwkJICAgIHwgU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfVFA7CisJfQorCisJcmV0dXJuIHN1cHBvcnRlZDsKK30KKworc3RhdGljIGludCBxbF9nZXRfYXV0b19jZmdfc3RhdHVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKwlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgorCQkJIDIpIDw8IDcpKQorCQlyZXR1cm4gMDsKKwlzdGF0dXMgPSBxbF9pc19hdXRvX2NmZyhxZGV2KTsKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdTMyIHFsX2dldF9zcGVlZChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCisJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKKwkJCSAyKSA8PCA3KSkKKwkJcmV0dXJuIDA7CisJc3RhdHVzID0gcWxfZ2V0X2xpbmtfc3BlZWQocWRldik7CisJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBxbF9nZXRfZnVsbF9kdXAoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBod19mbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCWlmKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLLAorCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KSAqCisJCQkgMikgPDwgNykpCisJCXJldHVybiAwOworCXN0YXR1cyA9IHFsX2lzX2xpbmtfZnVsbF9kdXAocWRldik7CisJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgaW50IHFsX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWVjbWQtPnN1cHBvcnRlZCA9IHFsX3N1cHBvcnRlZF9tb2RlcyhxZGV2KTsKKworCWlmICh0ZXN0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKSkgeworCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwl9IGVsc2UgeworCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJZWNtZC0+cGh5X2FkZHJlc3MgPSBxZGV2LT5QSFlBZGRyOworCX0KKwllY21kLT5hZHZlcnRpc2luZyA9IHFsX3N1cHBvcnRlZF9tb2RlcyhxZGV2KTsKKwllY21kLT5hdXRvbmVnID0gcWxfZ2V0X2F1dG9fY2ZnX3N0YXR1cyhxZGV2KTsKKwllY21kLT5zcGVlZCA9IHFsX2dldF9zcGVlZChxZGV2KTsKKwllY21kLT5kdXBsZXggPSBxbF9nZXRfZnVsbF9kdXAocWRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgcWwzeHh4X2RyaXZlcl9uYW1lLCAzMik7CisJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBxbDN4eHhfZHJpdmVyX3ZlcnNpb24sIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocWRldi0+cGRldiksIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gMDsKKwlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSAwOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gMDsKKwlkcnZpbmZvLT5lZWR1bXBfbGVuID0gMDsKK30KKworc3RhdGljIHUzMiBxbF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcmV0dXJuIHFkZXYtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXFkZXYtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBxbDN4eHhfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IHFsX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBxbF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3Blcm1fYWRkciA9IGV0aHRvb2xfb3BfZ2V0X3Blcm1fYWRkciwKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwgPSBxbF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IHFsX3NldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyBpbnQgcWxfcG9wdWxhdGVfZnJlZV9xdWV1ZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2IgPSBxZGV2LT5scmdfYnVmX2ZyZWVfaGVhZDsKKwl1NjQgbWFwOworCisJd2hpbGUgKGxyZ19idWZfY2IpIHsKKwkJaWYgKCFscmdfYnVmX2NiLT5za2IpIHsKKwkJCWxyZ19idWZfY2ItPnNrYiA9IGRldl9hbGxvY19za2IocWRldi0+bHJnX2J1ZmZlcl9sZW4pOworCQkJaWYgKHVubGlrZWx5KCFscmdfYnVmX2NiLT5za2IpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCisJCQkJICAgICAgICIlczogRmFpbGVkIGRldl9hbGxvY19za2IoKS5cbiIsCisJCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFdlIHNhdmUgc29tZSBzcGFjZSB0byBjb3B5IHRoZSBldGhoZHIgZnJvbQorCQkJCSAqIGZpcnN0IGJ1ZmZlcgorCQkJCSAqLworCQkJCXNrYl9yZXNlcnZlKGxyZ19idWZfY2ItPnNrYiwgUUxfSEVBREVSX1NQQUNFKTsKKwkJCQltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJCQkJICAgICBscmdfYnVmX2NiLT5za2ItPmRhdGEsCisJCQkJCQkgICAgIHFkZXYtPmxyZ19idWZmZXJfbGVuIC0KKwkJCQkJCSAgICAgUUxfSEVBREVSX1NQQUNFLAorCQkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWxyZ19idWZfY2ItPmJ1Zl9waHlfYWRkcl9sb3cgPQorCQkJCSAgICBjcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7CisJCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2hpZ2ggPQorCQkJCSAgICBjcHVfdG9fbGUzMihNU182NEJJVFMobWFwKSk7CisJCQkJcGNpX3VubWFwX2FkZHJfc2V0KGxyZ19idWZfY2IsIG1hcGFkZHIsIG1hcCk7CisJCQkJcGNpX3VubWFwX2xlbl9zZXQobHJnX2J1Zl9jYiwgbWFwbGVuLAorCQkJCQkJICBxZGV2LT5scmdfYnVmZmVyX2xlbiAtCisJCQkJCQkgIFFMX0hFQURFUl9TUEFDRSk7CisJCQkJLS1xZGV2LT5scmdfYnVmX3NrYl9jaGVjazsKKwkJCQlpZiAoIXFkZXYtPmxyZ19idWZfc2tiX2NoZWNrKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlscmdfYnVmX2NiID0gbHJnX2J1Zl9jYi0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZXIgaG9sZHMgaHdfbG9jay4KKyAqLworc3RhdGljIHZvaWQgcWxfdXBkYXRlX2xyZ19idWZxX3Byb2RfaW5kZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBidWZxX2FkZHJfZWxlbWVudCAqbHJnX2J1Zl9xX2VsZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYjsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCisJaWYgKChxZGV2LT5scmdfYnVmX2ZyZWVfY291bnQgPj0gOCkKKwkgICAgJiYgKHFkZXYtPmxyZ19idWZfcmVsZWFzZV9jbnQgPj0gMTYpKSB7CisKKwkJaWYgKHFkZXYtPmxyZ19idWZfc2tiX2NoZWNrKQorCQkJaWYgKCFxbF9wb3B1bGF0ZV9mcmVlX3F1ZXVlKHFkZXYpKQorCQkJCXJldHVybjsKKworCQlscmdfYnVmX3FfZWxlID0gcWRldi0+bHJnX2J1Zl9uZXh0X2ZyZWU7CisKKwkJd2hpbGUgKChxZGV2LT5scmdfYnVmX3JlbGVhc2VfY250ID49IDE2KQorCQkgICAgICAgJiYgKHFkZXYtPmxyZ19idWZfZnJlZV9jb3VudCA+PSA4KSkgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJbHJnX2J1Zl9jYiA9CisJCQkJICAgIHFsX2dldF9mcm9tX2xyZ19idWZfZnJlZV9saXN0KHFkZXYpOworCQkJCWxyZ19idWZfcV9lbGUtPmFkZHJfaGlnaCA9CisJCQkJICAgIGxyZ19idWZfY2ItPmJ1Zl9waHlfYWRkcl9oaWdoOworCQkJCWxyZ19idWZfcV9lbGUtPmFkZHJfbG93ID0KKwkJCQkgICAgbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2xvdzsKKwkJCQlscmdfYnVmX3FfZWxlKys7CisKKwkJCQlxZGV2LT5scmdfYnVmX3JlbGVhc2VfY250LS07CisJCQl9CisKKwkJCXFkZXYtPmxyZ19idWZfcV9wcm9kdWNlcl9pbmRleCsrOworCisJCQlpZiAocWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID09IE5VTV9MQlVGUV9FTlRSSUVTKQorCQkJCXFkZXYtPmxyZ19idWZfcV9wcm9kdWNlcl9pbmRleCA9IDA7CisKKwkJCWlmIChxZGV2LT5scmdfYnVmX3FfcHJvZHVjZXJfaW5kZXggPT0KKwkJCSAgICAoTlVNX0xCVUZRX0VOVFJJRVMgLSAxKSkgeworCQkJCWxyZ19idWZfcV9lbGUgPSBxZGV2LT5scmdfYnVmX3FfdmlydF9hZGRyOworCQkJfQorCQl9CisKKwkJcWRldi0+bHJnX2J1Zl9uZXh0X2ZyZWUgPSBscmdfYnVmX3FfZWxlOworCisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgKHUzMiAqKSAmIHBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCQkgICAgcnhMYXJnZVFQcm9kdWNlckluZGV4LAorCQkJCSAgICBxZGV2LT5scmdfYnVmX3FfcHJvZHVjZXJfaW5kZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfcHJvY2Vzc19tYWNfdHhfaW50cihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgc3RydWN0IG9iX21hY19pb2NiX3JzcCAqbWFjX3JzcCkKK3sKKwlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKKworCXR4X2NiID0gJnFkZXYtPnR4X2J1ZlttYWNfcnNwLT50cmFuc2FjdGlvbl9pZF07CisJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJIHBjaV91bm1hcF9hZGRyKHR4X2NiLCBtYXBhZGRyKSwKKwkJCSBwY2lfdW5tYXBfbGVuKHR4X2NiLCBtYXBsZW4pLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiX2lycSh0eF9jYi0+c2tiKTsKKwlxZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJcWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhfY2ItPnNrYi0+bGVuOworCXR4X2NiLT5za2IgPSBOVUxMOworCWF0b21pY19pbmMoJnFkZXYtPnR4X2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgcWxfcHJvY2Vzc19tYWNfcnhfaW50cihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgc3RydWN0IGliX21hY19pb2NiX3JzcCAqaWJfbWFjX3JzcF9wdHIpCit7CisJbG9uZyBpbnQgb2Zmc2V0OworCXUzMiBscmdfYnVmX3BoeV9hZGRyX2xvdyA9IDA7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2IxID0gTlVMTDsKKwlzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYjIgPSBOVUxMOworCXUzMiAqY3Vycl9pYWxfcHRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGliX21hY19yc3BfcHRyLT5sZW5ndGgpOworCisJLyoKKwkgKiBHZXQgdGhlIGluYm91bmQgYWRkcmVzcyBsaXN0IChzbWFsbCBidWZmZXIpLgorCSAqLworCW9mZnNldCA9IHFkZXYtPnNtYWxsX2J1Zl9pbmRleCAqIFFMX1NNQUxMX0JVRkZFUl9TSVpFOworCWlmICgrK3FkZXYtPnNtYWxsX2J1Zl9pbmRleCA9PSBOVU1fU01BTExfQlVGRkVSUykKKwkJcWRldi0+c21hbGxfYnVmX2luZGV4ID0gMDsKKworCWN1cnJfaWFsX3B0ciA9ICh1MzIgKikgKHFkZXYtPnNtYWxsX2J1Zl92aXJ0X2FkZHIgKyBvZmZzZXQpOworCXFkZXYtPmxhc3RfcnNwX29mZnNldCA9IHFkZXYtPnNtYWxsX2J1Zl9waHlfYWRkcl9sb3cgKyBvZmZzZXQ7CisJcWRldi0+c21hbGxfYnVmX3JlbGVhc2VfY250Kys7CisKKwkvKiBzdGFydCBvZiBmaXJzdCBidWZmZXIgKi8KKwlscmdfYnVmX3BoeV9hZGRyX2xvdyA9IGxlMzJfdG9fY3B1KCpjdXJyX2lhbF9wdHIpOworCWxyZ19idWZfY2IxID0gJnFkZXYtPmxyZ19idWZbcWRldi0+bHJnX2J1Zl9pbmRleF07CisJcWRldi0+bHJnX2J1Zl9yZWxlYXNlX2NudCsrOworCWlmICgrK3FkZXYtPmxyZ19idWZfaW5kZXggPT0gTlVNX0xBUkdFX0JVRkZFUlMpCisJCXFkZXYtPmxyZ19idWZfaW5kZXggPSAwOworCWN1cnJfaWFsX3B0cisrOwkJLyogNjQtYml0IHBvaW50ZXJzIHJlcXVpcmUgdHdvIGluY3MuICovCisJY3Vycl9pYWxfcHRyKys7CisKKwkvKiBzdGFydCBvZiBzZWNvbmQgYnVmZmVyICovCisJbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSBsZTMyX3RvX2NwdSgqY3Vycl9pYWxfcHRyKTsKKwlscmdfYnVmX2NiMiA9ICZxZGV2LT5scmdfYnVmW3FkZXYtPmxyZ19idWZfaW5kZXhdOworCisJLyoKKwkgKiBTZWNvbmQgYnVmZmVyIGdldHMgc2VudCB1cCB0aGUgc3RhY2suCisJICovCisJcWRldi0+bHJnX2J1Zl9yZWxlYXNlX2NudCsrOworCWlmICgrK3FkZXYtPmxyZ19idWZfaW5kZXggPT0gTlVNX0xBUkdFX0JVRkZFUlMpCisJCXFkZXYtPmxyZ19idWZfaW5kZXggPSAwOworCXNrYiA9IGxyZ19idWZfY2IyLT5za2I7CisKKwlxZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJcWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworCisJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJIHBjaV91bm1hcF9hZGRyKGxyZ19idWZfY2IyLCBtYXBhZGRyKSwKKwkJCSBwY2lfdW5tYXBfbGVuKGxyZ19idWZfY2IyLCBtYXBsZW4pLAorCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJcHJlZmV0Y2goc2tiLT5kYXRhKTsKKwlza2ItPmRldiA9IHFkZXYtPm5kZXY7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHFkZXYtPm5kZXYpOworCisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwlxZGV2LT5uZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlscmdfYnVmX2NiMi0+c2tiID0gTlVMTDsKKworCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjEpOworCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjIpOworfQorCitzdGF0aWMgdm9pZCBxbF9wcm9jZXNzX21hY2lwX3J4X2ludHIoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAorCQkJCSAgICAgc3RydWN0IGliX2lwX2lvY2JfcnNwICppYl9pcF9yc3BfcHRyKQoreworCWxvbmcgaW50IG9mZnNldDsKKwl1MzIgbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSAwOworCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpscmdfYnVmX2NiMSA9IE5VTEw7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2IyID0gTlVMTDsKKwl1MzIgKmN1cnJfaWFsX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSwgKnNrYjI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBxZGV2LT5uZGV2OworCXUxNiBsZW5ndGggPSBsZTE2X3RvX2NwdShpYl9pcF9yc3BfcHRyLT5sZW5ndGgpOworCXUxNiBzaXplID0gMDsKKworCS8qCisJICogR2V0IHRoZSBpbmJvdW5kIGFkZHJlc3MgbGlzdCAoc21hbGwgYnVmZmVyKS4KKwkgKi8KKworCW9mZnNldCA9IHFkZXYtPnNtYWxsX2J1Zl9pbmRleCAqIFFMX1NNQUxMX0JVRkZFUl9TSVpFOworCWlmICgrK3FkZXYtPnNtYWxsX2J1Zl9pbmRleCA9PSBOVU1fU01BTExfQlVGRkVSUykKKwkJcWRldi0+c21hbGxfYnVmX2luZGV4ID0gMDsKKwljdXJyX2lhbF9wdHIgPSAodTMyICopIChxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyICsgb2Zmc2V0KTsKKwlxZGV2LT5sYXN0X3JzcF9vZmZzZXQgPSBxZGV2LT5zbWFsbF9idWZfcGh5X2FkZHJfbG93ICsgb2Zmc2V0OworCXFkZXYtPnNtYWxsX2J1Zl9yZWxlYXNlX2NudCsrOworCisJLyogc3RhcnQgb2YgZmlyc3QgYnVmZmVyICovCisJbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSBsZTMyX3RvX2NwdSgqY3Vycl9pYWxfcHRyKTsKKwlscmdfYnVmX2NiMSA9ICZxZGV2LT5scmdfYnVmW3FkZXYtPmxyZ19idWZfaW5kZXhdOworCisJcWRldi0+bHJnX2J1Zl9yZWxlYXNlX2NudCsrOworCWlmICgrK3FkZXYtPmxyZ19idWZfaW5kZXggPT0gTlVNX0xBUkdFX0JVRkZFUlMpCisJCXFkZXYtPmxyZ19idWZfaW5kZXggPSAwOworCXNrYjEgPSBscmdfYnVmX2NiMS0+c2tiOworCWN1cnJfaWFsX3B0cisrOwkJLyogNjQtYml0IHBvaW50ZXJzIHJlcXVpcmUgdHdvIGluY3MuICovCisJY3Vycl9pYWxfcHRyKys7CisKKwkvKiBzdGFydCBvZiBzZWNvbmQgYnVmZmVyICovCisJbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSBsZTMyX3RvX2NwdSgqY3Vycl9pYWxfcHRyKTsKKwlscmdfYnVmX2NiMiA9ICZxZGV2LT5scmdfYnVmW3FkZXYtPmxyZ19idWZfaW5kZXhdOworCXNrYjIgPSBscmdfYnVmX2NiMi0+c2tiOworCXFkZXYtPmxyZ19idWZfcmVsZWFzZV9jbnQrKzsKKwlpZiAoKytxZGV2LT5scmdfYnVmX2luZGV4ID09IE5VTV9MQVJHRV9CVUZGRVJTKQorCQlxZGV2LT5scmdfYnVmX2luZGV4ID0gMDsKKworCXFkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlxZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisKKwkvKgorCSAqIENvcHkgdGhlIGV0aGhkciBmcm9tIGZpcnN0IGJ1ZmZlciB0byBzZWNvbmQuIFRoaXMKKwkgKiBpcyBuZWNlc3NhcnkgZm9yIElQIGNvbXBsZXRpb25zLgorCSAqLworCWlmICgqKCh1MTYgKikgc2tiMS0+ZGF0YSkgIT0gMHhGRkZGKQorCQlzaXplID0gVkxBTl9FVEhfSExFTjsKKwllbHNlCisJCXNpemUgPSBFVEhfSExFTjsKKworCXNrYl9wdXQoc2tiMiwgbGVuZ3RoKTsJLyogSnVzdCB0aGUgc2Vjb25kIGJ1ZmZlciBsZW5ndGggaGVyZS4gKi8KKwlwY2lfdW5tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCisJCQkgcGNpX3VubWFwX2FkZHIobHJnX2J1Zl9jYjIsIG1hcGFkZHIpLAorCQkJIHBjaV91bm1hcF9sZW4obHJnX2J1Zl9jYjIsIG1hcGxlbiksCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlwcmVmZXRjaChza2IyLT5kYXRhKTsKKworCW1lbWNweShza2JfcHVzaChza2IyLCBzaXplKSwgc2tiMS0+ZGF0YSArIFZMQU5fSURfTEVOLCBzaXplKTsKKwlza2IyLT5kZXYgPSBxZGV2LT5uZGV2OworCXNrYjItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJc2tiMi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IyLCBxZGV2LT5uZGV2KTsKKworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYjIpOworCW5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxyZ19idWZfY2IyLT5za2IgPSBOVUxMOworCisJcWxfcmVsZWFzZV90b19scmdfYnVmX2ZyZWVfbGlzdChxZGV2LCBscmdfYnVmX2NiMSk7CisJcWxfcmVsZWFzZV90b19scmdfYnVmX2ZyZWVfbGlzdChxZGV2LCBscmdfYnVmX2NiMik7Cit9CisKK3N0YXRpYyBpbnQgcWxfdHhfcnhfY2xlYW4oc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAorCQkJICBpbnQgKnR4X2NsZWFuZWQsIGludCAqcnhfY2xlYW5lZCwgaW50IHdvcmtfdG9fZG8pCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlzdHJ1Y3QgbmV0X3JzcF9pb2NiICpuZXRfcnNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcWRldi0+bmRldjsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCisJLyogV2hpbGUgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhlIGNvbXBsZXRpb24gcXVldWUuICovCisJd2hpbGUgKChjcHVfdG9fbGUzMigqKHFkZXYtPnByc3BfcHJvZHVjZXJfaW5kZXgpKSAhPQorCQlxZGV2LT5yc3BfY29uc3VtZXJfaW5kZXgpICYmICgqcnhfY2xlYW5lZCA8IHdvcmtfdG9fZG8pKSB7CisKKwkJbmV0X3JzcCA9IHFkZXYtPnJzcF9jdXJyZW50OworCQlzd2l0Y2ggKG5ldF9yc3AtPm9wY29kZSkgeworCisJCWNhc2UgT1BDT0RFX09CX01BQ19JT0NCX0ZOMDoKKwkJY2FzZSBPUENPREVfT0JfTUFDX0lPQ0JfRk4yOgorCQkJcWxfcHJvY2Vzc19tYWNfdHhfaW50cihxZGV2LCAoc3RydWN0IG9iX21hY19pb2NiX3JzcCAqKQorCQkJCQkgICAgICAgbmV0X3JzcCk7CisJCQkoKnR4X2NsZWFuZWQpKys7CisJCQlicmVhazsKKworCQljYXNlIE9QQ09ERV9JQl9NQUNfSU9DQjoKKwkJCXFsX3Byb2Nlc3NfbWFjX3J4X2ludHIocWRldiwgKHN0cnVjdCBpYl9tYWNfaW9jYl9yc3AgKikKKwkJCQkJICAgICAgIG5ldF9yc3ApOworCQkJKCpyeF9jbGVhbmVkKSsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUENPREVfSUJfSVBfSU9DQjoKKwkJCXFsX3Byb2Nlc3NfbWFjaXBfcnhfaW50cihxZGV2LCAoc3RydWN0IGliX2lwX2lvY2JfcnNwICopCisJCQkJCQkgbmV0X3JzcCk7CisJCQkoKnJ4X2NsZWFuZWQpKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQl1MzIgKnRtcCA9ICh1MzIgKikgbmV0X3JzcDsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICIlczogSGl0IGRlZmF1bHQgY2FzZSwgbm90ICIKKwkJCQkgICAgICAgImhhbmRsZWQhXG4iCisJCQkJICAgICAgICIJZHJvcHBpbmcgdGhlIHBhY2tldCwgb3Bjb2RlID0gIgorCQkJCSAgICAgICAiJXguXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lLCBuZXRfcnNwLT5vcGNvZGUpOworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgICAgIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzBdLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzFdLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzJdLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzNdKTsKKwkJCX0KKwkJfQorCisJCXFkZXYtPnJzcF9jb25zdW1lcl9pbmRleCsrOworCisJCWlmIChxZGV2LT5yc3BfY29uc3VtZXJfaW5kZXggPT0gTlVNX1JTUF9RX0VOVFJJRVMpIHsKKwkJCXFkZXYtPnJzcF9jb25zdW1lcl9pbmRleCA9IDA7CisJCQlxZGV2LT5yc3BfY3VycmVudCA9IHFkZXYtPnJzcF9xX3ZpcnRfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCXFkZXYtPnJzcF9jdXJyZW50Kys7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCisJcWxfdXBkYXRlX2xyZ19idWZxX3Byb2RfaW5kZXgocWRldik7CisKKwlpZiAocWRldi0+c21hbGxfYnVmX3JlbGVhc2VfY250ID49IDE2KSB7CisJCXdoaWxlIChxZGV2LT5zbWFsbF9idWZfcmVsZWFzZV9jbnQgPj0gMTYpIHsKKwkJCXFkZXYtPnNtYWxsX2J1Zl9xX3Byb2R1Y2VyX2luZGV4Kys7CisKKwkJCWlmIChxZGV2LT5zbWFsbF9idWZfcV9wcm9kdWNlcl9pbmRleCA9PQorCQkJICAgIE5VTV9TQlVGUV9FTlRSSUVTKQorCQkJCXFkZXYtPnNtYWxsX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID0gMDsKKwkJCXFkZXYtPnNtYWxsX2J1Zl9yZWxlYXNlX2NudCAtPSA4OworCQl9CisKKwkJcWxfd3JpdGVfY29tbW9uX3JlZyhxZGV2LAorCQkJCSAgICAodTMyICopICYgcG9ydF9yZWdzLT5Db21tb25SZWdzLgorCQkJCSAgICByeFNtYWxsUVByb2R1Y2VySW5kZXgsCisJCQkJICAgIHFkZXYtPnNtYWxsX2J1Zl9xX3Byb2R1Y2VyX2luZGV4KTsKKwl9CisKKwlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkgICAgKHUzMiAqKSAmIHBvcnRfcmVncy0+Q29tbW9uUmVncy5yc3BRQ29uc3VtZXJJbmRleCwKKwkJCSAgICBxZGV2LT5yc3BfY29uc3VtZXJfaW5kZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKworCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHFkZXYtPm5kZXYpKSkgeworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChxZGV2LT5uZGV2KSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZxZGV2LT50eF9jb3VudCkgPiAoTlVNX1JFUV9RX0VOVFJJRVMgLyA0KSkpCisJCQluZXRpZl93YWtlX3F1ZXVlKHFkZXYtPm5kZXYpOworCX0KKworCXJldHVybiAqdHhfY2xlYW5lZCArICpyeF9jbGVhbmVkOworfQorCitzdGF0aWMgaW50IHFsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCB3b3JrX3RvX2RvID0gbWluKCpidWRnZXQsIG5kZXYtPnF1b3RhKTsKKwlpbnQgcnhfY2xlYW5lZCA9IDAsIHR4X2NsZWFuZWQgPSAwOworCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5kZXYpKQorCQlnb3RvIHF1aXRfcG9sbGluZzsKKworCXFsX3R4X3J4X2NsZWFuKHFkZXYsICZ0eF9jbGVhbmVkLCAmcnhfY2xlYW5lZCwgd29ya190b19kbyk7CisJKmJ1ZGdldCAtPSByeF9jbGVhbmVkOworCW5kZXYtPnF1b3RhIC09IHJ4X2NsZWFuZWQ7CisKKwlpZiAoKCF0eF9jbGVhbmVkICYmICFyeF9jbGVhbmVkKSB8fCAhbmV0aWZfcnVubmluZyhuZGV2KSkgeworcXVpdF9wb2xsaW5nOgorCQluZXRpZl9yeF9jb21wbGV0ZShuZGV2KTsKKwkJcWxfZW5hYmxlX2ludGVycnVwdHMocWRldik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlycXJldHVybl90IHFsM3h4eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2lkOworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyIHZhbHVlOworCWludCBoYW5kbGVkID0gMTsKKwl1MzIgdmFyOworCisJcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwl2YWx1ZSA9CisJICAgIHFsX3JlYWRfY29tbW9uX3JlZ19sKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwQ29udHJvbFN0YXR1cyk7CisKKwlpZiAodmFsdWUgJiAoSVNQX0NPTlRST0xfRkUgfCBJU1BfQ09OVFJPTF9SSSkpIHsKKwkJc3Bpbl9sb2NrKCZxZGV2LT5hZGFwdGVyX2xvY2spOworCQluZXRpZl9zdG9wX3F1ZXVlKHFkZXYtPm5kZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihxZGV2LT5uZGV2KTsKKwkJcWxfZGlzYWJsZV9pbnRlcnJ1cHRzKHFkZXYpOworCQlxZGV2LT5wb3J0X2xpbmtfc3RhdGUgPSBMU19ET1dOOworCQlzZXRfYml0KFFMX1JFU0VUX0FDVElWRSwmcWRldi0+ZmxhZ3MpIDsKKworCQlpZiAodmFsdWUgJiBJU1BfQ09OVFJPTF9GRSkgeworCQkJLyoKKwkJCSAqIENoaXAgRmF0YWwgRXJyb3IuCisJCQkgKi8KKwkJCXZhciA9CisJCQkgICAgcWxfcmVhZF9wYWdlMF9yZWdfbChxZGV2LAorCQkJCQkgICAgICAmcG9ydF9yZWdzLT5Qb3J0RmF0YWxFcnJTdGF0dXMpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiJXM6IFJlc2V0dGluZyBjaGlwLiBQb3J0RmF0YWxFcnJTdGF0dXMgIgorCQkJICAgICAgICJyZWdpc3RlciA9IDB4JXhcbiIsIG5kZXYtPm5hbWUsIHZhcik7CisJCQlzZXRfYml0KFFMX1JFU0VUX1NUQVJULCZxZGV2LT5mbGFncykgOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFNvZnQgUmVzZXQgUmVxdWVzdGVkLgorCQkJICovCisJCQlzZXRfYml0KFFMX1JFU0VUX1BFUl9TQ1NJLCZxZGV2LT5mbGFncykgOworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJICAgICAgICIlczogQW5vdGhlciBmdW5jdGlvbiBpc3N1ZWQgYSByZXNldCB0byB0aGUgIgorCQkJICAgICAgICJjaGlwLiBJU1IgdmFsdWUgPSAleC5cbiIsIG5kZXYtPm5hbWUsIHZhbHVlKTsKKwkJfQorCQlxdWV1ZV93b3JrKHFkZXYtPndvcmtxdWV1ZSwgJnFkZXYtPnJlc2V0X3dvcmspOworCQlzcGluX3VubG9jaygmcWRldi0+YWRhcHRlcl9sb2NrKTsKKwl9IGVsc2UgaWYgKHZhbHVlICYgSVNQX0lNUl9ESVNBQkxFX0NNUExfSU5UKSB7CisJCXFsX2Rpc2FibGVfaW50ZXJydXB0cyhxZGV2KTsKKwkJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5kZXYpKSkKKwkJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmRldik7CisJCWVsc2UKKwkJCXFsX2VuYWJsZV9pbnRlcnJ1cHRzKHFkZXYpOworCX0gZWxzZSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBxbDN4eHhfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKKwlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICptYWNfaW9jYl9wdHI7CisJdTY0IG1hcDsKKworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmcWRldi0+dHhfY291bnQpIDwgMikpIHsKKwkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpKQorCQkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKwl0eF9jYiA9ICZxZGV2LT50eF9idWZbcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4XSA7CisJbWFjX2lvY2JfcHRyID0gdHhfY2ItPnF1ZXVlX2VudHJ5OworCW1lbXNldCgodm9pZCAqKW1hY19pb2NiX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBvYl9tYWNfaW9jYl9yZXEpKTsKKwltYWNfaW9jYl9wdHItPm9wY29kZSA9IHFkZXYtPm1hY19vYl9vcGNvZGU7CisJbWFjX2lvY2JfcHRyLT5mbGFncyB8PSBxZGV2LT5tYl9iaXRfbWFzazsKKwltYWNfaW9jYl9wdHItPnRyYW5zYWN0aW9uX2lkID0gcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4OworCW1hY19pb2NiX3B0ci0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUxNigodTE2KSBza2ItPmxlbik7CisJdHhfY2ItPnNrYiA9IHNrYjsKKwltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwltYWNfaW9jYl9wdHItPmJ1Zl9hZGRyMF9sb3cgPSBjcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7CisJbWFjX2lvY2JfcHRyLT5idWZfYWRkcjBfaGlnaCA9IGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKKwltYWNfaW9jYl9wdHItPmJ1Zl8wX2xlbiA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgT0JfTUFDX0lPQ0JfUkVRX0UpOworCXBjaV91bm1hcF9hZGRyX3NldCh0eF9jYiwgbWFwYWRkciwgbWFwKTsKKwlwY2lfdW5tYXBfbGVuX3NldCh0eF9jYiwgbWFwbGVuLCBza2ItPmxlbik7CisJYXRvbWljX2RlYygmcWRldi0+dHhfY291bnQpOworCisJcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4Kys7CisJaWYgKHFkZXYtPnJlcV9wcm9kdWNlcl9pbmRleCA9PSBOVU1fUkVRX1FfRU5UUklFUykKKwkJcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4ID0gMDsKKwl3bWIoKTsKKwlxbF93cml0ZV9jb21tb25fcmVnX2wocWRldiwKKwkJCSAgICAodTMyICopICYgcG9ydF9yZWdzLT5Db21tb25SZWdzLnJlcVFQcm9kdWNlckluZGV4LAorCQkJICAgIHFkZXYtPnJlcV9wcm9kdWNlcl9pbmRleCk7CisKKwluZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQocWRldikpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgbGVuICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4LCBza2ItPmxlbik7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorc3RhdGljIGludCBxbF9hbGxvY19uZXRfcmVxX3JzcF9xdWV1ZXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXFkZXYtPnJlcV9xX3NpemUgPQorCSAgICAodTMyKSAoTlVNX1JFUV9RX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IG9iX21hY19pb2NiX3JlcSkpOworCisJcWRldi0+cmVxX3FfdmlydF9hZGRyID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgKHNpemVfdCkgcWRldi0+cmVxX3Ffc2l6ZSwKKwkJCQkgJnFkZXYtPnJlcV9xX3BoeV9hZGRyKTsKKworCWlmICgocWRldi0+cmVxX3FfdmlydF9hZGRyID09IE5VTEwpIHx8CisJICAgIExTXzY0QklUUyhxZGV2LT5yZXFfcV9waHlfYWRkcikgJiAocWRldi0+cmVxX3Ffc2l6ZSAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiByZXFRIGZhaWxlZC5cbiIsCisJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcWRldi0+cnNwX3Ffc2l6ZSA9IE5VTV9SU1BfUV9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBuZXRfcnNwX2lvY2IpOworCisJcWRldi0+cnNwX3FfdmlydF9hZGRyID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgKHNpemVfdCkgcWRldi0+cnNwX3Ffc2l6ZSwKKwkJCQkgJnFkZXYtPnJzcF9xX3BoeV9hZGRyKTsKKworCWlmICgocWRldi0+cnNwX3FfdmlydF9hZGRyID09IE5VTEwpIHx8CisJICAgIExTXzY0QklUUyhxZGV2LT5yc3BfcV9waHlfYWRkcikgJiAocWRldi0+cnNwX3Ffc2l6ZSAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICIlczogcnNwUSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsIChzaXplX3QpIHFkZXYtPnJlcV9xX3NpemUsCisJCQkJICAgIHFkZXYtPnJlcV9xX3ZpcnRfYWRkciwKKwkJCQkgICAgcWRldi0+cmVxX3FfcGh5X2FkZHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZXRfYml0KFFMX0FMTE9DX1JFUV9SU1BfUV9ET05FLCZxZGV2LT5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9uZXRfcmVxX3JzcF9xdWV1ZXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCWlmICghdGVzdF9iaXQoUUxfQUxMT0NfUkVRX1JTUF9RX0RPTkUsJnFkZXYtPmZsYWdzKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkgICAgICAgIiVzOiBBbHJlYWR5IGRvbmUuXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCSAgICBxZGV2LT5yZXFfcV9zaXplLAorCQkJICAgIHFkZXYtPnJlcV9xX3ZpcnRfYWRkciwgcWRldi0+cmVxX3FfcGh5X2FkZHIpOworCisJcWRldi0+cmVxX3FfdmlydF9hZGRyID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCSAgICBxZGV2LT5yc3BfcV9zaXplLAorCQkJICAgIHFkZXYtPnJzcF9xX3ZpcnRfYWRkciwgcWRldi0+cnNwX3FfcGh5X2FkZHIpOworCisJcWRldi0+cnNwX3FfdmlydF9hZGRyID0gTlVMTDsKKworCWNsZWFyX2JpdChRTF9BTExPQ19SRVFfUlNQX1FfRE9ORSwmcWRldi0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHFsX2FsbG9jX2J1ZmZlcl9xdWV1ZXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCS8qIENyZWF0ZSBMYXJnZSBCdWZmZXIgUXVldWUgKi8KKwlxZGV2LT5scmdfYnVmX3Ffc2l6ZSA9CisJICAgIE5VTV9MQlVGUV9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBscmdfYnVmX3FfZW50cnkpOworCWlmIChxZGV2LT5scmdfYnVmX3Ffc2l6ZSA8IFBBR0VfU0laRSkKKwkJcWRldi0+bHJnX2J1Zl9xX2FsbG9jX3NpemUgPSBQQUdFX1NJWkU7CisJZWxzZQorCQlxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSA9IHFkZXYtPmxyZ19idWZfcV9zaXplICogMjsKKworCXFkZXYtPmxyZ19idWZfcV9hbGxvY192aXJ0X2FkZHIgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LAorCQkJCSBxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSwKKwkJCQkgJnFkZXYtPmxyZ19idWZfcV9hbGxvY19waHlfYWRkcik7CisKKwlpZiAocWRldi0+bHJnX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICIlczogbEJ1ZlEgZmFpbGVkXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXFkZXYtPmxyZ19idWZfcV92aXJ0X2FkZHIgPSBxZGV2LT5scmdfYnVmX3FfYWxsb2NfdmlydF9hZGRyOworCXFkZXYtPmxyZ19idWZfcV9waHlfYWRkciA9IHFkZXYtPmxyZ19idWZfcV9hbGxvY19waHlfYWRkcjsKKworCS8qIENyZWF0ZSBTbWFsbCBCdWZmZXIgUXVldWUgKi8KKwlxZGV2LT5zbWFsbF9idWZfcV9zaXplID0KKwkgICAgTlVNX1NCVUZRX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGxyZ19idWZfcV9lbnRyeSk7CisJaWYgKHFkZXYtPnNtYWxsX2J1Zl9xX3NpemUgPCBQQUdFX1NJWkUpCisJCXFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3NpemUgPSBQQUdFX1NJWkU7CisJZWxzZQorCQlxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19zaXplID0gcWRldi0+c21hbGxfYnVmX3Ffc2l6ZSAqIDI7CisKKwlxZGV2LT5zbWFsbF9idWZfcV9hbGxvY192aXJ0X2FkZHIgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LAorCQkJCSBxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19zaXplLAorCQkJCSAmcWRldi0+c21hbGxfYnVmX3FfYWxsb2NfcGh5X2FkZHIpOworCisJaWYgKHFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICIlczogU21hbGwgQnVmZmVyIFF1ZXVlIGFsbG9jYXRpb24gZmFpbGVkLlxuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsIHFkZXYtPmxyZ19idWZfcV9hbGxvY19zaXplLAorCQkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2NfdmlydF9hZGRyLAorCQkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2NfcGh5X2FkZHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlxZGV2LT5zbWFsbF9idWZfcV92aXJ0X2FkZHIgPSBxZGV2LT5zbWFsbF9idWZfcV9hbGxvY192aXJ0X2FkZHI7CisJcWRldi0+c21hbGxfYnVmX3FfcGh5X2FkZHIgPSBxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19waHlfYWRkcjsKKwlzZXRfYml0KFFMX0FMTE9DX0JVRlFTX0RPTkUsJnFkZXYtPmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9idWZmZXJfcXVldWVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpZiAoIXRlc3RfYml0KFFMX0FMTE9DX0JVRlFTX0RPTkUsJnFkZXYtPmZsYWdzKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkgICAgICAgIiVzOiBBbHJlYWR5IGRvbmUuXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSwKKwkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2NfdmlydF9hZGRyLAorCQkJICAgIHFkZXYtPmxyZ19idWZfcV9hbGxvY19waHlfYWRkcik7CisKKwlxZGV2LT5scmdfYnVmX3FfdmlydF9hZGRyID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCSAgICBxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19zaXplLAorCQkJICAgIHFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkciwKKwkJCSAgICBxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19waHlfYWRkcik7CisKKwlxZGV2LT5zbWFsbF9idWZfcV92aXJ0X2FkZHIgPSBOVUxMOworCisJY2xlYXJfYml0KFFMX0FMTE9DX0JVRlFTX0RPTkUsJnFkZXYtPmZsYWdzKTsKK30KKworc3RhdGljIGludCBxbF9hbGxvY19zbWFsbF9idWZmZXJzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVmcV9hZGRyX2VsZW1lbnQgKnNtYWxsX2J1Zl9xX2VudHJ5OworCisJLyogQ3VycmVudGx5IHdlIGFsbG9jYXRlIG9uIG9uZSBvZiBtZW1vcnkgYW5kIHVzZSBpdCBmb3Igc21hbGxidWZmZXJzICovCisJcWRldi0+c21hbGxfYnVmX3RvdGFsX3NpemUgPQorCSAgICAoUUxfQUREUl9FTEVfUEVSX0JVRlFfRU5UUlkgKiBOVU1fU0JVRlFfRU5UUklFUyAqCisJICAgICBRTF9TTUFMTF9CVUZGRVJfU0laRSk7CisKKwlxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgcWRldi0+c21hbGxfYnVmX3RvdGFsX3NpemUsCisJCQkJICZxZGV2LT5zbWFsbF9idWZfcGh5X2FkZHIpOworCisJaWYgKHFkZXYtPnNtYWxsX2J1Zl92aXJ0X2FkZHIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXM6IEZhaWxlZCB0byBnZXQgc21hbGwgYnVmZmVyIG1lbW9yeS5cbiIsCisJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcWRldi0+c21hbGxfYnVmX3BoeV9hZGRyX2xvdyA9IExTXzY0QklUUyhxZGV2LT5zbWFsbF9idWZfcGh5X2FkZHIpOworCXFkZXYtPnNtYWxsX2J1Zl9waHlfYWRkcl9oaWdoID0gTVNfNjRCSVRTKHFkZXYtPnNtYWxsX2J1Zl9waHlfYWRkcik7CisKKwlzbWFsbF9idWZfcV9lbnRyeSA9IHFkZXYtPnNtYWxsX2J1Zl9xX3ZpcnRfYWRkcjsKKworCXFkZXYtPmxhc3RfcnNwX29mZnNldCA9IHFkZXYtPnNtYWxsX2J1Zl9waHlfYWRkcl9sb3c7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBidWZmZXIgcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IChRTF9BRERSX0VMRV9QRVJfQlVGUV9FTlRSWSAqIE5VTV9TQlVGUV9FTlRSSUVTKTsgaSsrKSB7CisJCXNtYWxsX2J1Zl9xX2VudHJ5LT5hZGRyX2hpZ2ggPQorCQkgICAgY3B1X3RvX2xlMzIocWRldi0+c21hbGxfYnVmX3BoeV9hZGRyX2hpZ2gpOworCQlzbWFsbF9idWZfcV9lbnRyeS0+YWRkcl9sb3cgPQorCQkgICAgY3B1X3RvX2xlMzIocWRldi0+c21hbGxfYnVmX3BoeV9hZGRyX2xvdyArCisJCQkJKGkgKiBRTF9TTUFMTF9CVUZGRVJfU0laRSkpOworCQlzbWFsbF9idWZfcV9lbnRyeSsrOworCX0KKwlxZGV2LT5zbWFsbF9idWZfaW5kZXggPSAwOworCXNldF9iaXQoUUxfQUxMT0NfU01BTExfQlVGX0RPTkUsJnFkZXYtPmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9zbWFsbF9idWZmZXJzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpZiAoIXRlc3RfYml0KFFMX0FMTE9DX1NNQUxMX0JVRl9ET05FLCZxZGV2LT5mbGFncykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJICAgICAgICIlczogQWxyZWFkeSBkb25lLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHFkZXYtPnNtYWxsX2J1Zl92aXJ0X2FkZHIgIT0gTlVMTCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgIHFkZXYtPnNtYWxsX2J1Zl90b3RhbF9zaXplLAorCQkJCSAgICBxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyLAorCQkJCSAgICBxZGV2LT5zbWFsbF9idWZfcGh5X2FkZHIpOworCisJCXFkZXYtPnNtYWxsX2J1Zl92aXJ0X2FkZHIgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9sYXJnZV9idWZmZXJzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2I7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0xBUkdFX0JVRkZFUlM7IGkrKykgeworCQlscmdfYnVmX2NiID0gJnFkZXYtPmxyZ19idWZbaV07CisJCWlmIChscmdfYnVmX2NiLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IobHJnX2J1Zl9jYi0+c2tiKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUocWRldi0+cGRldiwKKwkJCQkJIHBjaV91bm1hcF9hZGRyKGxyZ19idWZfY2IsIG1hcGFkZHIpLAorCQkJCQkgcGNpX3VubWFwX2xlbihscmdfYnVmX2NiLCBtYXBsZW4pLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW1lbXNldChscmdfYnVmX2NiLCAwLCBzaXplb2Yoc3RydWN0IHFsX3Jjdl9idWZfY2IpKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBxbF9pbml0X2xhcmdlX2J1ZmZlcnMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpscmdfYnVmX2NiOworCXN0cnVjdCBidWZxX2FkZHJfZWxlbWVudCAqYnVmX2FkZHJfZWxlID0gcWRldi0+bHJnX2J1Zl9xX3ZpcnRfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fTEFSR0VfQlVGRkVSUzsgaSsrKSB7CisJCWxyZ19idWZfY2IgPSAmcWRldi0+bHJnX2J1ZltpXTsKKwkJYnVmX2FkZHJfZWxlLT5hZGRyX2hpZ2ggPSBscmdfYnVmX2NiLT5idWZfcGh5X2FkZHJfaGlnaDsKKwkJYnVmX2FkZHJfZWxlLT5hZGRyX2xvdyA9IGxyZ19idWZfY2ItPmJ1Zl9waHlfYWRkcl9sb3c7CisJCWJ1Zl9hZGRyX2VsZSsrOworCX0KKwlxZGV2LT5scmdfYnVmX2luZGV4ID0gMDsKKwlxZGV2LT5scmdfYnVmX3NrYl9jaGVjayA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfYWxsb2NfbGFyZ2VfYnVmZmVycyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1NjQgbWFwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9MQVJHRV9CVUZGRVJTOyBpKyspIHsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihxZGV2LT5scmdfYnVmZmVyX2xlbik7CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJICAgICAgICIlczogbGFyZ2UgYnVmZiBhbGxvYyBmYWlsZWQsICIKKwkJCSAgICAgICAiZm9yICVkIGJ5dGVzIGF0IGluZGV4ICVkLlxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLAorCQkJICAgICAgIHFkZXYtPmxyZ19idWZmZXJfbGVuICogMiwgaSk7CisJCQlxbF9mcmVlX2xhcmdlX2J1ZmZlcnMocWRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKworCQkJbHJnX2J1Zl9jYiA9ICZxZGV2LT5scmdfYnVmW2ldOworCQkJbWVtc2V0KGxyZ19idWZfY2IsIDAsIHNpemVvZihzdHJ1Y3QgcWxfcmN2X2J1Zl9jYikpOworCQkJbHJnX2J1Zl9jYi0+aW5kZXggPSBpOworCQkJbHJnX2J1Zl9jYi0+c2tiID0gc2tiOworCQkJLyoKKwkJCSAqIFdlIHNhdmUgc29tZSBzcGFjZSB0byBjb3B5IHRoZSBldGhoZHIgZnJvbSBmaXJzdAorCQkJICogYnVmZmVyCisJCQkgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgUUxfSEVBREVSX1NQQUNFKTsKKwkJCW1hcCA9IHBjaV9tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCisJCQkJCSAgICAgc2tiLT5kYXRhLAorCQkJCQkgICAgIHFkZXYtPmxyZ19idWZmZXJfbGVuIC0KKwkJCQkJICAgICBRTF9IRUFERVJfU1BBQ0UsCisJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChscmdfYnVmX2NiLCBtYXBhZGRyLCBtYXApOworCQkJcGNpX3VubWFwX2xlbl9zZXQobHJnX2J1Zl9jYiwgbWFwbGVuLAorCQkJCQkgIHFkZXYtPmxyZ19idWZmZXJfbGVuIC0KKwkJCQkJICBRTF9IRUFERVJfU1BBQ0UpOworCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2xvdyA9CisJCQkgICAgY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2hpZ2ggPQorCQkJICAgIGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWxfY3JlYXRlX3NlbmRfZnJlZV9saXN0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpyZXFfcV9jdXJyID0KKwkJCQkJcWRldi0+cmVxX3FfdmlydF9hZGRyOworCisJLyogQ3JlYXRlIGZyZWUgbGlzdCBvZiB0cmFuc21pdCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKKwkJdHhfY2IgPSAmcWRldi0+dHhfYnVmW2ldOworCQl0eF9jYi0+c2tiID0gTlVMTDsKKwkJdHhfY2ItPnF1ZXVlX2VudHJ5ID0gcmVxX3FfY3VycjsKKwkJcmVxX3FfY3VycisrOworCX0KK30KKworc3RhdGljIGludCBxbF9hbGxvY19tZW1fcmVzb3VyY2VzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlpZiAocWRldi0+bmRldi0+bXR1ID09IE5PUk1BTF9NVFVfU0laRSkKKwkJcWRldi0+bHJnX2J1ZmZlcl9sZW4gPSBOT1JNQUxfTVRVX1NJWkU7CisJZWxzZSBpZiAocWRldi0+bmRldi0+bXR1ID09IEpVTUJPX01UVV9TSVpFKSB7CisJCXFkZXYtPmxyZ19idWZmZXJfbGVuID0gSlVNQk9fTVRVX1NJWkU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBJbnZhbGlkIG10dSBzaXplLiAgT25seSAxNTAwIGFuZCA5MDAwIGFyZSBhY2NlcHRlZC5cbiIsCisJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXFkZXYtPmxyZ19idWZmZXJfbGVuICs9IFZMQU5fRVRIX0hMRU4gKyBWTEFOX0lEX0xFTiArIFFMX0hFQURFUl9TUEFDRTsKKwlxZGV2LT5tYXhfZnJhbWVfc2l6ZSA9CisJICAgIChxZGV2LT5scmdfYnVmZmVyX2xlbiAtIFFMX0hFQURFUl9TUEFDRSkgKyBFVEhFUk5FVF9DUkNfU0laRTsKKworCS8qCisJICogRmlyc3QgYWxsb2NhdGUgYSBwYWdlIG9mIHNoYXJlZCBtZW1vcnkgYW5kIHVzZSBpdCBmb3Igc2hhZG93CisJICogbG9jYXRpb25zIG9mIE5ldHdvcmsgUmVxdWVzdCBRdWV1ZSBDb25zdW1lciBBZGRyZXNzIFJlZ2lzdGVyIGFuZAorCSAqIE5ldHdvcmsgQ29tcGxldGlvbiBRdWV1ZSBQcm9kdWNlciBJbmRleCBSZWdpc3RlcgorCSAqLworCXFkZXYtPnNoYWRvd19yZWdfdmlydF9hZGRyID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgUEFHRV9TSVpFLCAmcWRldi0+c2hhZG93X3JlZ19waHlfYWRkcik7CisKKwlpZiAocWRldi0+c2hhZG93X3JlZ192aXJ0X2FkZHIgIT0gTlVMTCkgeworCQlxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4ID0gKHUxNiAqKSBxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkcjsKKwkJcWRldi0+cmVxX2NvbnN1bWVyX2luZGV4X3BoeV9hZGRyX2hpZ2ggPQorCQkgICAgTVNfNjRCSVRTKHFkZXYtPnNoYWRvd19yZWdfcGh5X2FkZHIpOworCQlxZGV2LT5yZXFfY29uc3VtZXJfaW5kZXhfcGh5X2FkZHJfbG93ID0KKwkJICAgIExTXzY0QklUUyhxZGV2LT5zaGFkb3dfcmVnX3BoeV9hZGRyKTsKKworCQlxZGV2LT5wcnNwX3Byb2R1Y2VyX2luZGV4ID0KKwkJICAgICh1MzIgKikgKCgodTggKikgcWRldi0+cHJlcV9jb25zdW1lcl9pbmRleCkgKyA4KTsKKwkJcWRldi0+cnNwX3Byb2R1Y2VyX2luZGV4X3BoeV9hZGRyX2hpZ2ggPQorCQkgICAgcWRldi0+cmVxX2NvbnN1bWVyX2luZGV4X3BoeV9hZGRyX2hpZ2g7CisJCXFkZXYtPnJzcF9wcm9kdWNlcl9pbmRleF9waHlfYWRkcl9sb3cgPQorCQkgICAgcWRldi0+cmVxX2NvbnN1bWVyX2luZGV4X3BoeV9hZGRyX2xvdyArIDg7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBzaGFkb3dSZWcgQWxsb2MgZmFpbGVkLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChxbF9hbGxvY19uZXRfcmVxX3JzcF9xdWV1ZXMocWRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXM6IHFsX2FsbG9jX25ldF9yZXFfcnNwX3F1ZXVlcyBmYWlsZWQuXG4iLAorCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCWdvdG8gZXJyX3JlcV9yc3A7CisJfQorCisJaWYgKHFsX2FsbG9jX2J1ZmZlcl9xdWV1ZXMocWRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXM6IHFsX2FsbG9jX2J1ZmZlcl9xdWV1ZXMgZmFpbGVkLlxuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQlnb3RvIGVycl9idWZmZXJfcXVldWVzOworCX0KKworCWlmIChxbF9hbGxvY19zbWFsbF9idWZmZXJzKHFkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBxbF9hbGxvY19zbWFsbF9idWZmZXJzIGZhaWxlZFxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCWdvdG8gZXJyX3NtYWxsX2J1ZmZlcnM7CisJfQorCisJaWYgKHFsX2FsbG9jX2xhcmdlX2J1ZmZlcnMocWRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXM6IHFsX2FsbG9jX2xhcmdlX2J1ZmZlcnMgZmFpbGVkXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJZ290byBlcnJfc21hbGxfYnVmZmVyczsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBsYXJnZSBidWZmZXIgcXVldWUuICovCisJcWxfaW5pdF9sYXJnZV9idWZmZXJzKHFkZXYpOworCXFsX2NyZWF0ZV9zZW5kX2ZyZWVfbGlzdChxZGV2KTsKKworCXFkZXYtPnJzcF9jdXJyZW50ID0gcWRldi0+cnNwX3FfdmlydF9hZGRyOworCisJcmV0dXJuIDA7CisKK2Vycl9zbWFsbF9idWZmZXJzOgorCXFsX2ZyZWVfYnVmZmVyX3F1ZXVlcyhxZGV2KTsKK2Vycl9idWZmZXJfcXVldWVzOgorCXFsX2ZyZWVfbmV0X3JlcV9yc3BfcXVldWVzKHFkZXYpOworZXJyX3JlcV9yc3A6CisJcGNpX2ZyZWVfY29uc2lzdGVudChxZGV2LT5wZGV2LAorCQkJICAgIFBBR0VfU0laRSwKKwkJCSAgICBxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkciwKKwkJCSAgICBxZGV2LT5zaGFkb3dfcmVnX3BoeV9hZGRyKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBxbF9mcmVlX21lbV9yZXNvdXJjZXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXFsX2ZyZWVfbGFyZ2VfYnVmZmVycyhxZGV2KTsKKwlxbF9mcmVlX3NtYWxsX2J1ZmZlcnMocWRldik7CisJcWxfZnJlZV9idWZmZXJfcXVldWVzKHFkZXYpOworCXFsX2ZyZWVfbmV0X3JlcV9yc3BfcXVldWVzKHFkZXYpOworCWlmIChxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkciAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgICAgUEFHRV9TSVpFLAorCQkJCSAgICBxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkciwKKwkJCQkgICAgcWRldi0+c2hhZG93X3JlZ19waHlfYWRkcik7CisJCXFkZXYtPnNoYWRvd19yZWdfdmlydF9hZGRyID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWxfaW5pdF9taXNjX3JlZ2lzdGVycyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9sb2NhbF9yYW1fcmVnaXN0ZXJzICpsb2NhbF9yYW0gPQorCSAgICAoc3RydWN0IHFsM3h4eF9sb2NhbF9yYW1fcmVnaXN0ZXJzICopcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfRERSX1JBTV9TRU1fTUFTSywKKwkJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKKwkJCSAyKSA8PCA0KSkKKwkJcmV0dXJuIC0xOworCisJcWxfd3JpdGVfcGFnZTJfcmVnKHFkZXYsCisJCQkgICAmbG9jYWxfcmFtLT5idWZsZXRTaXplLCBxZGV2LT5udnJhbV9kYXRhLmJ1ZmxldFNpemUpOworCisJcWxfd3JpdGVfcGFnZTJfcmVnKHFkZXYsCisJCQkgICAmbG9jYWxfcmFtLT5tYXhCdWZsZXRDb3VudCwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEuYnVmbGV0Q291bnQpOworCisJcWxfd3JpdGVfcGFnZTJfcmVnKHFkZXYsCisJCQkgICAmbG9jYWxfcmFtLT5mcmVlQnVmbGV0VGhyZXNob2xkTG93LAorCQkJICAgKHFkZXYtPm52cmFtX2RhdGEudGNwV2luZG93VGhyZXNob2xkMjUgPDwgMTYpIHwKKwkJCSAgIChxZGV2LT5udnJhbV9kYXRhLnRjcFdpbmRvd1RocmVzaG9sZDApKTsKKworCXFsX3dyaXRlX3BhZ2UyX3JlZyhxZGV2LAorCQkJICAgJmxvY2FsX3JhbS0+ZnJlZUJ1ZmxldFRocmVzaG9sZEhpZ2gsCisJCQkgICBxZGV2LT5udnJhbV9kYXRhLnRjcFdpbmRvd1RocmVzaG9sZDUwKTsKKworCXFsX3dyaXRlX3BhZ2UyX3JlZyhxZGV2LAorCQkJICAgJmxvY2FsX3JhbS0+aXBIYXNoVGFibGVCYXNlLAorCQkJICAgKHFkZXYtPm52cmFtX2RhdGEuaXBIYXNoVGFibGVCYXNlSGkgPDwgMTYpIHwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEuaXBIYXNoVGFibGVCYXNlTG8pOworCXFsX3dyaXRlX3BhZ2UyX3JlZyhxZGV2LAorCQkJICAgJmxvY2FsX3JhbS0+aXBIYXNoVGFibGVDb3VudCwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEuaXBIYXNoVGFibGVTaXplKTsKKwlxbF93cml0ZV9wYWdlMl9yZWcocWRldiwKKwkJCSAgICZsb2NhbF9yYW0tPnRjcEhhc2hUYWJsZUJhc2UsCisJCQkgICAocWRldi0+bnZyYW1fZGF0YS50Y3BIYXNoVGFibGVCYXNlSGkgPDwgMTYpIHwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEudGNwSGFzaFRhYmxlQmFzZUxvKTsKKwlxbF93cml0ZV9wYWdlMl9yZWcocWRldiwKKwkJCSAgICZsb2NhbF9yYW0tPnRjcEhhc2hUYWJsZUNvdW50LAorCQkJICAgcWRldi0+bnZyYW1fZGF0YS50Y3BIYXNoVGFibGVTaXplKTsKKwlxbF93cml0ZV9wYWdlMl9yZWcocWRldiwKKwkJCSAgICZsb2NhbF9yYW0tPm5jYkJhc2UsCisJCQkgICAocWRldi0+bnZyYW1fZGF0YS5uY2JUYWJsZUJhc2VIaSA8PCAxNikgfAorCQkJICAgcWRldi0+bnZyYW1fZGF0YS5uY2JUYWJsZUJhc2VMbyk7CisJcWxfd3JpdGVfcGFnZTJfcmVnKHFkZXYsCisJCQkgICAmbG9jYWxfcmFtLT5tYXhOY2JDb3VudCwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEubmNiVGFibGVTaXplKTsKKwlxbF93cml0ZV9wYWdlMl9yZWcocWRldiwKKwkJCSAgICZsb2NhbF9yYW0tPmRyYkJhc2UsCisJCQkgICAocWRldi0+bnZyYW1fZGF0YS5kcmJUYWJsZUJhc2VIaSA8PCAxNikgfAorCQkJICAgcWRldi0+bnZyYW1fZGF0YS5kcmJUYWJsZUJhc2VMbyk7CisJcWxfd3JpdGVfcGFnZTJfcmVnKHFkZXYsCisJCQkgICAmbG9jYWxfcmFtLT5tYXhEcmJDb3VudCwKKwkJCSAgIHFkZXYtPm52cmFtX2RhdGEuZHJiVGFibGVTaXplKTsKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX0REUl9SQU1fU0VNX01BU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFsX2FkYXB0ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIHZhbHVlOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9ob3N0X21lbW9yeV9yZWdpc3RlcnMgX19pb21lbSAqaG1lbV9yZWdzID0KKwkgICAgKHN0cnVjdCBxbDN4eHhfaG9zdF9tZW1vcnlfcmVnaXN0ZXJzICopcG9ydF9yZWdzOworCXUzMiBkZWxheSA9IDEwOworCWludCBzdGF0dXMgPSAwOworCisJaWYocWxfbWlpX3NldHVwKHFkZXYpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBCcmluZyBvdXQgUEhZIG91dCBvZiByZXNldCAqLworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCQkJICAgIChJU1BfU0VSSUFMX1BPUlRfSUZfV0UgfAorCQkJICAgICAoSVNQX1NFUklBTF9QT1JUX0lGX1dFIDw8IDE2KSkpOworCisJcWRldi0+cG9ydF9saW5rX3N0YXRlID0gTFNfRE9XTjsKKwluZXRpZl9jYXJyaWVyX29mZihxZGV2LT5uZGV2KTsKKworCS8qIFYyIGNoaXAgZml4IGZvciBBUlMtMzkxNjguICovCisJcWxfd3JpdGVfY29tbW9uX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCisJCQkgICAgKElTUF9TRVJJQUxfUE9SVF9JRl9TREUgfAorCQkJICAgICAoSVNQX1NFUklBTF9QT1JUX0lGX1NERSA8PCAxNikpKTsKKworCS8qIFJlcXVlc3QgUXVldWUgUmVnaXN0ZXJzICovCisJKigodTMyICopIChxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4KSkgPSAwOworCWF0b21pY19zZXQoJnFkZXYtPnR4X2NvdW50LE5VTV9SRVFfUV9FTlRSSUVTKTsKKwlxZGV2LT5yZXFfcHJvZHVjZXJfaW5kZXggPSAwOworCisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsCisJCQkgICAmaG1lbV9yZWdzLT5yZXFDb25zdW1lckluZGV4QWRkckhpZ2gsCisJCQkgICBxZGV2LT5yZXFfY29uc3VtZXJfaW5kZXhfcGh5X2FkZHJfaGlnaCk7CisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsCisJCQkgICAmaG1lbV9yZWdzLT5yZXFDb25zdW1lckluZGV4QWRkckxvdywKKwkJCSAgIHFkZXYtPnJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9sb3cpOworCisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsCisJCQkgICAmaG1lbV9yZWdzLT5yZXFCYXNlQWRkckhpZ2gsCisJCQkgICBNU182NEJJVFMocWRldi0+cmVxX3FfcGh5X2FkZHIpKTsKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJlcUJhc2VBZGRyTG93LAorCQkJICAgTFNfNjRCSVRTKHFkZXYtPnJlcV9xX3BoeV9hZGRyKSk7CisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsICZobWVtX3JlZ3MtPnJlcUxlbmd0aCwgTlVNX1JFUV9RX0VOVFJJRVMpOworCisJLyogUmVzcG9uc2UgUXVldWUgUmVnaXN0ZXJzICovCisJKigodTE2ICopIChxZGV2LT5wcnNwX3Byb2R1Y2VyX2luZGV4KSkgPSAwOworCXFkZXYtPnJzcF9jb25zdW1lcl9pbmRleCA9IDA7CisJcWRldi0+cnNwX2N1cnJlbnQgPSBxZGV2LT5yc3BfcV92aXJ0X2FkZHI7CisKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJzcFByb2R1Y2VySW5kZXhBZGRySGlnaCwKKwkJCSAgIHFkZXYtPnJzcF9wcm9kdWNlcl9pbmRleF9waHlfYWRkcl9oaWdoKTsKKworCXFsX3dyaXRlX3BhZ2UxX3JlZyhxZGV2LAorCQkJICAgJmhtZW1fcmVncy0+cnNwUHJvZHVjZXJJbmRleEFkZHJMb3csCisJCQkgICBxZGV2LT5yc3BfcHJvZHVjZXJfaW5kZXhfcGh5X2FkZHJfbG93KTsKKworCXFsX3dyaXRlX3BhZ2UxX3JlZyhxZGV2LAorCQkJICAgJmhtZW1fcmVncy0+cnNwQmFzZUFkZHJIaWdoLAorCQkJICAgTVNfNjRCSVRTKHFkZXYtPnJzcF9xX3BoeV9hZGRyKSk7CisKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJzcEJhc2VBZGRyTG93LAorCQkJICAgTFNfNjRCSVRTKHFkZXYtPnJzcF9xX3BoeV9hZGRyKSk7CisKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwgJmhtZW1fcmVncy0+cnNwTGVuZ3RoLCBOVU1fUlNQX1FfRU5UUklFUyk7CisKKwkvKiBMYXJnZSBCdWZmZXIgUXVldWUgKi8KKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJ4TGFyZ2VRQmFzZUFkZHJIaWdoLAorCQkJICAgTVNfNjRCSVRTKHFkZXYtPmxyZ19idWZfcV9waHlfYWRkcikpOworCisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsCisJCQkgICAmaG1lbV9yZWdzLT5yeExhcmdlUUJhc2VBZGRyTG93LAorCQkJICAgTFNfNjRCSVRTKHFkZXYtPmxyZ19idWZfcV9waHlfYWRkcikpOworCisJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsICZobWVtX3JlZ3MtPnJ4TGFyZ2VRTGVuZ3RoLCBOVU1fTEJVRlFfRU5UUklFUyk7CisKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJ4TGFyZ2VCdWZmZXJMZW5ndGgsCisJCQkgICBxZGV2LT5scmdfYnVmZmVyX2xlbik7CisKKwkvKiBTbWFsbCBCdWZmZXIgUXVldWUgKi8KKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJ4U21hbGxRQmFzZUFkZHJIaWdoLAorCQkJICAgTVNfNjRCSVRTKHFkZXYtPnNtYWxsX2J1Zl9xX3BoeV9hZGRyKSk7CisKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJ4U21hbGxRQmFzZUFkZHJMb3csCisJCQkgICBMU182NEJJVFMocWRldi0+c21hbGxfYnVmX3FfcGh5X2FkZHIpKTsKKworCXFsX3dyaXRlX3BhZ2UxX3JlZyhxZGV2LCAmaG1lbV9yZWdzLT5yeFNtYWxsUUxlbmd0aCwgTlVNX1NCVUZRX0VOVFJJRVMpOworCXFsX3dyaXRlX3BhZ2UxX3JlZyhxZGV2LAorCQkJICAgJmhtZW1fcmVncy0+cnhTbWFsbEJ1ZmZlckxlbmd0aCwKKwkJCSAgIFFMX1NNQUxMX0JVRkZFUl9TSVpFKTsKKworCXFkZXYtPnNtYWxsX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID0gTlVNX1NCVUZRX0VOVFJJRVMgLSAxOworCXFkZXYtPnNtYWxsX2J1Zl9yZWxlYXNlX2NudCA9IDg7CisJcWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID0gTlVNX0xCVUZRX0VOVFJJRVMgLSAxOworCXFkZXYtPmxyZ19idWZfcmVsZWFzZV9jbnQgPSA4OworCXFkZXYtPmxyZ19idWZfbmV4dF9mcmVlID0KKwkgICAgKHN0cnVjdCBidWZxX2FkZHJfZWxlbWVudCAqKXFkZXYtPmxyZ19idWZfcV92aXJ0X2FkZHI7CisJcWRldi0+c21hbGxfYnVmX2luZGV4ID0gMDsKKwlxZGV2LT5scmdfYnVmX2luZGV4ID0gMDsKKwlxZGV2LT5scmdfYnVmX2ZyZWVfY291bnQgPSAwOworCXFkZXYtPmxyZ19idWZfZnJlZV9oZWFkID0gTlVMTDsKKwlxZGV2LT5scmdfYnVmX2ZyZWVfdGFpbCA9IE5VTEw7CisKKwlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkgICAgKHUzMiAqKSAmIHBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCSAgICByeFNtYWxsUVByb2R1Y2VySW5kZXgsCisJCQkgICAgcWRldi0+c21hbGxfYnVmX3FfcHJvZHVjZXJfaW5kZXgpOworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCSAgICAodTMyICopICYgcG9ydF9yZWdzLT5Db21tb25SZWdzLgorCQkJICAgIHJ4TGFyZ2VRUHJvZHVjZXJJbmRleCwKKwkJCSAgICBxZGV2LT5scmdfYnVmX3FfcHJvZHVjZXJfaW5kZXgpOworCisJLyoKKwkgKiBGaW5kIG91dCBpZiB0aGUgY2hpcCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiAgSWYgaXQgaGFzLCB0aGVuCisJICogd2Ugc2tpcCBzb21lIG9mIHRoZSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwljbGVhcl9iaXQoUUxfTElOS19NQVNURVIsICZxZGV2LT5mbGFncyk7CisJdmFsdWUgPSBxbF9yZWFkX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5wb3J0U3RhdHVzKTsKKwlpZiAoKHZhbHVlICYgUE9SVF9TVEFUVVNfSUMpID09IDApIHsKKworCQkvKiBDaGlwIGhhcyBub3QgYmVlbiBjb25maWd1cmVkIHlldCwgc28gbGV0IGl0IHJpcC4gKi8KKwkJaWYocWxfaW5pdF9taXNjX3JlZ2lzdGVycyhxZGV2KSkgeworCQkJc3RhdHVzID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChxZGV2LT5tYWNfaW5kZXgpCisJCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwKKwkJCQkJICAgJnBvcnRfcmVncy0+bWFjMU1heEZyYW1lTGVuZ3RoUmVnLAorCQkJCQkgICBxZGV2LT5tYXhfZnJhbWVfc2l6ZSk7CisJCWVsc2UKKwkJCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LAorCQkJCQkgICAmcG9ydF9yZWdzLT5tYWMwTWF4RnJhbWVMZW5ndGhSZWcsCisJCQkJCSAgIHFkZXYtPm1heF9mcmFtZV9zaXplKTsKKworCQl2YWx1ZSA9IHFkZXYtPm52cmFtX2RhdGEudGNwTWF4V2luZG93U2l6ZTsKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnRjcE1heFdpbmRvdywgdmFsdWUpOworCisJCXZhbHVlID0gKDB4RkZGRiA8PCAxNikgfCBxZGV2LT5udnJhbV9kYXRhLmV4dEh3Q29uZmlnOworCisJCWlmKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9GTEFTSF9TRU1fTUFTSywKKwkJCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KQorCQkJCSAqIDIpIDw8IDEzKSkgeworCQkJc3RhdHVzID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+RXh0ZXJuYWxIV0NvbmZpZywgdmFsdWUpOworCQlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+SW50ZXJuYWxDaGlwQ29uZmlnLAorCQkJCSAgICgoKElOVEVSTkFMX0NISVBfU0QgfCBJTlRFUk5BTF9DSElQX1dFKSA8PAorCQkJCSAgICAgMTYpIHwgKElOVEVSTkFMX0NISVBfU0QgfAorCQkJCQkgICAgSU5URVJOQUxfQ0hJUF9XRSkpKTsKKwkJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9GTEFTSF9TRU1fTUFTSyk7CisJfQorCisKKwlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwkJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKKwkJCSAyKSA8PCA3KSkgeworCQlzdGF0dXMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJcWxfaW5pdF9zY2FuX21vZGUocWRldik7CisJcWxfZ2V0X3BoeV9vd25lcihxZGV2KTsKKworCS8qIExvYWQgdGhlIE1BQyBDb25maWd1cmF0aW9uICovCisKKwkvKiBQcm9ncmFtIGxvd2VyIDMyIGJpdHMgb2YgdGhlIE1BQyBhZGRyZXNzICovCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY0FkZHJJbmRpcmVjdFB0clJlZywKKwkJCSAgIChNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1JQX01BU0sgPDwgMTYpKTsKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjQWRkckRhdGFSZWcsCisJCQkgICAoKHFkZXYtPm5kZXYtPmRldl9hZGRyWzJdIDw8IDI0KQorCQkJICAgIHwgKHFkZXYtPm5kZXYtPmRldl9hZGRyWzNdIDw8IDE2KQorCQkJICAgIHwgKHFkZXYtPm5kZXYtPmRldl9hZGRyWzRdIDw8IDgpCisJCQkgICAgfCBxZGV2LT5uZGV2LT5kZXZfYWRkcls1XSkpOworCisJLyogUHJvZ3JhbSB0b3AgMTYgYml0cyBvZiB0aGUgTUFDIGFkZHJlc3MgKi8KKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjQWRkckluZGlyZWN0UHRyUmVnLAorCQkJICAgKChNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1JQX01BU0sgPDwgMTYpIHwgMSkpOworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNBZGRyRGF0YVJlZywKKwkJCSAgICgocWRldi0+bmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkKKwkJCSAgICB8IHFkZXYtPm5kZXYtPmRldl9hZGRyWzFdKSk7CisKKwkvKiBFbmFibGUgUHJpbWFyeSBNQUMgKi8KKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjQWRkckluZGlyZWN0UHRyUmVnLAorCQkJICAgKChNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1BFIDw8IDE2KSB8CisJCQkgICAgTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19QRSkpOworCisJLyogQ2xlYXIgUHJpbWFyeSBhbmQgU2Vjb25kYXJ5IElQIGFkZHJlc3NlcyAqLworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5pcEFkZHJJbmRleFJlZywKKwkJCSAgICgoSVBfQUREUl9JTkRFWF9SRUdfTUFTSyA8PCAxNikgfAorCQkJICAgIChxZGV2LT5tYWNfaW5kZXggPDwgMikpKTsKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+aXBBZGRyRGF0YVJlZywgMCk7CisKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+aXBBZGRySW5kZXhSZWcsCisJCQkgICAoKElQX0FERFJfSU5ERVhfUkVHX01BU0sgPDwgMTYpIHwKKwkJCSAgICAoKHFkZXYtPm1hY19pbmRleCA8PCAyKSArIDEpKSk7CisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPmlwQWRkckRhdGFSZWcsIDApOworCisJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLKTsKKworCS8qIEluZGljYXRlIENvbmZpZ3VyYXRpb24gQ29tcGxldGUgKi8KKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwKKwkJCSAgICZwb3J0X3JlZ3MtPnBvcnRDb250cm9sLAorCQkJICAgKChQT1JUX0NPTlRST0xfQ0MgPDwgMTYpIHwgUE9SVF9DT05UUk9MX0NDKSk7CisKKwlkbyB7CisJCXZhbHVlID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CisJCWlmICh2YWx1ZSAmIFBPUlRfU1RBVFVTX0lDKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1MDApOworCX0gd2hpbGUgKC0tZGVsYXkpOworCisJaWYgKGRlbGF5ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBIdyBJbml0aWFsaXphdGlvbiB0aW1lb3V0LlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCXN0YXR1cyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFbmFibGUgRXRoZXJuZXQgRnVuY3Rpb24gKi8KKwl2YWx1ZSA9CisJICAgIChQT1JUX0NPTlRST0xfRUYgfCBQT1JUX0NPTlRST0xfRVQgfCBQT1JUX0NPTlRST0xfRUkgfAorCSAgICAgUE9SVF9DT05UUk9MX0hIKTsKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydENvbnRyb2wsCisJCQkgICAoKHZhbHVlIDw8IDE2KSB8IHZhbHVlKSk7CisKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgcWxfYWRhcHRlcl9yZXNldChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgdmFsdWU7CisJaW50IG1heF93YWl0X3RpbWU7CisKKwlzZXRfYml0KFFMX1JFU0VUX0FDVElWRSwgJnFkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoUUxfUkVTRVRfRE9ORSwgJnFkZXYtPmZsYWdzKTsKKworCS8qCisJICogSXNzdWUgc29mdCByZXNldCB0byBjaGlwLgorCSAqLworCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCSAgICAgICAiJXM6IElzc3VlIHNvZnQgcmVzZXQgdG8gY2hpcC5cbiIsCisJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCSAgICAodTMyICopICYgcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcENvbnRyb2xTdGF0dXMsCisJCQkgICAgKChJU1BfQ09OVFJPTF9TUiA8PCAxNikgfCBJU1BfQ09OVFJPTF9TUikpOworCisJLyogV2FpdCAzIHNlY29uZHMgZm9yIHJlc2V0IHRvIGNvbXBsZXRlLiAqLworCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCSAgICAgICAiJXM6IFdhaXQgMTAgbWlsbGlzZWNvbmRzIGZvciByZXNldCB0byBjb21wbGV0ZS5cbiIsCisJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCisJLyogV2FpdCB1bnRpbCB0aGUgZmlybXdhcmUgdGVsbHMgdXMgdGhlIFNvZnQgUmVzZXQgaXMgZG9uZSAqLworCW1heF93YWl0X3RpbWUgPSA1OworCWRvIHsKKwkJdmFsdWUgPQorCQkgICAgcWxfcmVhZF9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwQ29udHJvbFN0YXR1cyk7CisJCWlmICgodmFsdWUgJiBJU1BfQ09OVFJPTF9TUikgPT0gMCkKKwkJCWJyZWFrOworCisJCXNzbGVlcCgxKTsKKwl9IHdoaWxlICgoLS1tYXhfd2FpdF90aW1lKSk7CisKKwkvKgorCSAqIEFsc28sIG1ha2Ugc3VyZSB0aGF0IHRoZSBOZXR3b3JrIFJlc2V0IEludGVycnVwdCBiaXQgaGFzIGJlZW4KKwkgKiBjbGVhcmVkIGFmdGVyIHRoZSBzb2Z0IHJlc2V0IGhhcyB0YWtlbiBwbGFjZS4KKwkgKi8KKwl2YWx1ZSA9CisJICAgIHFsX3JlYWRfY29tbW9uX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcENvbnRyb2xTdGF0dXMpOworCWlmICh2YWx1ZSAmIElTUF9DT05UUk9MX1JJKSB7CisJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkgICAgICAgInFsX2FkYXB0ZXJfcmVzZXQ6IGNsZWFyaW5nIFJJIGFmdGVyIHJlc2V0LlxuIik7CisJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkgICAgKHUzMiAqKSAmIHBvcnRfcmVncy0+Q29tbW9uUmVncy4KKwkJCQkgICAgaXNwQ29udHJvbFN0YXR1cywKKwkJCQkgICAgKChJU1BfQ09OVFJPTF9SSSA8PCAxNikgfCBJU1BfQ09OVFJPTF9SSSkpOworCX0KKworCWlmIChtYXhfd2FpdF90aW1lID09IDApIHsKKwkJLyogSXNzdWUgRm9yY2UgU29mdCBSZXNldCAqLworCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICh1MzIgKikgJiBwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJICAgIGlzcENvbnRyb2xTdGF0dXMsCisJCQkJICAgICgoSVNQX0NPTlRST0xfRlNSIDw8IDE2KSB8CisJCQkJICAgICBJU1BfQ09OVFJPTF9GU1IpKTsKKwkJLyoKKwkJICogV2FpdCB1bnRpbCB0aGUgZmlybXdhcmUgdGVsbHMgdXMgdGhlIEZvcmNlIFNvZnQgUmVzZXQgaXMKKwkJICogZG9uZQorCQkgKi8KKwkJbWF4X3dhaXRfdGltZSA9IDU7CisJCWRvIHsKKwkJCXZhbHVlID0KKwkJCSAgICBxbF9yZWFkX2NvbW1vbl9yZWcocWRldiwKKwkJCQkJICAgICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJCSAgICAgICBpc3BDb250cm9sU3RhdHVzKTsKKwkJCWlmICgodmFsdWUgJiBJU1BfQ09OVFJPTF9GU1IpID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNzbGVlcCgxKTsKKwkJfSB3aGlsZSAoKC0tbWF4X3dhaXRfdGltZSkpOworCX0KKwlpZiAobWF4X3dhaXRfdGltZSA9PSAwKQorCQlzdGF0dXMgPSAxOworCisJY2xlYXJfYml0KFFMX1JFU0VUX0FDVElWRSwgJnFkZXYtPmZsYWdzKTsKKwlzZXRfYml0KFFMX1JFU0VUX0RPTkUsICZxZGV2LT5mbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgcWxfc2V0X21hY19pbmZvKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXUzMiB2YWx1ZSwgcG9ydF9zdGF0dXM7CisJdTggZnVuY19udW1iZXI7CisKKwkvKiBHZXQgdGhlIGZ1bmN0aW9uIG51bWJlciAqLworCXZhbHVlID0KKwkgICAgcWxfcmVhZF9jb21tb25fcmVnX2wocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzKTsKKwlmdW5jX251bWJlciA9ICh1OCkgKCh2YWx1ZSA+PiA0KSAmIE9QQ09ERV9GVU5DX0lEX01BU0spOworCXBvcnRfc3RhdHVzID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CisJc3dpdGNoICh2YWx1ZSAmIElTUF9DT05UUk9MX0ZOX01BU0spIHsKKwljYXNlIElTUF9DT05UUk9MX0ZOMF9ORVQ6CisJCXFkZXYtPm1hY19pbmRleCA9IDA7CisJCXFkZXYtPm1hY19vYl9vcGNvZGUgPSBPVVRCT1VORF9NQUNfSU9DQiB8IGZ1bmNfbnVtYmVyOworCQlxZGV2LT50Y3Bfb2Jfb3Bjb2RlID0gT1VUQk9VTkRfVENQX0lPQ0IgfCBmdW5jX251bWJlcjsKKwkJcWRldi0+dXBkYXRlX29iX29wY29kZSA9IFVQREFURV9OQ0JfSU9DQiB8IGZ1bmNfbnVtYmVyOworCQlxZGV2LT5tYl9iaXRfbWFzayA9IEZOMF9NQV9CSVRTX01BU0s7CisJCXFkZXYtPlBIWUFkZHIgPSBQT1JUMF9QSFlfQUREUkVTUzsKKwkJaWYgKHBvcnRfc3RhdHVzICYgUE9SVF9TVEFUVVNfU00wKQorCQkJc2V0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KFFMX0xJTktfT1BUSUNBTCwmcWRldi0+ZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVNQX0NPTlRST0xfRk4xX05FVDoKKwkJcWRldi0+bWFjX2luZGV4ID0gMTsKKwkJcWRldi0+bWFjX29iX29wY29kZSA9IE9VVEJPVU5EX01BQ19JT0NCIHwgZnVuY19udW1iZXI7CisJCXFkZXYtPnRjcF9vYl9vcGNvZGUgPSBPVVRCT1VORF9UQ1BfSU9DQiB8IGZ1bmNfbnVtYmVyOworCQlxZGV2LT51cGRhdGVfb2Jfb3Bjb2RlID0gVVBEQVRFX05DQl9JT0NCIHwgZnVuY19udW1iZXI7CisJCXFkZXYtPm1iX2JpdF9tYXNrID0gRk4xX01BX0JJVFNfTUFTSzsKKwkJcWRldi0+UEhZQWRkciA9IFBPUlQxX1BIWV9BRERSRVNTOworCQlpZiAocG9ydF9zdGF0dXMgJiBQT1JUX1NUQVRVU19TTTEpCisJCQlzZXRfYml0KFFMX0xJTktfT1BUSUNBTCwmcWRldi0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBJU1BfQ09OVFJPTF9GTjBfU0NTSToKKwljYXNlIElTUF9DT05UUk9MX0ZOMV9TQ1NJOgorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkgICAgICAgIiVzOiBJbnZhbGlkIGZ1bmN0aW9uIG51bWJlciwgaXNwQ29udHJvbFN0YXR1cyA9IDB4JXhcbiIsCisJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLHZhbHVlKTsKKwkJYnJlYWs7CisJfQorCXFkZXYtPm51bVBvcnRzID0gcWRldi0+bnZyYW1fZGF0YS5udW1Qb3J0czsKK30KKworc3RhdGljIHZvaWQgcWxfZGlzcGxheV9kZXZfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBxZGV2LT5wZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkgICAgICAgIlxuJXMgQWRhcHRlciAlZCBSZXZpc2lvbklEICVkIGZvdW5kIG9uIFBDSSBzbG90ICVkLlxuIiwKKwkgICAgICAgRFJWX05BTUUsIHFkZXYtPmluZGV4LCBxZGV2LT5jaGlwX3Jldl9pZCwgcWRldi0+cGNpX3Nsb3QpOworCXByaW50ayhLRVJOX0lORk8gUEZYCisJICAgICAgICIlcyBJbnRlcmZhY2UuXG4iLAorCSAgICAgICB0ZXN0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKSA/ICJPUFRJQ0FMIiA6ICJDT1BQRVIiKTsKKworCS8qCisJICogUHJpbnQgUENJIGJ1cyB3aWR0aC90eXBlLgorCSAqLworCXByaW50ayhLRVJOX0lORk8gUEZYCisJICAgICAgICJCdXMgaW50ZXJmYWNlIGlzICVzICVzLlxuIiwKKwkgICAgICAgKChxZGV2LT5wY2lfd2lkdGggPT0gNjQpID8gIjY0LWJpdCIgOiAiMzItYml0IiksCisJICAgICAgICgocWRldi0+cGNpX3gpID8gIlBDSS1YIiA6ICJQQ0kiKSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWAorCSAgICAgICAibWVtICBJTyBiYXNlIGFkZHJlc3MgYWRqdXN0ZWQgPSAweCVwXG4iLAorCSAgICAgICBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkludGVycnVwdCBudW1iZXIgPSAlZFxuIiwgcGRldi0+aXJxKTsKKworCWlmIChuZXRpZl9tc2dfcHJvYmUocWRldikpCisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiJXM6IE1BQyBhZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgbmRldi0+ZGV2X2FkZHJbMF0sIG5kZXYtPmRldl9hZGRyWzFdLAorCQkgICAgICAgbmRldi0+ZGV2X2FkZHJbMl0sIG5kZXYtPmRldl9hZGRyWzNdLCBuZGV2LT5kZXZfYWRkcls0XSwKKwkJICAgICAgIG5kZXYtPmRldl9hZGRyWzVdKTsKK30KKworc3RhdGljIGludCBxbF9hZGFwdGVyX2Rvd24oc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCBpbnQgZG9fcmVzZXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBxZGV2LT5uZGV2OworCWludCByZXR2YWwgPSAwOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKworCWNsZWFyX2JpdChRTF9BREFQVEVSX1VQLCZxZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KFFMX0xJTktfTUFTVEVSLCZxZGV2LT5mbGFncyk7CisKKwlxbF9kaXNhYmxlX2ludGVycnVwdHMocWRldik7CisKKwlmcmVlX2lycShxZGV2LT5wZGV2LT5pcnEsIG5kZXYpOworCisJaWYgKHFkZXYtPm1zaSAmJiB0ZXN0X2JpdChRTF9NU0lfRU5BQkxFRCwmcWRldi0+ZmxhZ3MpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiJXM6IGNhbGxpbmcgcGNpX2Rpc2FibGVfbXNpKCkuXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJY2xlYXJfYml0KFFMX01TSV9FTkFCTEVELCZxZGV2LT5mbGFncyk7CisJCXBjaV9kaXNhYmxlX21zaShxZGV2LT5wZGV2KTsKKwl9CisKKwlkZWxfdGltZXJfc3luYygmcWRldi0+YWRhcHRlcl90aW1lcik7CisKKwluZXRpZl9wb2xsX2Rpc2FibGUobmRldik7CisKKwlpZiAoZG9fcmVzZXQpIHsKKwkJaW50IHNvZnRfcmVzZXQ7CisJCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKwkJaWYgKHFsX3dhaXRfZm9yX2RydnJfbG9jayhxZGV2KSkgeworCQkJaWYgKChzb2Z0X3Jlc2V0ID0gcWxfYWRhcHRlcl9yZXNldChxZGV2KSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICIlczogcWxfYWRhcHRlcl9yZXNldCglZCkgRkFJTEVEIVxuIiwKKwkJCQkgICAgICAgbmRldi0+bmFtZSwgcWRldi0+aW5kZXgpOworCQkJfQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSIlczogUmVsZWFzZWluZyBkcml2ZXIgbG9jayB2aWEgY2hpcCByZXNldC5cbiIsbmRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWNxdWlyZSBkcml2ZXIgbG9jayB0byBkbyAiCisJCQkgICAgICAgInJlc2V0IVxuIiwgbmRldi0+bmFtZSk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJfQorCXFsX2ZyZWVfbWVtX3Jlc291cmNlcyhxZGV2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHFsX2FkYXB0ZXJfdXAoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcWRldi0+bmRldjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gU0FfU0FNUExFX1JBTkRPTSB8IFNBX1NISVJROworCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisKKwlpZiAocWxfYWxsb2NfbWVtX3Jlc291cmNlcyhxZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXMgVW5hYmxlIHRvICBhbGxvY2F0ZSBidWZmZXJzLlxuIiwgbmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChxZGV2LT5tc2kpIHsKKwkJaWYgKHBjaV9lbmFibGVfbXNpKHFkZXYtPnBkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBVc2VyIHJlcXVlc3RlZCBNU0ksIGJ1dCBNU0kgZmFpbGVkIHRvICIKKwkJCSAgICAgICAiaW5pdGlhbGl6ZS4gIENvbnRpbnVpbmcgd2l0aG91dCBNU0kuXG4iLAorCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJcWRldi0+bXNpID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTVNJIEVuYWJsZWQuLi5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJc2V0X2JpdChRTF9NU0lfRU5BQkxFRCwmcWRldi0+ZmxhZ3MpOworCQkJaXJxX2ZsYWdzICY9IH5TQV9TSElSUTsKKwkJfQorCX0KKworCWlmICgoZXJyID0gcmVxdWVzdF9pcnEocWRldi0+cGRldi0+aXJxLAorCQkJICAgICAgIHFsM3h4eF9pc3IsCisJCQkgICAgICAgaXJxX2ZsYWdzLCBuZGV2LT5uYW1lLCBuZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gcmVzZXJ2ZSBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgcWRldi0+cGRldi0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisKKwlpZiAoKGVyciA9IHFsX3dhaXRfZm9yX2RydnJfbG9jayhxZGV2KSkpIHsKKwkJaWYgKChlcnIgPSBxbF9hZGFwdGVyX2luaXRpYWxpemUocWRldikpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBhZGFwdGVyLlxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWdvdG8gZXJyX2luaXQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSIlczogUmVsZWFzZWluZyBkcml2ZXIgbG9jay5cbiIsbmRldi0+bmFtZSk7CisJCXFsX3NlbV91bmxvY2socWRldiwgUUxfRFJWUl9TRU1fTUFTSyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYXF1aXJlIGRyaXZlciBsb2NrLlxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycl9sb2NrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKworCXNldF9iaXQoUUxfQURBUFRFUl9VUCwmcWRldi0+ZmxhZ3MpOworCisJbW9kX3RpbWVyKCZxZGV2LT5hZGFwdGVyX3RpbWVyLCBqaWZmaWVzICsgSFogKiAxKTsKKworCW5ldGlmX3BvbGxfZW5hYmxlKG5kZXYpOworCXFsX2VuYWJsZV9pbnRlcnJ1cHRzKHFkZXYpOworCXJldHVybiAwOworCitlcnJfaW5pdDoKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX0RSVlJfU0VNX01BU0spOworZXJyX2xvY2s6CisJZnJlZV9pcnEocWRldi0+cGRldi0+aXJxLCBuZGV2KTsKK2Vycl9pcnE6CisJaWYgKHFkZXYtPm1zaSAmJiB0ZXN0X2JpdChRTF9NU0lfRU5BQkxFRCwmcWRldi0+ZmxhZ3MpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiJXM6IGNhbGxpbmcgcGNpX2Rpc2FibGVfbXNpKCkuXG4iLAorCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCWNsZWFyX2JpdChRTF9NU0lfRU5BQkxFRCwmcWRldi0+ZmxhZ3MpOworCQlwY2lfZGlzYWJsZV9tc2kocWRldi0+cGRldik7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcWxfY3ljbGVfYWRhcHRlcihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIGludCByZXNldCkKK3sKKwlpZiggcWxfYWRhcHRlcl9kb3duKHFkZXYscmVzZXQpIHx8IHFsX2FkYXB0ZXJfdXAocWRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSIlczogRHJpdmVyIHVwL2Rvd24gY3ljbGUgZmFpbGVkLCAiCisJCQkJImNsb3NpbmcgZGV2aWNlXG4iLHFkZXYtPm5kZXYtPm5hbWUpOworCQlkZXZfY2xvc2UocWRldi0+bmRldik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWwzeHh4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyoKKwkgKiBXYWl0IGZvciBkZXZpY2UgdG8gcmVjb3ZlciBmcm9tIGEgcmVzZXQuCisJICogKFJhcmVseSBoYXBwZW5zLCBidXQgcG9zc2libGUuKQorCSAqLworCXdoaWxlICghdGVzdF9iaXQoUUxfQURBUFRFUl9VUCwmcWRldi0+ZmxhZ3MpKQorCQltc2xlZXAoNTApOworCisJcWxfYWRhcHRlcl9kb3duKHFkZXYsUUxfRE9fUkVTRVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFsM3h4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXJldHVybiAocWxfYWRhcHRlcl91cChxZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcWwzeHh4X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKilkZXYtPnByaXY7CisJcmV0dXJuICZxZGV2LT5zdGF0czsKK30KKworc3RhdGljIGludCBxbDN4eHhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6ICBuZXcgbXR1IHNpemUgPSAlZC5cbiIsIG5kZXYtPm5hbWUsIG5ld19tdHUpOworCWlmIChuZXdfbXR1ICE9IE5PUk1BTF9NVFVfU0laRSAmJiBuZXdfbXR1ICE9IEpVTUJPX01UVV9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICIlczogbXR1IHNpemUgb2YgJWQgaXMgbm90IHZhbGlkLiAgVXNlIGV4YWN0bHkgJWQgb3IgIgorCQkgICAgICAgIiVkLlxuIiwgbmRldi0+bmFtZSwgbmV3X210dSwgTk9STUFMX01UVV9TSVpFLAorCQkgICAgICAgSlVNQk9fTVRVX1NJWkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJbmRldi0+bXR1ID0gbmV3X210dTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gcWxfY3ljbGVfYWRhcHRlcihxZGV2LFFMX0RPX1JFU0VUKTsKK30KKworc3RhdGljIHZvaWQgcWwzeHh4X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwkvKgorCSAqIFdlIGFyZSBtYW51YWxseSBwYXJzaW5nIHRoZSBsaXN0IGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKwkgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcWwzeHh4X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJdW5zaWduZWQgbG9uZyBod19mbGFnczsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5kZXYtPmFkZHJfbGVuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisJLyogUHJvZ3JhbSBsb3dlciAzMiBiaXRzIG9mIHRoZSBNQUMgYWRkcmVzcyAqLworCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNBZGRySW5kaXJlY3RQdHJSZWcsCisJCQkgICAoTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19SUF9NQVNLIDw8IDE2KSk7CisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY0FkZHJEYXRhUmVnLAorCQkJICAgKChuZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfCAobmRldi0+CisJCQkJCQkJIGRldl9hZGRyWzNdIDw8IDE2KSB8CisJCQkgICAgKG5kZXYtPmRldl9hZGRyWzRdIDw8IDgpIHwgbmRldi0+ZGV2X2FkZHJbNV0pKTsKKworCS8qIFByb2dyYW0gdG9wIDE2IGJpdHMgb2YgdGhlIE1BQyBhZGRyZXNzICovCisJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY0FkZHJJbmRpcmVjdFB0clJlZywKKwkJCSAgICgoTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19SUF9NQVNLIDw8IDE2KSB8IDEpKTsKKwlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjQWRkckRhdGFSZWcsCisJCQkgICAoKG5kZXYtPmRldl9hZGRyWzBdIDw8IDgpIHwgbmRldi0+ZGV2X2FkZHJbMV0pKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWwzeHh4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbDNfYWRhcHRlciAqKW5ldGRldl9wcml2KG5kZXYpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFJlc2V0dGluZy4uLlxuIiwgbmRldi0+bmFtZSk7CisJLyoKKwkgKiBTdG9wIHRoZSBxdWV1ZXMsIHdlJ3ZlIGdvdCBhIHByb2JsZW0uCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCS8qCisJICogV2FrZSB1cCB0aGUgd29ya2VyIHRvIHByb2Nlc3MgdGhpcyBldmVudC4KKwkgKi8KKwlxdWV1ZV93b3JrKHFkZXYtPndvcmtxdWV1ZSwgJnFkZXYtPnR4X3RpbWVvdXRfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3Jlc2V0X3dvcmsoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcWRldi0+bmRldjsKKwl1MzIgdmFsdWU7CisJc3RydWN0IHFsX3R4X2J1Zl9jYiAqdHhfY2I7CisJaW50IG1heF93YWl0X3RpbWUsIGk7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCisJaWYgKHRlc3RfYml0KChRTF9SRVNFVF9QRVJfU0NTSSB8IFFMX1JFU0VUX1NUQVJUKSwmcWRldi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpOworCisJCS8qCisJCSAqIExvb3AgdGhyb3VnaCB0aGUgYWN0aXZlIGxpc3QgYW5kIHJldHVybiB0aGUgc2tiLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKKwkJCXR4X2NiID0gJnFkZXYtPnR4X2J1ZltpXTsKKwkJCWlmICh0eF9jYi0+c2tiKSB7CisKKwkJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCQkgICAgICAgIiVzOiBGcmVlaW5nIGxvc3QgU0tCLlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJCQlwY2lfdW5tYXBfYWRkcih0eF9jYiwgbWFwYWRkciksCisJCQkJCXBjaV91bm1hcF9sZW4odHhfY2IsIG1hcGxlbiksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IodHhfY2ItPnNrYik7CisJCQkJdHhfY2ItPnNrYiA9IE5VTEw7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiJXM6IENsZWFyaW5nIE5SSSBhZnRlciByZXNldC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOworCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCisJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJICAgIGlzcENvbnRyb2xTdGF0dXMsCisJCQkJICAgICgoSVNQX0NPTlRST0xfUkkgPDwgMTYpIHwgSVNQX0NPTlRST0xfUkkpKTsKKwkJLyoKKwkJICogV2FpdCB0aGUgZm9yIFNvZnQgUmVzZXQgdG8gQ29tcGxldGUuCisJCSAqLworCQltYXhfd2FpdF90aW1lID0gMTA7CisJCWRvIHsKKwkJCXZhbHVlID0gcWxfcmVhZF9jb21tb25fcmVnKHFkZXYsCisJCQkJCQkgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLgorCisJCQkJCQkgICBpc3BDb250cm9sU3RhdHVzKTsKKwkJCWlmICgodmFsdWUgJiBJU1BfQ09OVFJPTF9TUikgPT0gMCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJCSAgICAgICAiJXM6IHJlc2V0IGNvbXBsZXRlZC5cbiIsCisJCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodmFsdWUgJiBJU1BfQ09OVFJPTF9SSSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJCSAgICAgICAiJXM6IGNsZWFyaW5nIE5SSSBhZnRlciByZXNldC5cbiIsCisJCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwKKwkJCQkJCSAgICAodTMyICopICYKKwkJCQkJCSAgICBwb3J0X3JlZ3MtPgorCQkJCQkJICAgIENvbW1vblJlZ3MuCisJCQkJCQkgICAgaXNwQ29udHJvbFN0YXR1cywKKwkJCQkJCSAgICAoKElTUF9DT05UUk9MX1JJIDw8CisJCQkJCQkgICAgICAxNikgfCBJU1BfQ09OVFJPTF9SSSkpOworCQkJfQorCisJCQlzc2xlZXAoMSk7CisJCX0gd2hpbGUgKC0tbWF4X3dhaXRfdGltZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKKworCQlpZiAodmFsdWUgJiBJU1BfQ09OVFJPTF9TUikgeworCisJCQkvKgorCQkJICogU2V0IHRoZSByZXNldCBmbGFncyBhbmQgY2xlYXIgdGhlIGJvYXJkIGFnYWluLgorCQkJICogTm90aGluZyBlbHNlIHRvIGRvLi4uCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNldCB0byAiCisJCQkgICAgICAgImNvbXBsZXRlLlxuIiwgbmRldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBEbyBhIHJlc2V0LlxuIiwgbmRldi0+bmFtZSk7CisJCQljbGVhcl9iaXQoUUxfUkVTRVRfUEVSX1NDU0ksJnFkZXYtPmZsYWdzKTsKKwkJCWNsZWFyX2JpdChRTF9SRVNFVF9TVEFSVCwmcWRldi0+ZmxhZ3MpOworCQkJcWxfY3ljbGVfYWRhcHRlcihxZGV2LFFMX0RPX1JFU0VUKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNsZWFyX2JpdChRTF9SRVNFVF9BQ1RJVkUsJnFkZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KFFMX1JFU0VUX1BFUl9TQ1NJLCZxZGV2LT5mbGFncyk7CisJCWNsZWFyX2JpdChRTF9SRVNFVF9TVEFSVCwmcWRldi0+ZmxhZ3MpOworCQlxbF9jeWNsZV9hZGFwdGVyKHFkZXYsUUxfTk9fUkVTRVQpOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfdHhfdGltZW91dF93b3JrKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3sKKwlxbF9jeWNsZV9hZGFwdGVyKHFkZXYsUUxfRE9fUkVTRVQpOworfQorCitzdGF0aWMgdm9pZCBxbF9nZXRfYm9hcmRfaW5mbyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IHFsX3JlYWRfcGFnZTBfcmVnX2wocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CisKKwlxZGV2LT5jaGlwX3Jldl9pZCA9ICgodmFsdWUgJiBQT1JUX1NUQVRVU19SRVZfSURfTUFTSykgPj4gMTIpOworCWlmICh2YWx1ZSAmIFBPUlRfU1RBVFVTXzY0KQorCQlxZGV2LT5wY2lfd2lkdGggPSA2NDsKKwllbHNlCisJCXFkZXYtPnBjaV93aWR0aCA9IDMyOworCWlmICh2YWx1ZSAmIFBPUlRfU1RBVFVTX1gpCisJCXFkZXYtPnBjaV94ID0gMTsKKwllbHNlCisJCXFkZXYtPnBjaV94ID0gMDsKKwlxZGV2LT5wY2lfc2xvdCA9ICh1OCkgUENJX1NMT1QocWRldi0+cGRldi0+ZGV2Zm4pOworfQorCitzdGF0aWMgdm9pZCBxbDN4eHhfdGltZXIodW5zaWduZWQgbG9uZyBwdHIpCit7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbDNfYWRhcHRlciAqKXB0cjsKKworCWlmICh0ZXN0X2JpdChRTF9SRVNFVF9BQ1RJVkUsJnFkZXYtPmZsYWdzKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJICAgICAgICIlczogUmVzZXQgaW4gcHJvZ3Jlc3MuXG4iLAorCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCWdvdG8gZW5kOworCX0KKworCXFsX2xpbmtfc3RhdGVfbWFjaGluZShxZGV2KTsKKworCS8qIFJlc3RhcnQgdGltZXIgb24gMiBzZWNvbmQgaW50ZXJ2YWwuICovCitlbmQ6CisJbW9kX3RpbWVyKCZxZGV2LT5hZGFwdGVyX3RpbWVyLCBqaWZmaWVzICsgSFogKiAxKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcWwzeHh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9lbnRyeSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kID0gMDsKKwlpbnQgcGNpX3VzaW5nX2RhYywgZXJyOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyBjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIGNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJfSBlbHNlIGlmICghKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMDsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIG5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKKwl9CisKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBxbDNfYWRhcHRlcikpOworCWlmICghbmRldikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CisKKwluZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfTExUWDsKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOworCisJcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXFkZXYtPmluZGV4ID0gY2FyZHNfZm91bmQ7CisJcWRldi0+bmRldiA9IG5kZXY7CisJcWRldi0+cGRldiA9IHBkZXY7CisJcWRldi0+cG9ydF9saW5rX3N0YXRlID0gTFNfRE9XTjsKKwlpZiAobXNpKQorCQlxZGV2LT5tc2kgPSAxOworCisJcWRldi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBkZWZhdWx0X21zZyk7CisKKwlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycyA9CisJICAgIGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkgICAgcGNpX3Jlc291cmNlX2xlbihxZGV2LT5wZGV2LCAxKSk7CisJaWYgKCFxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZGV2OworCX0KKworCXNwaW5fbG9ja19pbml0KCZxZGV2LT5hZGFwdGVyX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZxZGV2LT5od19sb2NrKTsKKworCS8qIFNldCBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJbmRldi0+b3BlbiA9IHFsM3h4eF9vcGVuOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHFsM3h4eF9zZW5kOworCW5kZXYtPnN0b3AgPSBxbDN4eHhfY2xvc2U7CisJbmRldi0+Z2V0X3N0YXRzID0gcWwzeHh4X2dldF9zdGF0czsKKwluZGV2LT5jaGFuZ2VfbXR1ID0gcWwzeHh4X2NoYW5nZV9tdHU7CisJbmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWwzeHh4X3NldF9tdWx0aWNhc3RfbGlzdDsKKwlTRVRfRVRIVE9PTF9PUFMobmRldiwgJnFsM3h4eF9ldGh0b29sX29wcyk7CisJbmRldi0+c2V0X21hY19hZGRyZXNzID0gcWwzeHh4X3NldF9tYWNfYWRkcmVzczsKKwluZGV2LT50eF90aW1lb3V0ID0gcWwzeHh4X3R4X3RpbWVvdXQ7CisJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisKKwluZGV2LT5wb2xsID0gJnFsX3BvbGw7CisJbmRldi0+d2VpZ2h0ID0gNjQ7CisKKwluZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBtYWtlIHN1cmUgdGhlIEVFUFJPTSBpcyBnb29kICovCisJaWYgKHFsX2dldF9udnJhbV9wYXJhbXMocWRldikpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYCisJCSAgICAgICAicWwzeHh4X3Byb2JlOiBBZGFwdGVyICMlZCwgSW52YWxpZCBOVlJBTSBwYXJhbWV0ZXJzLlxuIiwKKwkJICAgICAgIHFkZXYtPmluZGV4KTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJcWxfc2V0X21hY19pbmZvKHFkZXYpOworCisJLyogVmFsaWRhdGUgYW5kIHNldCBwYXJhbWV0ZXJzICovCisJaWYgKHFkZXYtPm1hY19pbmRleCkgeworCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsICZxZGV2LT5udnJhbV9kYXRhLmZ1bmNDZmdfZm4yLm1hY0FkZHJlc3MsCisJCSAgICAgICBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCAmcWRldi0+bnZyYW1fZGF0YS5mdW5jQ2ZnX2ZuMC5tYWNBZGRyZXNzLAorCQkgICAgICAgRVRIX0FMRU4pOworCX0KKwltZW1jcHkobmRldi0+cGVybV9hZGRyLCBuZGV2LT5kZXZfYWRkciwgbmRldi0+YWRkcl9sZW4pOworCisJbmRldi0+dHhfcXVldWVfbGVuID0gTlVNX1JFUV9RX0VOVFJJRVM7CisKKwkvKiBUdXJuIG9mZiBzdXBwb3J0IGZvciBtdWx0aWNhc3RpbmcgKi8KKwluZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKworCS8qIFJlY29yZCBQQ0kgYnVzIGluZm9ybWF0aW9uLiAqLworCXFsX2dldF9ib2FyZF9pbmZvKHFkZXYpOworCisJLyoKKwkgKiBTZXQgdGhlIE1heGltdW0gTWVtb3J5IFJlYWQgQnl0ZSBDb3VudCB2YWx1ZS4gV2UgZG8gdGhpcyB0byBoYW5kbGUKKwkgKiBqdW1ibyBmcmFtZXMuCisJICovCisJaWYgKHFkZXYtPnBjaV94KSB7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAoaW50KTB4NGUsICh1MTYpIDB4MDAzNik7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiB3ZSdyZSBnb2luZyB0byByZXNldCwgc28gYXNzdW1lIHdlIGhhdmUgbm8gbGluayBmb3Igbm93ICovCisKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJcWRldi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmRldi0+bmFtZSk7CisJSU5JVF9XT1JLKCZxZGV2LT5yZXNldF93b3JrLCAodm9pZCAoKikodm9pZCAqKSlxbF9yZXNldF93b3JrLCBxZGV2KTsKKwlJTklUX1dPUksoJnFkZXYtPnR4X3RpbWVvdXRfd29yaywKKwkJICAodm9pZCAoKikodm9pZCAqKSlxbF90eF90aW1lb3V0X3dvcmssIHFkZXYpOworCisJaW5pdF90aW1lcigmcWRldi0+YWRhcHRlcl90aW1lcik7CisJcWRldi0+YWRhcHRlcl90aW1lci5mdW5jdGlvbiA9IHFsM3h4eF90aW1lcjsKKwlxZGV2LT5hZGFwdGVyX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogKiAyOwkvKiB0d28gc2Vjb25kIGRlbGF5ICovCisJcWRldi0+YWRhcHRlcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcWRldjsKKworCWlmKCFjYXJkc19mb3VuZCkgeworCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIiVzXG4iLCBEUlZfU1RSSU5HKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJEcml2ZXIgbmFtZTogJXMsIFZlcnNpb246ICVzLlxuIiwKKwkgICAgCSAgIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CisJfQorCXFsX2Rpc3BsYXlfZGV2X2luZm8obmRldik7CisKKwljYXJkc19mb3VuZCsrOworCXJldHVybiAwOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycyk7CitlcnJfb3V0X2ZyZWVfbmRldjoKKwlmcmVlX25ldGRldihuZGV2KTsKK2Vycl9vdXRfZnJlZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcWwzeHh4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCXFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXFsX2Rpc2FibGVfaW50ZXJydXB0cyhxZGV2KTsKKworCWlmIChxZGV2LT53b3JrcXVldWUpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcWRldi0+cmVzZXRfd29yayk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnFkZXYtPnR4X3RpbWVvdXRfd29yayk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHFkZXYtPndvcmtxdWV1ZSk7CisJCXFkZXYtPndvcmtxdWV1ZSA9IE5VTEw7CisJfQorCisJaW91bm1hcCgodm9pZCAqKXFkZXYtPm1tYXBfdmlydF9iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFsM3h4eF9kcml2ZXIgPSB7CisKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IHFsM3h4eF9wY2lfdGJsLAorCS5wcm9iZSA9IHFsM3h4eF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocWwzeHh4X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBxbDN4eHhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcWwzeHh4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxbDN4eHhfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcWwzeHh4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsM3h4eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChxbDN4eHhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGEzeHh4LmggYi9kcml2ZXJzL25ldC9xbGEzeHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MmNlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguaApAQCAtMCwwICsxLDExOTQgQEAKKy8qCisgKiBRTG9naWMgUUxBM3h4eCBOSUMgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA2IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTN4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX1FMQTNYWFhfSF8KKyNkZWZpbmUgX1FMQTNYWFhfSF8KKworLyoKKyAqIElPQ0IgRGVmaW5pdGlvbnMuLi4KKyAqLworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgT1BDT0RFX09CX01BQ19JT0NCX0ZOMCAgICAgICAgICAweDAxCisjZGVmaW5lIE9QQ09ERV9PQl9NQUNfSU9DQl9GTjIgICAgICAgICAgMHgyMQorI2RlZmluZSBPUENPREVfT0JfVENQX0lPQ0JfRk4wICAgICAgICAgIDB4MDMKKyNkZWZpbmUgT1BDT0RFX09CX1RDUF9JT0NCX0ZOMiAgICAgICAgICAweDIzCisjZGVmaW5lIE9QQ09ERV9VUERBVEVfTkNCX0lPQ0JfRk4wICAgICAgMHgwMAorI2RlZmluZSBPUENPREVfVVBEQVRFX05DQl9JT0NCX0ZOMiAgICAgIDB4MjAKKworI2RlZmluZSBPUENPREVfVVBEQVRFX05DQl9JT0NCICAgICAgMHhGMAorI2RlZmluZSBPUENPREVfSUJfTUFDX0lPQ0IgICAgICAgICAgMHhGOQorI2RlZmluZSBPUENPREVfSUJfSVBfSU9DQiAgICAgICAgICAgMHhGQQorI2RlZmluZSBPUENPREVfSUJfVENQX0lPQ0IgICAgICAgICAgMHhGQgorI2RlZmluZSBPUENPREVfRFVNUF9QUk9UT19JT0NCICAgICAgMHhGRQorI2RlZmluZSBPUENPREVfQlVGRkVSX0FMRVJUX0lPQ0IgICAgMHhGQgorCisjZGVmaW5lIE9QQ09ERV9GVU5DX0lEX01BU0sgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgT1VUQk9VTkRfTUFDX0lPQ0IgICAgICAgICAgICAgICAgICAgMHgwMQkvKiBwbHVzIGZ1bmN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgT1VUQk9VTkRfVENQX0lPQ0IgICAgICAgICAgICAgICAgICAgMHgwMwkvKiBwbHVzIGZ1bmN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgVVBEQVRFX05DQl9JT0NCICAgICAgICAgICAgICAgICAgICAgMHgwMAkvKiBwbHVzIGZ1bmN0aW9uIGJpdHMgKi8KKworI2RlZmluZSBGTjBfTUFfQklUU19NQVNLICAgIDB4MDAKKyNkZWZpbmUgRk4xX01BX0JJVFNfTUFTSyAgICAweDgwCisKK3N0cnVjdCBvYl9tYWNfaW9jYl9yZXEgeworCXU4IG9wY29kZTsKKwl1OCBmbGFnczsKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX01BICAweEMwCisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9GICAgMHgyMAorI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfWCAgIDB4MTAKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0QgICAweDAyCisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9JICAgMHgwMQorCV9fbGUxNiByZXNlcnZlZDA7CisKKwlfX2xlMzIgdHJhbnNhY3Rpb25faWQ7CisJX19sZTE2IGRhdGFfbGVuOworCV9fbGUxNiByZXNlcnZlZDE7CisJX19sZTMyIHJlc2VydmVkMjsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworCV9fbGUzMiBidWZfYWRkcjBfbG93OworCV9fbGUzMiBidWZfYWRkcjBfaGlnaDsKKwlfX2xlMzIgYnVmXzBfbGVuOworCV9fbGUzMiBidWZfYWRkcjFfbG93OworCV9fbGUzMiBidWZfYWRkcjFfaGlnaDsKKwlfX2xlMzIgYnVmXzFfbGVuOworCV9fbGUzMiBidWZfYWRkcjJfbG93OworCV9fbGUzMiBidWZfYWRkcjJfaGlnaDsKKwlfX2xlMzIgYnVmXzJfbGVuOworCV9fbGUzMiByZXNlcnZlZDQ7CisJX19sZTMyIHJlc2VydmVkNTsKK307CisvKgorICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lIGNvbnRyb2wgYml0cyBmb3IgYnVmZmVyCisgKiBsZW5ndGggZmllbGRzIGZvciBhbGwgSU9DQidzLgorICovCisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9FICAgMHg4MDAwMDAwMAkvKiBMYXN0IHZhbGlkIGJ1ZmZlciBpbiBsaXN0LiAqLworI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfQyAgIDB4NDAwMDAwMDAJLyogcG9pbnRzIHRvIGFuIE9BTC4gKGNvbnRpbnVhdGlvbikgKi8KKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0wgICAweDIwMDAwMDAwCS8qIEF1YnVybiBsb2NhbCBhZGRyZXNzIHBvaW50ZXIuICovCisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9SICAgMHgxMDAwMDAwMAkvKiAzMi1iaXQgYWRkcmVzcyBwb2ludGVyLiAqLworCitzdHJ1Y3Qgb2JfbWFjX2lvY2JfcnNwIHsKKwl1OCBvcGNvZGU7CisJdTggZmxhZ3M7CisjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9QICAgMHgwOAorI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfUyAgIDB4MDIKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX0kgICAweDAxCisKKwlfX2xlMTYgcmVzZXJ2ZWQwOworCV9fbGUzMiB0cmFuc2FjdGlvbl9pZDsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGUzMiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3QgaWJfbWFjX2lvY2JfcnNwIHsKKwl1OCBvcGNvZGU7CisJdTggZmxhZ3M7CisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9TICAgMHg4MAorI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSDEgIDB4NDAKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0gwICAweDIwCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9CICAgMHgxMAorI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfTSAgIDB4MDgKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01BICAweDA3CisKKwlfX2xlMTYgbGVuZ3RoOworCV9fbGUzMiByZXNlcnZlZDsKKwlfX2xlMzIgaWFsX2xvdzsKKwlfX2xlMzIgaWFsX2hpZ2g7CisKK307CisKK3N0cnVjdCBvYl9pcF9pb2NiX3JlcSB7CisJdTggb3Bjb2RlOworCV9fbGUxNiBmbGFnczsKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfTyAgICAgICAgMHgxMDAKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfSCAgICAgICAgMHgwMDgKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfVSAgICAgICAgMHgwMDQKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfRCAgICAgICAgMHgwMDIKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfSSAgICAgICAgMHgwMDEKKworCXU4IHJlc2VydmVkMDsKKworCV9fbGUzMiB0cmFuc2FjdGlvbl9pZDsKKwlfX2xlMTYgZGF0YV9sZW47CisJX19sZTE2IHJlc2VydmVkMTsKKwlfX2xlMzIgaG5jYl9wdHJfbG93OworCV9fbGUzMiBobmNiX3B0cl9oaWdoOworCV9fbGUzMiBidWZfYWRkcjBfbG93OworCV9fbGUzMiBidWZfYWRkcjBfaGlnaDsKKwlfX2xlMzIgYnVmXzBfbGVuOworCV9fbGUzMiBidWZfYWRkcjFfbG93OworCV9fbGUzMiBidWZfYWRkcjFfaGlnaDsKKwlfX2xlMzIgYnVmXzFfbGVuOworCV9fbGUzMiBidWZfYWRkcjJfbG93OworCV9fbGUzMiBidWZfYWRkcjJfaGlnaDsKKwlfX2xlMzIgYnVmXzJfbGVuOworCV9fbGUzMiByZXNlcnZlZDI7CisJX19sZTMyIHJlc2VydmVkMzsKK307CisKKy8qIGRlZmluZXMgZm9yIEJ1ZmZlckxlbmd0aCBmaWVsZHMgYWJvdmUgKi8KKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfRSAgICAweDgwMDAwMDAwCisjZGVmaW5lIE9CX0lQX0lPQ0JfUkVRX0MgICAgMHg0MDAwMDAwMAorI2RlZmluZSBPQl9JUF9JT0NCX1JFUV9MICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgT0JfSVBfSU9DQl9SRVFfUiAgICAweDEwMDAwMDAwCisKK3N0cnVjdCBvYl9pcF9pb2NiX3JzcCB7CisJdTggb3Bjb2RlOworCXU4IGZsYWdzOworI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfRSAgICAgICAweDA4CisjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9MICAgICAgIDB4MDQKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX1MgICAgICAgMHgwMgorI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfSSAgICAgICAweDAxCisKKwlfX2xlMTYgcmVzZXJ2ZWQwOworCV9fbGUzMiB0cmFuc2FjdGlvbl9pZDsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGUzMiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3Qgb2JfdGNwX2lvY2JfcmVxIHsKKwl1OCBvcGNvZGU7CisKKwl1OCBmbGFnczA7CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9QICAgICAgIDB4ODAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX0NJICAgICAgMHgyMAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SRVFfSCAgICAgICAweDEwCisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9MTiAgICAgIDB4MDgKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX0sgICAgICAgMHgwNAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SRVFfRCAgICAgICAweDAyCisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9JICAgICAgIDB4MDEKKworCXU4IGZsYWdzMTsKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX09TTSAgICAgMHg0MAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SRVFfVVJHICAgICAweDIwCisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9BQ0sgICAgIDB4MTAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX1BTSCAgICAgMHgwOAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SRVFfUlNUICAgICAweDA0CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9TWU4gICAgIDB4MDIKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX0ZJTiAgICAgMHgwMQorCisJdTggb3B0aW9uc19sZW47CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JFUV9PTUFTSyAgIDB4RjAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUkVRX1NISUZUICAgNAorCisJX19sZTMyIHRyYW5zYWN0aW9uX2lkOworCV9fbGUzMiBkYXRhX2xlbjsKKwlfX2xlMzIgaG5jYl9wdHJfbG93OworCV9fbGUzMiBobmNiX3B0cl9oaWdoOworCV9fbGUzMiBidWZfYWRkcjBfbG93OworCV9fbGUzMiBidWZfYWRkcjBfaGlnaDsKKwlfX2xlMzIgYnVmXzBfbGVuOworCV9fbGUzMiBidWZfYWRkcjFfbG93OworCV9fbGUzMiBidWZfYWRkcjFfaGlnaDsKKwlfX2xlMzIgYnVmXzFfbGVuOworCV9fbGUzMiBidWZfYWRkcjJfbG93OworCV9fbGUzMiBidWZfYWRkcjJfaGlnaDsKKwlfX2xlMzIgYnVmXzJfbGVuOworCV9fbGUzMiB0aW1lX3N0YW1wOworCV9fbGUzMiByZXNlcnZlZDE7Cit9OworCitzdHJ1Y3Qgb2JfdGNwX2lvY2JfcnNwIHsKKwl1OCBvcGNvZGU7CisKKwl1OCBmbGFnczA7CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JTUF9DICAgICAgIDB4MjAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUlNQX0ggICAgICAgMHgxMAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SU1BfTE4gICAgICAweDA4CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JTUF9LICAgICAgIDB4MDQKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUlNQX0QgICAgICAgMHgwMgorI2RlZmluZSBPQl9UQ1BfSU9DQl9SU1BfSSAgICAgICAweDAxCisKKwl1OCBmbGFnczE7CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JTUF9FICAgICAgIDB4MTAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUlNQX1cgICAgICAgMHgwOAorI2RlZmluZSBPQl9UQ1BfSU9DQl9SU1BfUCAgICAgICAweDA0CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JTUF9UICAgICAgIDB4MDIKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUlNQX0YgICAgICAgMHgwMQorCisJdTggc3RhdGU7CisjZGVmaW5lIE9CX1RDUF9JT0NCX1JTUF9TTUFTSyAgIDB4RjAKKyNkZWZpbmUgT0JfVENQX0lPQ0JfUlNQX1NISUZUICAgNAorCisJX19sZTMyIHRyYW5zYWN0aW9uX2lkOworCV9fbGUzMiBsb2NhbF9uY2JfcHRyOworCV9fbGUzMiByZXNlcnZlZDA7Cit9OworCitzdHJ1Y3QgaWJfaXBfaW9jYl9yc3AgeworCXU4IG9wY29kZTsKKwl1OCBmbGFnczsKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfUyAgICAgICAgMHg4MAorI2RlZmluZSBJQl9JUF9JT0NCX1JTUF9IMSAgICAgICAweDQwCisjZGVmaW5lIElCX0lQX0lPQ0JfUlNQX0gwICAgICAgIDB4MjAKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfQiAgICAgICAgMHgxMAorI2RlZmluZSBJQl9JUF9JT0NCX1JTUF9NICAgICAgICAweDA4CisjZGVmaW5lIElCX0lQX0lPQ0JfUlNQX01BICAgICAgIDB4MDcKKworCV9fbGUxNiBsZW5ndGg7CisJX19sZTE2IGNoZWNrc3VtOworCV9fbGUxNiByZXNlcnZlZDsKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfUiAgICAgICAgMHgwMQorCV9fbGUzMiBpYWxfbG93OworCV9fbGUzMiBpYWxfaGlnaDsKK307CisKK3N0cnVjdCBpYl90Y3BfaW9jYl9yc3AgeworCXU4IG9wY29kZTsKKwl1OCBmbGFnczsKKyNkZWZpbmUgSUJfVENQX0lPQ0JfUlNQX1AgICAgICAgMHg4MAorI2RlZmluZSBJQl9UQ1BfSU9DQl9SU1BfVCAgICAgICAweDQwCisjZGVmaW5lIElCX1RDUF9JT0NCX1JTUF9EICAgICAgIDB4MjAKKyNkZWZpbmUgSUJfVENQX0lPQ0JfUlNQX04gICAgICAgMHgxMAorI2RlZmluZSBJQl9UQ1BfSU9DQl9SU1BfSVAgICAgICAweDAzCisjZGVmaW5lIElCX1RDUF9GTEFHX01BU0sgICAgICAgIDB4ZjAKKyNkZWZpbmUgSUJfVENQX0ZMQUdfSU9DQl9TWU4gICAgMHgwMAorCisjZGVmaW5lIFRDUF9JQl9SU1BfRkxBR1MoeCkgKHgtPmZsYWdzICYgfklCX1RDUF9GTEFHX01BU0spCisKKwlfX2xlMTYgbGVuZ3RoOworCV9fbGUzMiBobmNiX3JlZl9udW07CisJX19sZTMyIGlhbF9sb3c7CisJX19sZTMyIGlhbF9oaWdoOworfTsKKworc3RydWN0IG5ldF9yc3BfaW9jYiB7CisJdTggb3Bjb2RlOworCXU4IGZsYWdzOworCV9fbGUxNiByZXNlcnZlZDA7CisJX19sZTMyIHJlc2VydmVkWzNdOworfTsKKyNwcmFnbWEgcGFjaygpCisKKy8qCisgKiBSZWdpc3RlciBEZWZpbml0aW9ucy4uLgorICovCisjZGVmaW5lIFBPUlQwX1BIWV9BRERSRVNTICAgMHgxZTAwCisjZGVmaW5lIFBPUlQxX1BIWV9BRERSRVNTICAgMHgxZjAwCisKKyNkZWZpbmUgRVRIRVJORVRfQ1JDX1NJWkUgICA0CisKKyNkZWZpbmUgTUlJX1NDQU5fUkVHSVNURVIgMHgwMDAwMDAwMQorCisvKiAzMi1iaXQgaXNwQ29udHJvbFN0YXR1cyAqLworZW51bSB7CisJSVNQX0NPTlRST0xfTlBfTUFTSyA9IDB4MDAwMywKKwlJU1BfQ09OVFJPTF9OUF9QQ1NSID0gMHgwMDAwLAorCUlTUF9DT05UUk9MX05QX0hNQ1IgPSAweDAwMDEsCisJSVNQX0NPTlRST0xfTlBfTFJBTUNSID0gMHgwMDAyLAorCUlTUF9DT05UUk9MX05QX1BTUiA9IDB4MDAwMywKKwlJU1BfQ09OVFJPTF9SSSA9IDB4MDAwOCwKKwlJU1BfQ09OVFJPTF9DSSA9IDB4MDAxMCwKKwlJU1BfQ09OVFJPTF9QSSA9IDB4MDAyMCwKKwlJU1BfQ09OVFJPTF9JTiA9IDB4MDA0MCwKKwlJU1BfQ09OVFJPTF9CRSA9IDB4MDA4MCwKKwlJU1BfQ09OVFJPTF9GTl9NQVNLID0gMHgwNzAwLAorCUlTUF9DT05UUk9MX0ZOMF9ORVQgPSAweDA0MDAsCisJSVNQX0NPTlRST0xfRk4wX1NDU0kgPSAweDA1MDAsCisJSVNQX0NPTlRST0xfRk4xX05FVCA9IDB4MDYwMCwKKwlJU1BfQ09OVFJPTF9GTjFfU0NTSSA9IDB4MDcwMCwKKwlJU1BfQ09OVFJPTF9MSU5LX0ROXzAgPSAweDA4MDAsCisJSVNQX0NPTlRST0xfTElOS19ETl8xID0gMHgxMDAwLAorCUlTUF9DT05UUk9MX0ZTUiA9IDB4MjAwMCwKKwlJU1BfQ09OVFJPTF9GRSA9IDB4NDAwMCwKKwlJU1BfQ09OVFJPTF9TUiA9IDB4ODAwMCwKK307CisKKy8qIDMyLWJpdCBpc3BJbnRlcnJ1cHRNYXNrUmVnICovCitlbnVtIHsKKwlJU1BfSU1SX0VOQUJMRV9JTlQgPSAweDAwMDQsCisJSVNQX0lNUl9ESVNBQkxFX1JFU0VUX0lOVCA9IDB4MDAwOCwKKwlJU1BfSU1SX0RJU0FCTEVfQ01QTF9JTlQgPSAweDAwMTAsCisJSVNQX0lNUl9ESVNBQkxFX1BST0NfSU5UID0gMHgwMDIwLAorfTsKKworLyogMzItYml0IHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcgKi8KK2VudW0geworCUlTUF9TRVJJQUxfUE9SVF9JRl9DTEsgPSAweDAwMDEsCisJSVNQX1NFUklBTF9QT1JUX0lGX0NTID0gMHgwMDAyLAorCUlTUF9TRVJJQUxfUE9SVF9JRl9EMCA9IDB4MDAwNCwKKwlJU1BfU0VSSUFMX1BPUlRfSUZfREkgPSAweDAwMDgsCisJSVNQX05WUkFNX01BU0sgPSAoMHgwMDBGIDw8IDE2KSwKKwlJU1BfU0VSSUFMX1BPUlRfSUZfV0UgPSAweDAwMTAsCisJSVNQX1NFUklBTF9QT1JUX0lGX05WUl9NQVNLID0gMHgwMDFGLAorCUlTUF9TRVJJQUxfUE9SVF9JRl9TQ0kgPSAweDA0MDAsCisJSVNQX1NFUklBTF9QT1JUX0lGX1NDMCA9IDB4MDgwMCwKKwlJU1BfU0VSSUFMX1BPUlRfSUZfU0NFID0gMHgxMDAwLAorCUlTUF9TRVJJQUxfUE9SVF9JRl9TREkgPSAweDIwMDAsCisJSVNQX1NFUklBTF9QT1JUX0lGX1NETyA9IDB4NDAwMCwKKwlJU1BfU0VSSUFMX1BPUlRfSUZfU0RFID0gMHg4MDAwLAorCUlTUF9TRVJJQUxfUE9SVF9JRl9JMkNfTUFTSyA9IDB4RkMwMCwKK307CisKKy8qIHNlbWFwaG9yZVJlZyAqLworZW51bSB7CisJUUxfUkVTT1VSQ0VfTUFTS19CQVNFX0NPREUgPSAweDcsCisJUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgPSAweDQsCisJUUxfRFJWUl9TRU1fQklUUyA9IChRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSA8PCAxKSwKKwlRTF9ERFJfUkFNX1NFTV9CSVRTID0gKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIDw8IDQpLAorCVFMX1BIWV9HSU9fU0VNX0JJVFMgPSAoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgPDwgNyksCisJUUxfTlZSQU1fU0VNX0JJVFMgPSAoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgPDwgMTApLAorCVFMX0ZMQVNIX1NFTV9CSVRTID0gKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIDw8IDEzKSwKKwlRTF9EUlZSX1NFTV9NQVNLID0gKFFMX1JFU09VUkNFX01BU0tfQkFTRV9DT0RFIDw8ICgxICsgMTYpKSwKKwlRTF9ERFJfUkFNX1NFTV9NQVNLID0gKFFMX1JFU09VUkNFX01BU0tfQkFTRV9DT0RFIDw8ICg0ICsgMTYpKSwKKwlRTF9QSFlfR0lPX1NFTV9NQVNLID0gKFFMX1JFU09VUkNFX01BU0tfQkFTRV9DT0RFIDw8ICg3ICsgMTYpKSwKKwlRTF9OVlJBTV9TRU1fTUFTSyA9IChRTF9SRVNPVVJDRV9NQVNLX0JBU0VfQ09ERSA8PCAoMTAgKyAxNikpLAorCVFMX0ZMQVNIX1NFTV9NQVNLID0gKFFMX1JFU09VUkNFX01BU0tfQkFTRV9DT0RFIDw8ICgxMyArIDE2KSksCit9OworCisgLyoKKyAgKiBRTDNYWFggbWVtb3J5LW1hcHBlZCByZWdpc3RlcnMKKyAgKiBRTDNYWFggaGFzIDQgInBhZ2VzIiBvZiByZWdpc3RlcnMsIGVhY2ggcGFnZSBvY2N1cHlpbmcKKyAgKiAyNTYgYnl0ZXMuICBFYWNoIHBhZ2UgaGFzIGEgImNvbW1vbiIgYXJlYSBhdCB0aGUgc3RhcnQgYW5kIHRoZW4KKyAgKiBwYWdlLXNwZWNpZmljIHJlZ2lzdGVycyBhZnRlciB0aGF0LgorICAqLworc3RydWN0IHFsM3h4eF9jb21tb25fcmVnaXN0ZXJzIHsKKwl1MzIgTUIwOwkJLyogT2Zmc2V0IDB4MDAgKi8KKwl1MzIgTUIxOwkJLyogT2Zmc2V0IDB4MDQgKi8KKwl1MzIgTUIyOwkJLyogT2Zmc2V0IDB4MDggKi8KKwl1MzIgTUIzOwkJLyogT2Zmc2V0IDB4MGMgKi8KKwl1MzIgTUI0OwkJLyogT2Zmc2V0IDB4MTAgKi8KKwl1MzIgTUI1OwkJLyogT2Zmc2V0IDB4MTQgKi8KKwl1MzIgTUI2OwkJLyogT2Zmc2V0IDB4MTggKi8KKwl1MzIgTUI3OwkJLyogT2Zmc2V0IDB4MWMgKi8KKwl1MzIgZmxhc2hCaW9zQWRkcjsKKwl1MzIgZmxhc2hCaW9zRGF0YTsKKwl1MzIgaXNwQ29udHJvbFN0YXR1czsKKwl1MzIgaXNwSW50ZXJydXB0TWFza1JlZzsKKwl1MzIgc2VyaWFsUG9ydEludGVyZmFjZVJlZzsKKwl1MzIgc2VtYXBob3JlUmVnOworCXUzMiByZXFRUHJvZHVjZXJJbmRleDsKKwl1MzIgcnNwUUNvbnN1bWVySW5kZXg7CisKKwl1MzIgcnhMYXJnZVFQcm9kdWNlckluZGV4OworCXUzMiByeFNtYWxsUVByb2R1Y2VySW5kZXg7CisJdTMyIGFyY01hZGlDb21tYW5kOworCXUzMiBhcmNNYWRpRGF0YTsKK307CisKK2VudW0geworCUVYVF9IV19DT05GSUdfU1BfTUFTSyA9IDB4MDAwNiwKKwlFWFRfSFdfQ09ORklHX1NQX05PTkUgPSAweDAwMDAsCisJRVhUX0hXX0NPTkZJR19TUF9CWVRFX1BBUklUWSA9IDB4MDAwMiwKKwlFWFRfSFdfQ09ORklHX1NQX0VDQyA9IDB4MDAwNCwKKwlFWFRfSFdfQ09ORklHX1NQX0VDQ3ggPSAweDAwMDYsCisJRVhUX0hXX0NPTkZJR19TSVpFX01BU0sgPSAweDAwNjAsCisJRVhUX0hXX0NPTkZJR19TSVpFXzEyOE0gPSAweDAwMDAsCisJRVhUX0hXX0NPTkZJR19TSVpFXzI1Nk0gPSAweDAwMjAsCisJRVhUX0hXX0NPTkZJR19TSVpFXzUxMk0gPSAweDAwNDAsCisJRVhUX0hXX0NPTkZJR19TSVpFX0lOVkFMSUQgPSAweDAwNjAsCisJRVhUX0hXX0NPTkZJR19QRCA9IDB4MDA4MCwKKwlFWFRfSFdfQ09ORklHX0ZXID0gMHgwMjAwLAorCUVYVF9IV19DT05GSUdfVVMgPSAweDA0MDAsCisJRVhUX0hXX0NPTkZJR19EQ1NfTUFTSyA9IDB4MTgwMCwKKwlFWFRfSFdfQ09ORklHX0RDU185TUEgPSAweDAwMDAsCisJRVhUX0hXX0NPTkZJR19EQ1NfMTVNQSA9IDB4MDgwMCwKKwlFWFRfSFdfQ09ORklHX0RDU18xOE1BID0gMHgxMDAwLAorCUVYVF9IV19DT05GSUdfRENTXzI0TUEgPSAweDE4MDAsCisJRVhUX0hXX0NPTkZJR19ERFNfTUFTSyA9IDB4NjAwMCwKKwlFWFRfSFdfQ09ORklHX0REU185TUEgPSAweDAwMDAsCisJRVhUX0hXX0NPTkZJR19ERFNfMTVNQSA9IDB4MjAwMCwKKwlFWFRfSFdfQ09ORklHX0REU18xOE1BID0gMHg0MDAwLAorCUVYVF9IV19DT05GSUdfRERTXzI0TUEgPSAweDYwMDAsCit9OworCisvKiBJbnRlcm5hbENoaXBDb25maWcgKi8KK2VudW0geworCUlOVEVSTkFMX0NISVBfRE0gPSAweDAwMDEsCisJSU5URVJOQUxfQ0hJUF9TRCA9IDB4MDAwMiwKKwlJTlRFUk5BTF9DSElQX1JBUF9NQVNLID0gMHgwMDBDLAorCUlOVEVSTkFMX0NISVBfUkFQX1JSID0gMHgwMDAwLAorCUlOVEVSTkFMX0NISVBfUkFQX05STSA9IDB4MDAwNCwKKwlJTlRFUk5BTF9DSElQX1JBUF9FUk0gPSAweDAwMDgsCisJSU5URVJOQUxfQ0hJUF9SQVBfRVJNeCA9IDB4MDAwQywKKwlJTlRFUk5BTF9DSElQX1dFID0gMHgwMDEwLAorCUlOVEVSTkFMX0NISVBfRUYgPSAweDAwMjAsCisJSU5URVJOQUxfQ0hJUF9GUiA9IDB4MDA0MCwKKwlJTlRFUk5BTF9DSElQX0ZXID0gMHgwMDgwLAorCUlOVEVSTkFMX0NISVBfRkkgPSAweDAxMDAsCisJSU5URVJOQUxfQ0hJUF9GVCA9IDB4MDIwMCwKK307CisKKy8qIHBvcnRDb250cm9sICovCitlbnVtIHsKKwlQT1JUX0NPTlRST0xfRFMgPSAweDAwMDEsCisJUE9SVF9DT05UUk9MX0hIID0gMHgwMDAyLAorCVBPUlRfQ09OVFJPTF9FSSA9IDB4MDAwNCwKKwlQT1JUX0NPTlRST0xfRVQgPSAweDAwMDgsCisJUE9SVF9DT05UUk9MX0VGID0gMHgwMDEwLAorCVBPUlRfQ09OVFJPTF9EUk0gPSAweDAwMjAsCisJUE9SVF9DT05UUk9MX1JMQiA9IDB4MDA0MCwKKwlQT1JUX0NPTlRST0xfUkNCID0gMHgwMDgwLAorCVBPUlRfQ09OVFJPTF9NQUMgPSAweDAxMDAsCisJUE9SVF9DT05UUk9MX0lQViA9IDB4MDIwMCwKKwlQT1JUX0NPTlRST0xfSUZQID0gMHgwNDAwLAorCVBPUlRfQ09OVFJPTF9JVFAgPSAweDA4MDAsCisJUE9SVF9DT05UUk9MX0ZJID0gMHgxMDAwLAorCVBPUlRfQ09OVFJPTF9ERlAgPSAweDIwMDAsCisJUE9SVF9DT05UUk9MX09JID0gMHg0MDAwLAorCVBPUlRfQ09OVFJPTF9DQyA9IDB4ODAwMCwKK307CisKKy8qIHBvcnRTdGF0dXMgKi8KK2VudW0geworCVBPUlRfU1RBVFVTX1NNMCA9IDB4MDAwMSwKKwlQT1JUX1NUQVRVU19TTTEgPSAweDAwMDIsCisJUE9SVF9TVEFUVVNfWCA9IDB4MDAwOCwKKwlQT1JUX1NUQVRVU19ETCA9IDB4MDA4MCwKKwlQT1JUX1NUQVRVU19JQyA9IDB4MDIwMCwKKwlQT1JUX1NUQVRVU19NUkMgPSAweDA0MDAsCisJUE9SVF9TVEFUVVNfTkwgPSAweDA4MDAsCisJUE9SVF9TVEFUVVNfUkVWX0lEX01BU0sgPSAweDcwMDAsCisJUE9SVF9TVEFUVVNfUkVWX0lEXzEgPSAweDEwMDAsCisJUE9SVF9TVEFUVVNfUkVWX0lEXzIgPSAweDIwMDAsCisJUE9SVF9TVEFUVVNfUkVWX0lEXzMgPSAweDMwMDAsCisJUE9SVF9TVEFUVVNfNjQgPSAweDgwMDAsCisJUE9SVF9TVEFUVVNfVVAwID0gMHgxMDAwMCwKKwlQT1JUX1NUQVRVU19BQzAgPSAweDIwMDAwLAorCVBPUlRfU1RBVFVTX0FFMCA9IDB4NDAwMDAsCisJUE9SVF9TVEFUVVNfVVAxID0gMHgxMDAwMDAsCisJUE9SVF9TVEFUVVNfQUMxID0gMHgyMDAwMDAsCisJUE9SVF9TVEFUVVNfQUUxID0gMHg0MDAwMDAsCisJUE9SVF9TVEFUVVNfRjBfRU5BQkxFRCA9IDB4MTAwMDAwMCwKKwlQT1JUX1NUQVRVU19GMV9FTkFCTEVEID0gMHgyMDAwMDAwLAorCVBPUlRfU1RBVFVTX0YyX0VOQUJMRUQgPSAweDQwMDAwMDAsCisJUE9SVF9TVEFUVVNfRjNfRU5BQkxFRCA9IDB4ODAwMDAwMCwKK307CisKKy8qIG1hY01JSU1nbXRDb250cm9sUmVnICovCitlbnVtIHsKKwlNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1JQX01BU0sgPSAweDAwMDMsCisJTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19SUF9QUklfTFdSID0gMHgwMDAwLAorCU1BQ19BRERSX0lORElSRUNUX1BUUl9SRUdfUlBfUFJJX1VQUiA9IDB4MDAwMSwKKwlNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1JQX1NFQ19MV1IgPSAweDAwMDIsCisJTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19SUF9TRUNfVVBSID0gMHgwMDAzLAorCU1BQ19BRERSX0lORElSRUNUX1BUUl9SRUdfUFIgPSAweDAwMDgsCisJTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19TUyA9IDB4MDAxMCwKKwlNQUNfQUREUl9JTkRJUkVDVF9QVFJfUkVHX1NFID0gMHgwMDIwLAorCU1BQ19BRERSX0lORElSRUNUX1BUUl9SRUdfU1AgPSAweDAwNDAsCisJTUFDX0FERFJfSU5ESVJFQ1RfUFRSX1JFR19QRSA9IDB4MDA4MCwKK307CisKKy8qIG1hY01JSU1nbXRDb250cm9sUmVnICovCitlbnVtIHsKKwlNQUNfTUlJX0NPTlRST0xfUkMgPSAweDAwMDEsCisJTUFDX01JSV9DT05UUk9MX1NDID0gMHgwMDAyLAorCU1BQ19NSUlfQ09OVFJPTF9BUyA9IDB4MDAwNCwKKwlNQUNfTUlJX0NPTlRST0xfTlAgPSAweDAwMDgsCisJTUFDX01JSV9DT05UUk9MX0NMS19TRUxfTUFTSyA9IDB4MDA3MCwKKwlNQUNfTUlJX0NPTlRST0xfQ0xLX1NFTF9ESVYyID0gMHgwMDAwLAorCU1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX0RJVjQgPSAweDAwMTAsCisJTUFDX01JSV9DT05UUk9MX0NMS19TRUxfRElWNiA9IDB4MDAyMCwKKwlNQUNfTUlJX0NPTlRST0xfQ0xLX1NFTF9ESVY4ID0gMHgwMDMwLAorCU1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX0RJVjEwID0gMHgwMDQwLAorCU1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX0RJVjE0ID0gMHgwMDUwLAorCU1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX0RJVjIwID0gMHgwMDYwLAorCU1BQ19NSUlfQ09OVFJPTF9DTEtfU0VMX0RJVjI4ID0gMHgwMDcwLAorCU1BQ19NSUlfQ09OVFJPTF9STSA9IDB4ODAwMCwKK307CisKKy8qIG1hY01JSVN0YXR1c1JlZyAqLworZW51bSB7CisJTUFDX01JSV9TVEFUVVNfQlNZID0gMHgwMDAxLAorCU1BQ19NSUlfU1RBVFVTX1NDID0gMHgwMDAyLAorCU1BQ19NSUlfU1RBVFVTX05WID0gMHgwMDA0LAorfTsKKworZW51bSB7CisJTUFDX0NPTkZJR19SRUdfUEUgPSAweDAwMDEsCisJTUFDX0NPTkZJR19SRUdfVEYgPSAweDAwMDIsCisJTUFDX0NPTkZJR19SRUdfUkYgPSAweDAwMDQsCisJTUFDX0NPTkZJR19SRUdfRkQgPSAweDAwMDgsCisJTUFDX0NPTkZJR19SRUdfR00gPSAweDAwMTAsCisJTUFDX0NPTkZJR19SRUdfTEIgPSAweDAwMjAsCisJTUFDX0NPTkZJR19SRUdfU1IgPSAweDgwMDAsCit9OworCitlbnVtIHsKKwlNQUNfSEFMRl9EVVBMRVhfUkVHX0VEID0gMHgxMDAwMCwKKwlNQUNfSEFMRl9EVVBMRVhfUkVHX05CID0gMHgyMDAwMCwKKwlNQUNfSEFMRl9EVVBMRVhfUkVHX0JOQiA9IDB4NDAwMDAsCisJTUFDX0hBTEZfRFVQTEVYX1JFR19BTFQgPSAweDgwMDAwLAorfTsKKworZW51bSB7CisJSVBfQUREUl9JTkRFWF9SRUdfTUFTSyA9IDB4MDAwZiwKKwlJUF9BRERSX0lOREVYX1JFR19GVU5DXzBfUFJJID0gMHgwMDAwLAorCUlQX0FERFJfSU5ERVhfUkVHX0ZVTkNfMF9TRUMgPSAweDAwMDEsCisJSVBfQUREUl9JTkRFWF9SRUdfRlVOQ18xX1BSSSA9IDB4MDAwMiwKKwlJUF9BRERSX0lOREVYX1JFR19GVU5DXzFfU0VDID0gMHgwMDAzLAorCUlQX0FERFJfSU5ERVhfUkVHX0ZVTkNfMl9QUkkgPSAweDAwMDQsCisJSVBfQUREUl9JTkRFWF9SRUdfRlVOQ18yX1NFQyA9IDB4MDAwNSwKKwlJUF9BRERSX0lOREVYX1JFR19GVU5DXzNfUFJJID0gMHgwMDA2LAorCUlQX0FERFJfSU5ERVhfUkVHX0ZVTkNfM19TRUMgPSAweDAwMDcsCit9OworCitlbnVtIHsKKwlQUk9CRV9NVVhfQUREUl9SRUdfTVVYX1NFTF9NQVNLID0gMHgwMDNmLAorCVBST0JFX01VWF9BRERSX1JFR19TWVNDTEsgPSAweDAwMDAsCisJUFJPQkVfTVVYX0FERFJfUkVHX1BDSUNMSyA9IDB4MDA0MCwKKwlQUk9CRV9NVVhfQUREUl9SRUdfTlJYQ0xLID0gMHgwMDgwLAorCVBST0JFX01VWF9BRERSX1JFR19DUFVDTEsgPSAweDAwQzAsCisJUFJPQkVfTVVYX0FERFJfUkVHX01PRFVMRV9TRUxfTUFTSyA9IDB4M2YwMCwKKwlQUk9CRV9NVVhfQUREUl9SRUdfVVAgPSAweDQwMDAsCisJUFJPQkVfTVVYX0FERFJfUkVHX1JFID0gMHg4MDAwLAorfTsKKworZW51bSB7CisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFTSyA9IDB4MDFmZiwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1RYX0ZSQU1FID0gMHgwMDAwLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzBfVFhfQllURVMgPSAweDAwMDEsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMF9UWF9TVEFUMSA9IDB4MDAwMiwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1RYX1NUQVQyID0gMHgwMDAzLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzBfVFhfU1RBVDMgPSAweDAwMDQsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMF9UWF9TVEFUNCA9IDB4MDAwNSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1RYX1NUQVQ1ID0gMHgwMDA2LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzBfUlhfRlJBTUUgPSAweDAwMDcsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMF9SWF9CWVRFUyA9IDB4MDAwOCwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1JYX1NUQVQxID0gMHgwMDA5LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzBfUlhfU1RBVDIgPSAweDAwMGEsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMF9SWF9TVEFUMyA9IDB4MDAwYiwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1JYX0VSUl9DUkMgPSAweDAwMGMsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMF9SWF9FUlJfRU5DID0gMHgwMDBkLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzBfUlhfRVJSX0xFTiA9IDB4MDAwZSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMwX1JYX1NUQVQ0ID0gMHgwMDBmLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfVFhfRlJBTUUgPSAweDAwMTAsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMV9UWF9CWVRFUyA9IDB4MDAxMSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMxX1RYX1NUQVQxID0gMHgwMDEyLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfVFhfU1RBVDIgPSAweDAwMTMsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMV9UWF9TVEFUMyA9IDB4MDAxNCwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMxX1RYX1NUQVQ0ID0gMHgwMDE1LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfVFhfU1RBVDUgPSAweDAwMTYsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMV9SWF9GUkFNRSA9IDB4MDAxNywKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMxX1JYX0JZVEVTID0gMHgwMDE4LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfUlhfU1RBVDEgPSAweDAwMTksCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMV9SWF9TVEFUMiA9IDB4MDAxYSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMxX1JYX1NUQVQzID0gMHgwMDFiLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfUlhfRVJSX0NSQyA9IDB4MDAxYywKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19NQUMxX1JYX0VSUl9FTkMgPSAweDAwMWQsCisJU1RBVElTVElDU19JTkRFWF9SRUdfTUFDMV9SWF9FUlJfTEVOID0gMHgwMDFlLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX01BQzFfUlhfU1RBVDQgPSAweDAwMWYsCisJU1RBVElTVElDU19JTkRFWF9SRUdfSVBfVFhfUEtUUyA9IDB4MDAyMCwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19JUF9UWF9CWVRFUyA9IDB4MDAyMSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19JUF9UWF9GUkFHID0gMHgwMDIyLAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX0lQX1JYX1BLVFMgPSAweDAwMjMsCisJU1RBVElTVElDU19JTkRFWF9SRUdfSVBfUlhfQllURVMgPSAweDAwMjQsCisJU1RBVElTVElDU19JTkRFWF9SRUdfSVBfUlhfRlJBRyA9IDB4MDAyNSwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19JUF9ER1JNX1JFQVNTRU1CTFkgPSAweDAwMjYsCisJU1RBVElTVElDU19JTkRFWF9SRUdfSVBfVjZfUlhfUEtUUyA9IDB4MDAyNywKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19JUF9SWF9QS1RFUlIgPSAweDAwMjgsCisJU1RBVElTVElDU19JTkRFWF9SRUdfSVBfUkVBU1NFTUJMWV9FUlIgPSAweDAwMjksCisJU1RBVElTVElDU19JTkRFWF9SRUdfVENQX1RYX1NFRyA9IDB4MDAzMCwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19UQ1BfVFhfQllURVMgPSAweDAwMzEsCisJU1RBVElTVElDU19JTkRFWF9SRUdfVENQX1JYX1NFRyA9IDB4MDAzMiwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19UQ1BfUlhfQllURVMgPSAweDAwMzMsCisJU1RBVElTVElDU19JTkRFWF9SRUdfVENQX1RJTUVSX0VYUCA9IDB4MDAzNCwKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19UQ1BfUlhfQUNLID0gMHgwMDM1LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX1RDUF9UWF9BQ0sgPSAweDAwMzYsCisJU1RBVElTVElDU19JTkRFWF9SRUdfVENQX1JYX0VSUiA9IDB4MDAzNywKKwlTVEFUSVNUSUNTX0lOREVYX1JFR19UQ1BfUlhfV0lOX1BST0JFID0gMHgwMDM4LAorCVNUQVRJU1RJQ1NfSU5ERVhfUkVHX1RDUF9FQ0NfRVJSX0NPUlIgPSAweDAwM2YsCit9OworCitlbnVtIHsKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19PRkJfUkVfTUFDMCA9IDB4MDAwMDAwMDEsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfT0ZCX1JFX01BQzEgPSAweDAwMDAwMDAyLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX09GQl9XRSA9IDB4MDAwMDAwMDQsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfSUZCX1JFID0gMHgwMDAwMDAwOCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19JRkJfV0VfTUFDMCA9IDB4MDAwMDAwMTAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfSUZCX1dFX01BQzEgPSAweDAwMDAwMDIwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX09ERV9SRSA9IDB4MDAwMDAwNDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfT0RFX1dFID0gMHgwMDAwMDA4MCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19JREVfUkUgPSAweDAwMDAwMTAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX0lERV9XRSA9IDB4MDAwMDAyMDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfU0RFX1JFID0gMHgwMDAwMDQwMCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19TREVfV0UgPSAweDAwMDAwODAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX0JMRSA9IDB4MDAwMDEwMDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfU1BFID0gMHgwMDAwMjAwMCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19FUDAgPSAweDAwMDA0MDAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX0VQMSA9IDB4MDAwMDgwMDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfSUNFID0gMHgwMDAxMDAwMCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19JTEUgPSAweDAwMDIwMDAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX09QRSA9IDB4MDAwNDAwMDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfVEEgPSAweDAwMDgwMDAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX01BID0gMHgwMDEwMDAwMCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19TQ0UgPSAweDAwMjAwMDAwLAorCVBPUlRfRkFUQUxfRVJST1JfU1RBVFVTX1JQRSA9IDB4MDA0MDAwMDAsCisJUE9SVF9GQVRBTF9FUlJPUl9TVEFUVVNfTVBFID0gMHgwMDgwMDAwMCwKKwlQT1JUX0ZBVEFMX0VSUk9SX1NUQVRVU19PQ0UgPSAweDAxMDAwMDAwLAorfTsKKworLyoKKyAqICBwb3J0IGNvbnRyb2wgYW5kIHN0YXR1cyBwYWdlIC0gcGFnZSAwCisgKi8KKworc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyB7CisJc3RydWN0IHFsM3h4eF9jb21tb25fcmVnaXN0ZXJzIENvbW1vblJlZ3M7CisKKwl1MzIgRXh0ZXJuYWxIV0NvbmZpZzsKKwl1MzIgSW50ZXJuYWxDaGlwQ29uZmlnOworCXUzMiBwb3J0Q29udHJvbDsKKwl1MzIgcG9ydFN0YXR1czsKKwl1MzIgbWFjQWRkckluZGlyZWN0UHRyUmVnOworCXUzMiBtYWNBZGRyRGF0YVJlZzsKKwl1MzIgbWFjTUlJTWdtdENvbnRyb2xSZWc7CisJdTMyIG1hY01JSU1nbXRBZGRyUmVnOworCXUzMiBtYWNNSUlNZ210RGF0YVJlZzsKKwl1MzIgbWFjTUlJU3RhdHVzUmVnOworCXUzMiBtYWMwQ29uZmlnUmVnOworCXUzMiBtYWMwSXBnSWZnUmVnOworCXUzMiBtYWMwSGFsZkR1cGxleFJlZzsKKwl1MzIgbWFjME1heEZyYW1lTGVuZ3RoUmVnOworCXUzMiBtYWMwUGF1c2VUaHJlc2hvbGRSZWc7CisJdTMyIG1hYzFDb25maWdSZWc7CisJdTMyIG1hYzFJcGdJZmdSZWc7CisJdTMyIG1hYzFIYWxmRHVwbGV4UmVnOworCXUzMiBtYWMxTWF4RnJhbWVMZW5ndGhSZWc7CisJdTMyIG1hYzFQYXVzZVRocmVzaG9sZFJlZzsKKwl1MzIgaXBBZGRySW5kZXhSZWc7CisJdTMyIGlwQWRkckRhdGFSZWc7CisJdTMyIGlwUmVhc3NlbWJseVRpbWVvdXQ7CisJdTMyIHRjcE1heFdpbmRvdzsKKwl1MzIgY3VycmVudFRjcFRpbWVzdGFtcFsyXTsKKwl1MzIgaW50ZXJuYWxSYW1SV0FkZHJSZWc7CisJdTMyIGludGVybmFsUmFtV0RhdGFSZWc7CisJdTMyIHJlY2xhaW1lZEJ1ZmZlckFkZHJSZWdMb3c7CisJdTMyIHJlY2xhaW1lZEJ1ZmZlckFkZHJSZWdIaWdoOworCXUzMiByZXNlcnZlZFsyXTsKKwl1MzIgZnBnYVJldklEOworCXUzMiBsb2NhbFJhbUFkZHI7CisJdTMyIGxvY2FsUmFtRGF0YUF1dG9JbmNyOworCXUzMiBsb2NhbFJhbURhdGFOb25JbmNyOworCXUzMiBncE91dHB1dDsKKwl1MzIgZ3BJbnB1dDsKKwl1MzIgcHJvYmVNdXhBZGRyOworCXUzMiBwcm9iZU11eERhdGE7CisJdTMyIHN0YXRpc3RpY3NJbmRleFJlZzsKKwl1MzIgc3RhdGlzdGljc1JlYWREYXRhUmVnQXV0b0luY3I7CisJdTMyIHN0YXRpc3RpY3NSZWFkRGF0YVJlZ05vSW5jcjsKKwl1MzIgUG9ydEZhdGFsRXJyU3RhdHVzOworfTsKKworLyoKKyAqIHBvcnQgaG9zdCBtZW1vcnkgY29uZmlnIHBhZ2UgLSBwYWdlIDEKKyAqLworc3RydWN0IHFsM3h4eF9ob3N0X21lbW9yeV9yZWdpc3RlcnMgeworCXN0cnVjdCBxbDN4eHhfY29tbW9uX3JlZ2lzdGVycyBDb21tb25SZWdzOworCisJdTMyIHJlc2VydmVkWzEyXTsKKworCS8qIE5ldHdvcmsgUmVxdWVzdCBRdWV1ZSAqLworCXUzMiByZXFDb25zdW1lckluZGV4OworCXUzMiByZXFDb25zdW1lckluZGV4QWRkckxvdzsKKwl1MzIgcmVxQ29uc3VtZXJJbmRleEFkZHJIaWdoOworCXUzMiByZXFCYXNlQWRkckxvdzsKKwl1MzIgcmVxQmFzZUFkZHJIaWdoOworCXUzMiByZXFMZW5ndGg7CisKKwkvKiBOZXR3b3JrIENvbXBsZXRpb24gUXVldWUgKi8KKwl1MzIgcnNwUHJvZHVjZXJJbmRleDsKKwl1MzIgcnNwUHJvZHVjZXJJbmRleEFkZHJMb3c7CisJdTMyIHJzcFByb2R1Y2VySW5kZXhBZGRySGlnaDsKKwl1MzIgcnNwQmFzZUFkZHJMb3c7CisJdTMyIHJzcEJhc2VBZGRySGlnaDsKKwl1MzIgcnNwTGVuZ3RoOworCisJLyogUlggTGFyZ2UgQnVmZmVyIFF1ZXVlICovCisJdTMyIHJ4TGFyZ2VRQ29uc3VtZXJJbmRleDsKKwl1MzIgcnhMYXJnZVFCYXNlQWRkckxvdzsKKwl1MzIgcnhMYXJnZVFCYXNlQWRkckhpZ2g7CisJdTMyIHJ4TGFyZ2VRTGVuZ3RoOworCXUzMiByeExhcmdlQnVmZmVyTGVuZ3RoOworCisJLyogUlggU21hbGwgQnVmZmVyIFF1ZXVlICovCisJdTMyIHJ4U21hbGxRQ29uc3VtZXJJbmRleDsKKwl1MzIgcnhTbWFsbFFCYXNlQWRkckxvdzsKKwl1MzIgcnhTbWFsbFFCYXNlQWRkckhpZ2g7CisJdTMyIHJ4U21hbGxRTGVuZ3RoOworCXUzMiByeFNtYWxsQnVmZmVyTGVuZ3RoOworCit9OworCisvKgorICogIHBvcnQgbG9jYWwgUkFNIHBhZ2UgLSBwYWdlIDIKKyAqLworc3RydWN0IHFsM3h4eF9sb2NhbF9yYW1fcmVnaXN0ZXJzIHsKKwlzdHJ1Y3QgcWwzeHh4X2NvbW1vbl9yZWdpc3RlcnMgQ29tbW9uUmVnczsKKwl1MzIgYnVmbGV0U2l6ZTsKKwl1MzIgbWF4QnVmbGV0Q291bnQ7CisJdTMyIGN1cnJlbnRCdWZsZXRDb3VudDsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTMyIGZyZWVCdWZsZXRUaHJlc2hvbGRMb3c7CisJdTMyIGZyZWVCdWZsZXRUaHJlc2hvbGRIaWdoOworCXUzMiBpcEhhc2hUYWJsZUJhc2U7CisJdTMyIGlwSGFzaFRhYmxlQ291bnQ7CisJdTMyIHRjcEhhc2hUYWJsZUJhc2U7CisJdTMyIHRjcEhhc2hUYWJsZUNvdW50OworCXUzMiBuY2JCYXNlOworCXUzMiBtYXhOY2JDb3VudDsKKwl1MzIgY3VycmVudE5jYkNvdW50OworCXUzMiBkcmJCYXNlOworCXUzMiBtYXhEcmJDb3VudDsKKwl1MzIgY3VycmVudERyYkNvdW50OworfTsKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBTZW1hcGhvcmUgYml0cyBpbiBTZW1hcGhvcmUvU2VyaWFsIE5WUkFNIGludGVyZmFjZSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTFNfNjRCSVRTKHgpICAgICh1MzIpKDB4ZmZmZmZmZmYgJiAoKHU2NCl4KSkKKyNkZWZpbmUgTVNfNjRCSVRTKHgpICAgICh1MzIpKDB4ZmZmZmZmZmYgJiAoKCh1NjQpeCk+PjE2Pj4xNikgKQorCisvKgorICogSS9PIHJlZ2lzdGVyCisgKi8KKworZW51bSB7CisJQ09OVFJPTF9SRUcgPSAwLAorCVNUQVRVU19SRUcgPSAxLAorCVBIWV9TVEFUX0xJTktfVVAgPSAweDAwMDQsCisJUEhZX0NUUkxfTE9PUEJBQ0sgPSAweDQwMDAsCisKKwlQRVRCSV9DT05UUk9MX1JFRyA9IDB4MDAsCisJUEVUQklfQ1RSTF9TT0ZUX1JFU0VUID0gMHg4MDAwLAorCVBFVEJJX0NUUkxfQVVUT19ORUcgPSAweDEwMDAsCisJUEVUQklfQ1RSTF9SRVNUQVJUX05FRyA9IDB4MDIwMCwKKwlQRVRCSV9DVFJMX0ZVTExfRFVQTEVYID0gMHgwMTAwLAorCVBFVEJJX0NUUkxfU1BFRURfMTAwMCA9IDB4MDA0MCwKKworCVBFVEJJX1NUQVRVU19SRUcgPSAweDAxLAorCVBFVEJJX1NUQVRfTkVHX0RPTkUgPSAweDAwMjAsCisJUEVUQklfU1RBVF9MSU5LX1VQID0gMHgwMDA0LAorCisJUEVUQklfTkVHX0FEVkVSID0gMHgwNCwKKwlQRVRCSV9ORUdfUEFVU0UgPSAweDAwODAsCisJUEVUQklfTkVHX1BBVVNFX01BU0sgPSAweDAxODAsCisJUEVUQklfTkVHX0RVUExFWCA9IDB4MDAyMCwKKwlQRVRCSV9ORUdfRFVQTEVYX01BU0sgPSAweDAwNjAsCisKKwlQRVRCSV9ORUdfUEFSVE5FUiA9IDB4MDUsCisJUEVUQklfTkVHX0VSUk9SX01BU0sgPSAweDMwMDAsCisKKwlQRVRCSV9FWFBBTlNJT05fUkVHID0gMHgwNiwKKwlQRVRCSV9FWFBfUEFHRV9SWCA9IDB4MDAwMiwKKworCVBFVEJJX1RCSV9DVFJMID0gMHgxMSwKKwlQRVRCSV9UQklfUkVTRVQgPSAweDgwMDAsCisJUEVUQklfVEJJX0FVVE9fU0VOU0UgPSAweDAxMDAsCisJUEVUQklfVEJJX1NFUkRFU19NT0RFID0gMHgwMDEwLAorCVBFVEJJX1RCSV9TRVJERVNfV1JBUCA9IDB4MDAwMiwKKworCUFVWF9DT05UUk9MX1NUQVRVUyA9IDB4MWMsCisJUEhZX0FVWF9ORUdfRE9ORSA9IDB4ODAwMCwKKwlQSFlfTkVHX1BBUlRORVIgPSA1LAorCVBIWV9BVVhfRFVQTEVYX1NUQVQgPSAweDAwMjAsCisJUEhZX0FVWF9TUEVFRF9TVEFUID0gMHgwMDE4LAorCVBIWV9BVVhfTk9fSFdfU1RSQVAgPSAweDAwMDQsCisJUEhZX0FVWF9SRVNFVF9TVElDSyA9IDB4MDAwMiwKKwlQSFlfTkVHX1BBVVNFID0gMHgwNDAwLAorCVBIWV9DVFJMX1NPRlRfUkVTRVQgPSAweDgwMDAsCisJUEhZX05FR19BRFZFUiA9IDQsCisJUEhZX05FR19BRFZfU1BFRUQgPSAweDAxZTAsCisJUEhZX0NUUkxfUkVTVEFSVF9ORUcgPSAweDAyMDAsCit9OworZW51bSB7CisvKiBBTTI5TFYgRmxhc2ggZGVmaW5pdGlvbnMJKi8KKwlGTTkzQzU2QV9TVEFSVCA9IDB4MSwKKy8qIENvbW1hbmRzICovCisJRk05M0M1NkFfUkVBRCA9IDB4MiwKKwlGTTkzQzU2QV9XRU4gPSAweDAsCisJRk05M0M1NkFfV1JJVEUgPSAweDEsCisJRk05M0M1NkFfV1JJVEVfQUxMID0gMHgwLAorCUZNOTNDNTZBX1dEUyA9IDB4MCwKKwlGTTkzQzU2QV9FUkFTRSA9IDB4MywKKwlGTTkzQzU2QV9FUkFTRV9BTEwgPSAweDAsCisvKiBDb21tYW5kIEV4dGVudGlvbnMgKi8KKwlGTTkzQzU2QV9XRU5fRVhUID0gMHgzLAorCUZNOTNDNTZBX1dSSVRFX0FMTF9FWFQgPSAweDEsCisJRk05M0M1NkFfV0RTX0VYVCA9IDB4MCwKKwlGTTkzQzU2QV9FUkFTRV9BTExfRVhUID0gMHgyLAorLyogU3BlY2lhbCBCaXRzICovCisJRk05M0M1NkFfUkVBRF9EVU1NWV9CSVRTID0gMSwKKwlGTTkzQzU2QV9SRUFEWSA9IDAsCisJRk05M0M1NkFfQlVTWSA9IDEsCisJRk05M0M1NkFfQ01EX0JJVFMgPSAyLAorLyogQU0yOUxWIEZsYXNoIGRlZmluaXRpb25zCSovCisJRk05M0M1NkFfU0laRV84ID0gMHgxMDAsCisJRk05M0M1NkFfU0laRV8xNiA9IDB4ODAsCisJRk05M0M2NkFfU0laRV84ID0gMHgyMDAsCisJRk05M0M2NkFfU0laRV8xNiA9IDB4MTAwLAorCUZNOTNDODZBX1NJWkVfMTYgPSAweDQwMCwKKy8qIEFkZHJlc3MgQml0cyAqLworCUZNOTNDNTZBX05PX0FERFJfQklUU18xNiA9IDgsCisJRk05M0M1NkFfTk9fQUREUl9CSVRTXzggPSA5LAorCUZNOTNDODZBX05PX0FERFJfQklUU18xNiA9IDEwLAorLyogRGF0YSBCaXRzICovCisJRk05M0M1NkFfREFUQV9CSVRTXzE2ID0gMTYsCisJRk05M0M1NkFfREFUQV9CSVRTXzggPSA4LAorfTsKK2VudW0geworLyogQXVidXJuIEJpdHMgKi8KKwkgICAgQVVCVVJOX0VFUFJPTV9ESSA9IDB4OCwKKwlBVUJVUk5fRUVQUk9NX0RJXzAgPSAweDAsCisJQVVCVVJOX0VFUFJPTV9ESV8xID0gMHg4LAorCUFVQlVSTl9FRVBST01fRE8gPSAweDQsCisJQVVCVVJOX0VFUFJPTV9ET18wID0gMHgwLAorCUFVQlVSTl9FRVBST01fRE9fMSA9IDB4NCwKKwlBVUJVUk5fRUVQUk9NX0NTID0gMHgyLAorCUFVQlVSTl9FRVBST01fQ1NfMCA9IDB4MCwKKwlBVUJVUk5fRUVQUk9NX0NTXzEgPSAweDIsCisJQVVCVVJOX0VFUFJPTV9DTEtfUklTRSA9IDB4MSwKKwlBVUJVUk5fRUVQUk9NX0NMS19GQUxMID0gMHgwLAorfTsKK2VudW0ge0VFUFJPTV9TSVpFID0gRk05M0M4NkFfU0laRV8xNiwKKwlFRVBST01fTk9fQUREUl9CSVRTID0gRk05M0M4NkFfTk9fQUREUl9CSVRTXzE2LAorCUVFUFJPTV9OT19EQVRBX0JJVFMgPSBGTTkzQzU2QV9EQVRBX0JJVFNfMTYsCit9OworCisvKgorICogIE1BQyBDb25maWcgZGF0YSBzdHJ1Y3R1cmUKKyAqLworICAgIHN0cnVjdCBlZXByb21fcG9ydF9jZmcgeworCXUxNiBldGhlck10dV9tYWM7CisJdTE2IHBhdXNlVGhyZXNob2xkX21hYzsKKwl1MTYgcmVzdW1lVGhyZXNob2xkX21hYzsKKwl1MTYgcG9ydENvbmZpZ3VyYXRpb247CisjZGVmaW5lIFBPUlRfQ09ORklHX0FVVE9fTkVHX0VOQUJMRUQgICAgICAgIDB4ODAwMAorI2RlZmluZSBQT1JUX0NPTkZJR19TWU1fUEFVU0VfRU5BQkxFRCAgICAgICAweDQwMDAKKyNkZWZpbmUgUE9SVF9DT05GSUdfRlVMTF9EVVBMRVhfRU5BQkxFRCAgICAgMHgyMDAwCisjZGVmaW5lIFBPUlRfQ09ORklHX0hBTEZfRFVQTEVYX0VOQUJMRUQgICAgIDB4MTAwMAorI2RlZmluZSBQT1JUX0NPTkZJR18xMDAwTUJfU1BFRUQgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgUE9SVF9DT05GSUdfMTAwTUJfU1BFRUQgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFBPUlRfQ09ORklHXzEwTUJfU1BFRUQgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQT1JUX0NPTkZJR19MSU5LX1NQRUVEX01BU0sgICAgICAgICAweDBGMDAKKwl1MTYgcmVzZXJ2ZWRbMTJdOworCit9OworCisvKgorICogQklPUyBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZWVwcm9tX2Jpb3NfY2ZnIHsKKwl1MTYgU3BpbkRseUVuOjEsIGRpc0Jpb3M6MSwgRW5NZW1NYXA6MSwgRW5TZWxlY3RCb290OjEsIFJlc2VydmVkOjEyOworCisJdTggYm9vdElEMDo3LCBib29kSUQwVmFsaWQ6MTsKKwl1OCBib290THVuMFs4XTsKKworCXU4IGJvb3RJRDE6NywgYm9vZElEMVZhbGlkOjE7CisJdTggYm9vdEx1bjFbOF07CisKKwl1MTYgTWF4THVuc1RyZ3Q7CisJdTggcmVzZXJ2ZWRbMTBdOworfTsKKworLyoKKyAqICBGdW5jdGlvbiBTcGVjaWZpYyBEYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZWVwcm9tX2Z1bmN0aW9uX2NmZyB7CisJdTggcmVzZXJ2ZWRbMzBdOworCXU4IG1hY0FkZHJlc3NbNl07CisJdTggbWFjQWRkcmVzc1NlY29uZGFyeVs2XTsKKworCXUxNiBzdWJzeXNWZW5kb3JJZDsKKwl1MTYgc3Vic3lzRGV2aWNlSWQ7Cit9OworCisvKgorICogIEVFUFJPTSBmb3JtYXQKKyAqLworc3RydWN0IGVlcHJvbV9kYXRhIHsKKwl1OCBhc2ljSWRbNF07CisJdTggdmVyc2lvbjsKKwl1OCBudW1Qb3J0czsKKwl1MTYgYm9hcmRJZDsKKworI2RlZmluZSBFRVBST01fQk9BUkRJRF9TVFJfU0laRSAgIDE2CisjZGVmaW5lIEVFUFJPTV9TRVJJQUxfTlVNX1NJWkUgICAgMTYKKworCXU4IGJvYXJkSWRTdHJbMTZdOworCXU4IHNlcmlhbE51bWJlclsxNl07CisJdTE2IGV4dEh3Q29uZmlnOworCXN0cnVjdCBlZXByb21fcG9ydF9jZmcgbWFjQ2ZnX3BvcnQwOworCXN0cnVjdCBlZXByb21fcG9ydF9jZmcgbWFjQ2ZnX3BvcnQxOworCXUxNiBidWZsZXRTaXplOworCXUxNiBidWZsZXRDb3VudDsKKwl1MTYgdGNwV2luZG93VGhyZXNob2xkNTA7CisJdTE2IHRjcFdpbmRvd1RocmVzaG9sZDI1OworCXUxNiB0Y3BXaW5kb3dUaHJlc2hvbGQwOworCXUxNiBpcEhhc2hUYWJsZUJhc2VIaTsKKwl1MTYgaXBIYXNoVGFibGVCYXNlTG87CisJdTE2IGlwSGFzaFRhYmxlU2l6ZTsKKwl1MTYgdGNwSGFzaFRhYmxlQmFzZUhpOworCXUxNiB0Y3BIYXNoVGFibGVCYXNlTG87CisJdTE2IHRjcEhhc2hUYWJsZVNpemU7CisJdTE2IG5jYlRhYmxlQmFzZUhpOworCXUxNiBuY2JUYWJsZUJhc2VMbzsKKwl1MTYgbmNiVGFibGVTaXplOworCXUxNiBkcmJUYWJsZUJhc2VIaTsKKwl1MTYgZHJiVGFibGVCYXNlTG87CisJdTE2IGRyYlRhYmxlU2l6ZTsKKwl1MTYgcmVzZXJ2ZWRfMTQyWzRdOworCXUxNiBpcFJlYXNzZW1ibHlUaW1lb3V0OworCXUxNiB0Y3BNYXhXaW5kb3dTaXplOworCXUxNiBpcFNlY3VyaXR5OworI2RlZmluZSBJUFNFQ19DT05GSUdfUFJFU0VOVCAweDAwMDEKKwl1OCByZXNlcnZlZF8xNTZbMjk0XTsKKwl1MTYgcURlYnVnWzhdOworCXN0cnVjdCBlZXByb21fZnVuY3Rpb25fY2ZnIGZ1bmNDZmdfZm4wOworCXUxNiByZXNlcnZlZF81MTA7CisJdTggb2VtU3BhY2VbNDMyXTsKKwlzdHJ1Y3QgZWVwcm9tX2Jpb3NfY2ZnIGJpb3NDZmdfZm4xOworCXN0cnVjdCBlZXByb21fZnVuY3Rpb25fY2ZnIGZ1bmNDZmdfZm4xOworCXUxNiByZXNlcnZlZF8xMDIyOworCXU4IHJlc2VydmVkXzEwMjRbNDY0XTsKKwlzdHJ1Y3QgZWVwcm9tX2Z1bmN0aW9uX2NmZyBmdW5jQ2ZnX2ZuMjsKKwl1MTYgcmVzZXJ2ZWRfMTUzNDsKKwl1OCByZXNlcnZlZF8xNTM2WzQzMl07CisJc3RydWN0IGVlcHJvbV9iaW9zX2NmZyBiaW9zQ2ZnX2ZuMzsKKwlzdHJ1Y3QgZWVwcm9tX2Z1bmN0aW9uX2NmZyBmdW5jQ2ZnX2ZuMzsKKwl1MTYgY2hlY2tzdW07Cit9OworCisvKgorICogR2VuZXJhbCBkZWZpbml0aW9ucy4uLgorICovCisKKy8qCisgKiBCZWxvdyBhcmUgYSBudW1iZXIgY29tcGlsZXIgc3dpdGNoZXMgZm9yIGNvbnRyb2xsaW5nIGRyaXZlciBiZWhhdmlvci4KKyAqIFNvbWUgYXJlIG5vdCBzdXBwb3J0ZWQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zIGFuZCBhcmUgbm90YXRlZCBhcyBzdWNoLgorICovCisKKyNkZWZpbmUgUUwzWFhYX1ZFTkRPUl9JRCAgICAweDEwNzcKKyNkZWZpbmUgUUwzMDIyX0RFVklDRV9JRCAgICAweDMwMjIKKworLyogTVRVICYgRnJhbWUgU2l6ZSBzdHVmZiAqLworI2RlZmluZSBOT1JNQUxfTVRVX1NJWkUgCQlFVEhfREFUQV9MRU4KKyNkZWZpbmUgSlVNQk9fTVRVX1NJWkUgCQkJOTAwMAorI2RlZmluZSBWTEFOX0lEX0xFTgkJCSAgICAyCisKKy8qIFJlcXVlc3QgUXVldWUgUmVsYXRlZCBEZWZpbml0aW9ucyAqLworI2RlZmluZSBOVU1fUkVRX1FfRU5UUklFUyAgIDI1NgkvKiBzbyB0aGF0IDY0ICogNjQgID0gNDA5NiAoMSBwYWdlKSAqLworCisvKiBSZXNwb25zZSBRdWV1ZSBSZWxhdGVkIERlZmluaXRpb25zICovCisjZGVmaW5lIE5VTV9SU1BfUV9FTlRSSUVTICAgMjU2CS8qIHNvIHRoYXQgMjU2ICogMTYgID0gNDA5NiAoMSBwYWdlKSAqLworCisvKiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBCdWZmZXJzICovCisjZGVmaW5lIE5VTV9MQlVGUV9FTlRSSUVTICAgCTEyOAorI2RlZmluZSBOVU1fU0JVRlFfRU5UUklFUyAgIAk2NAorI2RlZmluZSBRTF9TTUFMTF9CVUZGRVJfU0laRSAgICAzMgorI2RlZmluZSBRTF9BRERSX0VMRV9QRVJfQlVGUV9FTlRSWSBcCisoc2l6ZW9mKHN0cnVjdCBscmdfYnVmX3FfZW50cnkpIC8gc2l6ZW9mKHN0cnVjdCBidWZxX2FkZHJfZWxlbWVudCkpCisgICAgLyogRWFjaCBzZW5kIGhhcyBhdCBsZWFzdCBjb250cm9sIGJsb2NrLiAgVGhpcyBpcyBob3cgbWFueSB3ZSBrZWVwLiAqLworI2RlZmluZSBOVU1fU01BTExfQlVGRkVSUyAgICAgCU5VTV9TQlVGUV9FTlRSSUVTICogUUxfQUREUl9FTEVfUEVSX0JVRlFfRU5UUlkKKyNkZWZpbmUgTlVNX0xBUkdFX0JVRkZFUlMgICAgIAlOVU1fTEJVRlFfRU5UUklFUyAqIFFMX0FERFJfRUxFX1BFUl9CVUZRX0VOVFJZCisjZGVmaW5lIFFMX0hFQURFUl9TUEFDRSAzMgkvKiBtYWtlIGhlYWRlciBzcGFjZSBhdCB0b3Agb2Ygc2tiLiAqLworLyoKKyAqIExhcmdlICYgU21hbGwgQnVmZmVycyBmb3IgUmVjZWl2ZXMKKyAqLworc3RydWN0IGxyZ19idWZfcV9lbnRyeSB7CisKKwl1MzIgYWRkcjBfbG93ZXI7CisjZGVmaW5lIElBTF9MQVNUX0VOVFJZIDB4MDAwMDAwMDEKKyNkZWZpbmUgSUFMX0NPTlRfRU5UUlkgMHgwMDAwMDAwMgorI2RlZmluZSBJQUxfRkxBR19NQVNLICAweDAwMDAwMDAzCisJdTMyIGFkZHIwX3VwcGVyOworCXUzMiBhZGRyMV9sb3dlcjsKKwl1MzIgYWRkcjFfdXBwZXI7CisJdTMyIGFkZHIyX2xvd2VyOworCXUzMiBhZGRyMl91cHBlcjsKKwl1MzIgYWRkcjNfbG93ZXI7CisJdTMyIGFkZHIzX3VwcGVyOworCXUzMiBhZGRyNF9sb3dlcjsKKwl1MzIgYWRkcjRfdXBwZXI7CisJdTMyIGFkZHI1X2xvd2VyOworCXUzMiBhZGRyNV91cHBlcjsKKwl1MzIgYWRkcjZfbG93ZXI7CisJdTMyIGFkZHI2X3VwcGVyOworCXUzMiBhZGRyN19sb3dlcjsKKwl1MzIgYWRkcjdfdXBwZXI7CisKK307CisKK3N0cnVjdCBidWZxX2FkZHJfZWxlbWVudCB7CisJdTMyIGFkZHJfbG93OworCXUzMiBhZGRyX2hpZ2g7Cit9OworCisjZGVmaW5lIFFMX05PX1JFU0VUCQkJMAorI2RlZmluZSBRTF9ET19SRVNFVAkJCTEKKworZW51bSBsaW5rX3N0YXRlX3QgeworCUxTX1VOS05PV04gPSAwLAorCUxTX0RPV04sCisJTFNfREVHUkFERSwKKwlMU19SRUNPVkVSLAorCUxTX1VQLAorfTsKKworc3RydWN0IHFsX3Jjdl9idWZfY2IgeworCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpuZXh0OworCXN0cnVjdCBza19idWZmICpza2I7CisJIERFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwYWRkcik7CisJIERFQ0xBUkVfUENJX1VOTUFQX0xFTihtYXBsZW4pOworCV9fbGUzMiBidWZfcGh5X2FkZHJfbG93OworCV9fbGUzMiBidWZfcGh5X2FkZHJfaGlnaDsKKwlpbnQgaW5kZXg7Cit9OworCitzdHJ1Y3QgcWxfdHhfYnVmX2NiIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBvYl9tYWNfaW9jYl9yZXEgKnF1ZXVlX2VudHJ5IDsKKwkgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBhZGRyKTsKKwkgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKG1hcGxlbik7Cit9OworCisvKiBkZWZpbml0aW9ucyBmb3IgdHlwZSBmaWVsZCAqLworI2RlZmluZSBRTF9CVUZfVFlQRV9NQUNJT0NCIDB4MDEKKyNkZWZpbmUgUUxfQlVGX1RZUEVfSVBJT0NCICAweDAyCisjZGVmaW5lIFFMX0JVRl9UWVBFX1RDUElPQ0IgMHgwMworCisvKiBxZGV2LT5mbGFncyBkZWZpbml0aW9ucy4gKi8KK2VudW0geyBRTF9SRVNFVF9ET05FID0gMSwJLyogUmVzZXQgZmluaXNoZWQuICovCisJUUxfUkVTRVRfQUNUSVZFID0gMiwJLyogV2FpdGluZyBmb3IgcmVzZXQgdG8gZmluaXNoLiAqLworCVFMX1JFU0VUX1NUQVJUID0gMywJLyogUGxlYXNlIHJlc2V0IHRoZSBjaGlwLiAqLworCVFMX1JFU0VUX1BFUl9TQ1NJID0gNCwJLyogU0NTSSBkcml2ZXIgcmVxdWVzdHMgcmVzZXQuICovCisJUUxfVFhfVElNRU9VVCA9IDUsCS8qIFRpbWVvdXQgaW4gcHJvZ3Jlc3MuICovCisJUUxfTElOS19NQVNURVIgPSA2LAkvKiBUaGlzIGRyaXZlciBjb250cm9scyB0aGUgbGluay4gKi8KKwlRTF9BREFQVEVSX1VQID0gNywJLyogQWRhcHRlciBoYXMgYmVlbiBicm91Z2h0IHVwLiAqLworCVFMX1RIUkVBRF9VUCA9IDgsCS8qIFRoaXMgZmxhZyBpcyBhdmFpbGFibGUuICovCisJUUxfTElOS19VUCA9IDksCS8qIExpbmsgU3RhdHVzLiAqLworCVFMX0FMTE9DX1JFUV9SU1BfUV9ET05FID0gMTAsCisJUUxfQUxMT0NfQlVGUVNfRE9ORSA9IDExLAorCVFMX0FMTE9DX1NNQUxMX0JVRl9ET05FID0gMTIsCisJUUxfTElOS19PUFRJQ0FMID0gMTMsCisJUUxfTVNJX0VOQUJMRUQgPSAxNCwKK307CisKKy8qCisgKiBxbDNfYWRhcHRlciAtIFRoZSBtYWluIEFkYXB0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKiBUaGlzIHN0cnVjdHVyZSBoYXMgYWxsIGZpZWxkcyByZWxldmFudCB0byB0aGUgaGFyZHdhcmUuCisgKi8KKworc3RydWN0IHFsM19hZGFwdGVyIHsKKwl1MzIgcmVzZXJ2ZWRfMDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBDSSBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwkvKiBQYXJlbnQgTkVUIGRldmljZSAqLworCisJLyogSGFyZHdhcmUgaW5mb3JtYXRpb24gKi8KKwl1OCBjaGlwX3Jldl9pZDsKKwl1OCBwY2lfc2xvdDsKKwl1OCBwY2lfd2lkdGg7CisJdTggcGNpX3g7CisJdTMyIG1zaTsKKwlpbnQgaW5kZXg7CisJc3RydWN0IHRpbWVyX2xpc3QgYWRhcHRlcl90aW1lcjsJLyogdGltZXIgdXNlZCBmb3IgdmFyaW91cyBmdW5jdGlvbnMgKi8KKworCXNwaW5sb2NrX3QgYWRhcHRlcl9sb2NrOworCXNwaW5sb2NrX3QgaHdfbG9jazsKKworCS8qIFBDSSBCdXMgUmVsYXRpdmUgUmVnaXN0ZXIgQWRkcmVzc2VzICovCisJdTggKm1tYXBfdmlydF9iYXNlOwkvKiBzdG9yZXMgcmV0dXJuIHZhbHVlIGZyb20gaW9yZW1hcCgpICovCisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICptZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgY3VycmVudF9wYWdlOwkvKiB0cmFja3MgY3VycmVudCByZWdpc3RlciBwYWdlICovCisKKwl1MzIgbXNnX2VuYWJsZTsKKwl1OCByZXNlcnZlZF8wMVsyXTsKKwl1OCByZXNlcnZlZF8wMlsyXTsKKworCS8qIFBhZ2UgZm9yIFNoYWRvdyBSZWdpc3RlcnMgKi8KKwl2b2lkICpzaGFkb3dfcmVnX3ZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IHNoYWRvd19yZWdfcGh5X2FkZHI7CisKKwkvKiBOZXQgUmVxdWVzdCBRdWV1ZSAqLworCXUzMiByZXFfcV9zaXplOworCXUzMiByZXNlcnZlZF8wMzsKKwlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpyZXFfcV92aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCByZXFfcV9waHlfYWRkcjsKKwl1MTYgcmVxX3Byb2R1Y2VyX2luZGV4OworCXUxNiByZXNlcnZlZF8wNDsKKwl1MTYgKnByZXFfY29uc3VtZXJfaW5kZXg7CisJdTMyIHJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9oaWdoOworCXUzMiByZXFfY29uc3VtZXJfaW5kZXhfcGh5X2FkZHJfbG93OworCWF0b21pY190IHR4X2NvdW50OworCXN0cnVjdCBxbF90eF9idWZfY2IgdHhfYnVmW05VTV9SRVFfUV9FTlRSSUVTXTsKKworCS8qIE5ldCBSZXNwb25zZSBRdWV1ZSAqLworCXUzMiByc3BfcV9zaXplOworCXUzMiBlZXByb21fY21kX2RhdGE7CisJc3RydWN0IG5ldF9yc3BfaW9jYiAqcnNwX3FfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgcnNwX3FfcGh5X2FkZHI7CisJc3RydWN0IG5ldF9yc3BfaW9jYiAqcnNwX2N1cnJlbnQ7CisJdTE2IHJzcF9jb25zdW1lcl9pbmRleDsKKwl1MTYgcmVzZXJ2ZWRfMDY7CisJdTMyICpwcnNwX3Byb2R1Y2VyX2luZGV4OworCXUzMiByc3BfcHJvZHVjZXJfaW5kZXhfcGh5X2FkZHJfaGlnaDsKKwl1MzIgcnNwX3Byb2R1Y2VyX2luZGV4X3BoeV9hZGRyX2xvdzsKKworCS8qIExhcmdlIEJ1ZmZlciBRdWV1ZSAqLworCXUzMiBscmdfYnVmX3FfYWxsb2Nfc2l6ZTsKKwl1MzIgbHJnX2J1Zl9xX3NpemU7CisJdm9pZCAqbHJnX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkcjsKKwl2b2lkICpscmdfYnVmX3FfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgbHJnX2J1Zl9xX2FsbG9jX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgbHJnX2J1Zl9xX3BoeV9hZGRyOworCXUzMiBscmdfYnVmX3FfcHJvZHVjZXJfaW5kZXg7CisJdTMyIGxyZ19idWZfcmVsZWFzZV9jbnQ7CisJc3RydWN0IGJ1ZnFfYWRkcl9lbGVtZW50ICpscmdfYnVmX25leHRfZnJlZTsKKworCS8qIExhcmdlIChSZWNlaXZlKSBCdWZmZXJzICovCisJc3RydWN0IHFsX3Jjdl9idWZfY2IgbHJnX2J1ZltOVU1fTEFSR0VfQlVGRkVSU107CisJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfZnJlZV9oZWFkOworCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpscmdfYnVmX2ZyZWVfdGFpbDsKKwl1MzIgbHJnX2J1Zl9mcmVlX2NvdW50OworCXUzMiBscmdfYnVmZmVyX2xlbjsKKwl1MzIgbHJnX2J1Zl9pbmRleDsKKwl1MzIgbHJnX2J1Zl9za2JfY2hlY2s7CisKKwkvKiBTbWFsbCBCdWZmZXIgUXVldWUgKi8KKwl1MzIgc21hbGxfYnVmX3FfYWxsb2Nfc2l6ZTsKKwl1MzIgc21hbGxfYnVmX3Ffc2l6ZTsKKwl1MzIgc21hbGxfYnVmX3FfcHJvZHVjZXJfaW5kZXg7CisJdm9pZCAqc21hbGxfYnVmX3FfYWxsb2NfdmlydF9hZGRyOworCXZvaWQgKnNtYWxsX2J1Zl9xX3ZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IHNtYWxsX2J1Zl9xX2FsbG9jX3BoeV9hZGRyOworCWRtYV9hZGRyX3Qgc21hbGxfYnVmX3FfcGh5X2FkZHI7CisJdTMyIHNtYWxsX2J1Zl9pbmRleDsKKworCS8qIFNtYWxsIChSZWNlaXZlKSBCdWZmZXJzICovCisJdm9pZCAqc21hbGxfYnVmX3ZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IHNtYWxsX2J1Zl9waHlfYWRkcjsKKwl1MzIgc21hbGxfYnVmX3BoeV9hZGRyX2xvdzsKKwl1MzIgc21hbGxfYnVmX3BoeV9hZGRyX2hpZ2g7CisJdTMyIHNtYWxsX2J1Zl9yZWxlYXNlX2NudDsKKwl1MzIgc21hbGxfYnVmX3RvdGFsX3NpemU7CisKKwkvKiBJU1IgcmVsYXRlZCwgc2F2ZXMgc3RhdHVzIGZvciBEUEMuICovCisJdTMyIGNvbnRyb2xfc3RhdHVzOworCisJc3RydWN0IGVlcHJvbV9kYXRhIG52cmFtX2RhdGE7CisJc3RydWN0IHRpbWVyX2xpc3QgaW9jdGxfdGltZXI7CisJdTMyIHBvcnRfbGlua19zdGF0ZTsKKwl1MzIgbGFzdF9yc3Bfb2Zmc2V0OworCisJLyogNDAyMiBzcGVjaWZpYyAqLworCXUzMiBtYWNfaW5kZXg7CQkvKiBEcml2ZXIncyBNQUMgbnVtYmVyIGNhbiBiZSAwIG9yIDEgZm9yIGZpcnN0IGFuZCBzZWNvbmQgbmV0d29ya2luZyBmdW5jdGlvbnMgcmVzcGVjdGl2ZWx5ICovCisJdTMyIFBIWUFkZHI7CQkvKiBBZGRyZXNzIG9mIFBIWSAweDFlMDAgUG9ydCAwIGFuZCAweDFmMDAgUG9ydCAxICovCisJdTMyIG1hY19vYl9vcGNvZGU7CS8qIE9wY29kZSB0byB1c2Ugb24gbWFjIHRyYW5zbWlzc2lvbiAqLworCXUzMiB0Y3Bfb2Jfb3Bjb2RlOwkvKiBPcGNvZGUgdG8gdXNlIG9uIHRjcCB0cmFuc21pc3Npb24gKi8KKwl1MzIgdXBkYXRlX29iX29wY29kZTsJLyogT3Bjb2RlIHRvIHVzZSBmb3IgdXBkYXRpbmcgTkNCICovCisJdTMyIG1iX2JpdF9tYXNrOwkvKiBNQSBCaXRzIG1hc2sgdG8gdXNlIG9uIHRyYW5zbWlzc2lvbiAqLworCXUzMiBudW1Qb3J0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3dvcms7CisJdTMyIG1heF9mcmFtZV9zaXplOworfTsKKworI2VuZGlmCQkJCS8qIF9RTEEzWFhYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCA0YzJmNTc1Li41NzIyYTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTI4MDksNyArMjgwOSw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogcnRsODE2OV9pbml0X21vZHVsZSh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnJ0bDgxNjlfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxNjlfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcnJ1bm5lci5jIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5jCmluZGV4IGMzZWQ3MzQuLjMxYmNkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3JydW5uZXIuYworKysgYi9kcml2ZXJzL25ldC9ycnVubmVyLmMKQEAgLTE3MzYsNyArMTczNiw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHJyX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnJfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnJfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHJyX2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggZTcyZTBlMC4uYzE2ZjkxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtNzIzMyw3ICs3MjMzLDcgQEAKIAogaW50IF9faW5pdCBzMmlvX3N0YXJ0ZXIodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzMmlvX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnMyaW9fZHJpdmVyKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYWE5NzMwLmMgYi9kcml2ZXJzL25ldC9zYWE5NzMwLmMKaW5kZXggYjJhY2VkYi4uYzQ3OWIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2FhOTczMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwpAQCAtMTEzMSw3ICsxMTMxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2FhOTczMF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2FhOTczMF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzYWE5NzMwX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzYWE5NzMwX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczE5MC5jIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKaW5kZXggZGYwY2JlYi4uMTZlMzBkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzMTkwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKQEAgLTE4NzEsNyArMTg3MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNpczE5MF9pbml0X21vZHVsZSh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNpczE5MF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lzMTkwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2lzMTkwX2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXM5MDAuYyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCmluZGV4IDI5ZWU3ZmYuLjZhZjUwMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczkwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCkBAIC0xMzQsNiArMTM0LDcgQEAKIAl7ICJBTUQgNzlDOTAxIDEwQkFTRS1UIFBIWSIsICAJCTB4MDAwMCwgMHg2QjcwLCBMQU4gfSwKIAl7ICJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwJCTB4MDAwMCwgMHg2QjkwLCBIT01FfSwKIAl7ICJJQ1MgTEFOIFBIWSIsCQkJMHgwMDE1LCAweEY0NDAsIExBTiB9LAorCXsgIklDUyBMQU4gUEhZIiwJCQkweDAxNDMsIDB4QkM3MCwgTEFOIH0sCiAJeyAiTlMgODM4NTEgUEhZIiwJCQkweDIwMDAsIDB4NUMyMCwgTUlYIH0sCiAJeyAiTlMgODM4NDcgUEhZIiwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCwgMHg1QzMwLCBNSVggfSwKIAl7ICJSZWFsdGVrIFJUTDgyMDEgUEhZIiwJCTB4MDAwMCwgMHg4MjAwLCBMQU4gfSwKQEAgLTI0OTUsNyArMjQ5Niw3IEBACiAJcHJpbnRrKHZlcnNpb24pOwogI2VuZGlmCiAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzaXM5MDBfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNpczkwMF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNpczkwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwppbmRleCBlZTYyODQ1Li40OWU3NmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtNTEzMyw3ICs1MTMzLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2tnZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2tnZV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza2dlX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBza2dlX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCmluZGV4IGI1NzE0YTYwLi44ZTRkMTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKQEAgLTIyODAsNyArMjI4MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNrZmRfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNrZmRkaV9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2tmZGRpX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2tmZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmMgYi9kcml2ZXJzL25ldC9za2dlLmMKaW5kZXggYWQ4NzhkZi4uZmJhOGI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwpAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgInNrZ2UuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkJInNrZ2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMS42IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuOCIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCiAKICNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUJMTI4CkBAIC05MSw3ICs5MSw3IEBACiBzdGF0aWMgaW50IHNrZ2VfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHNrZ2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHNrZ2VfcGh5X3Jlc2V0KHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpOwotc3RhdGljIHZvaWQgc2tnZV90eF9jbGVhbihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKTsKK3N0YXRpYyB2b2lkIHNrZ2VfdHhfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHhtX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKTsKIHN0YXRpYyBpbnQgZ21fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOwogc3RhdGljIHZvaWQgZ2VuZXNpc19nZXRfc3RhdHMoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwgdTY0ICpkYXRhKTsKQEAgLTEwNSw2ICsxMDUsNyBAQAogc3RhdGljIGNvbnN0IGludCByeHFhZGRyW10gPSB7IFFfUjEsIFFfUjIgfTsKIHN0YXRpYyBjb25zdCB1MzIgcnhpcnFtYXNrW10gPSB7IElTX1IxX0YsIElTX1IyX0YgfTsKIHN0YXRpYyBjb25zdCB1MzIgdHhpcnFtYXNrW10gPSB7IElTX1hBMV9GLCBJU19YQTJfRiB9Oworc3RhdGljIGNvbnN0IHUzMiBpcnFtYXNrW10gPSB7IElTX1IxX0Z8SVNfWEExX0YsIElTX1IyX0Z8SVNfWEEyX0YgfTsKIAogc3RhdGljIGludCBza2dlX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtODE4LDggKzgxOSw5IEBACiAvKiBBbGxvY2F0ZSBidWZmZXJzIGZvciByZWNlaXZlIHJpbmcKICAqIEZvciByZWNlaXZlOiAgdG9fY2xlYW4gaXMgbmV4dCByZWNlaXZlZCBmcmFtZS4KICAqLwotc3RhdGljIGludCBza2dlX3J4X2ZpbGwoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3N0YXRpYyBpbnQgc2tnZV9yeF9maWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrZ2VfcmluZyAqcmluZyA9ICZza2dlLT5yeF9yaW5nOwogCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CiAKQEAgLTgyNyw3ICs4MjksOCBAQAogCWRvIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCQlza2IgPSBhbGxvY19za2Ioc2tnZS0+cnhfYnVmX3NpemUgKyBORVRfSVBfQUxJR04sIEdGUF9LRVJORUwpOworCQlza2IgPSBfX25ldGRldl9hbGxvY19za2IoZGV2LCBza2dlLT5yeF9idWZfc2l6ZSArIE5FVF9JUF9BTElHTiwKKwkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIXNrYikKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMTc4LDcgKzIxODEsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9wY2lfbWVtOwogCi0JZXJyID0gc2tnZV9yeF9maWxsKHNrZ2UpOworCWVyciA9IHNrZ2VfcnhfZmlsbChkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9yeF9yaW5nOwogCkBAIC0yMjgxLDcgKzIyODQsNyBAQAogCXNrZ2VfbGVkKHNrZ2UsIExFRF9NT0RFX09GRik7CiAKIAluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKLQlza2dlX3R4X2NsZWFuKHNrZ2UpOworCXNrZ2VfdHhfY2xlYW4oZGV2KTsKIAlza2dlX3J4X2NsZWFuKHNrZ2UpOwogCiAJa2ZyZWUoc2tnZS0+cnhfcmluZy5zdGFydCk7CkBAIC0yMzA2LDI1ICsyMzA5LDEyIEBACiAJaW50IGk7CiAJdTMyIGNvbnRyb2wsIGxlbjsKIAl1NjQgbWFwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCi0JaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmc2tnZS0+dHhfbG9jaywgZmxhZ3MpKQotCQkvKiBDb2xsaXNpb24gLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KLQkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7Ci0KLQlpZiAodW5saWtlbHkoc2tnZV9hdmFpbCgmc2tnZS0+dHhfcmluZykgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkpIHsKLQkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKLQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiByaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZza2dlLT50eF9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KHNrZ2VfYXZhaWwoJnNrZ2UtPnR4X3JpbmcpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKQogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JfQogCiAJZSA9IHNrZ2UtPnR4X3JpbmcudG9fdXNlOwogCXRkID0gZS0+ZGVzYzsKQEAgLTIzOTksOCArMjM4OSw2IEBACiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZza2dlLT50eF9sb2NrLCBmbGFncyk7Ci0KIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC0yNDMwLDE4ICsyNDE4LDE4IEBACiAJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiB0eCBkb25lIHNsb3QgJXRkXG4iLAogCQkJICAgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgZSAtIHNrZ2UtPnR4X3Jpbmcuc3RhcnQpOwogCi0JCWRldl9rZnJlZV9za2JfYW55KGUtPnNrYik7CisJCWRldl9rZnJlZV9za2IoZS0+c2tiKTsKIAl9CiAJZS0+c2tiID0gTlVMTDsKIH0KIAogLyogRnJlZSBhbGwgYnVmZmVycyBpbiB0cmFuc21pdCByaW5nICovCi1zdGF0aWMgdm9pZCBza2dlX3R4X2NsZWFuKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCitzdGF0aWMgdm9pZCBza2dlX3R4X2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNrZ2UtPnR4X2xvY2ssIGZsYWdzKTsKKwluZXRpZl90eF9sb2NrX2JoKGRldik7CiAJZm9yIChlID0gc2tnZS0+dHhfcmluZy50b19jbGVhbjsgZSAhPSBza2dlLT50eF9yaW5nLnRvX3VzZTsgZSA9IGUtPm5leHQpIHsKIAkJc3RydWN0IHNrZ2VfdHhfZGVzYyAqdGQgPSBlLT5kZXNjOwogCQlza2dlX3R4X2ZyZWUoc2tnZSwgZSwgdGQtPmNvbnRyb2wpOwpAQCAtMjQ0OSw4ICsyNDM3LDggQEAKIAl9CiAKIAlza2dlLT50eF9yaW5nLnRvX2NsZWFuID0gZTsKLQluZXRpZl93YWtlX3F1ZXVlKHNrZ2UtPm5ldGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2tnZS0+dHhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgc2tnZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yNDYxLDcgKzI0NDksNyBAQAogCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiB0eCB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOwogCiAJc2tnZV93cml0ZTgoc2tnZS0+aHcsIFFfQUREUih0eHFhZGRyW3NrZ2UtPnBvcnRdLCBRX0NTUiksIENTUl9TVE9QKTsKLQlza2dlX3R4X2NsZWFuKHNrZ2UpOworCXNrZ2VfdHhfY2xlYW4oZGV2KTsKIH0KIAogc3RhdGljIGludCBza2dlX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCkBAIC0yNTg0LDE2ICsyNTcyLDE3IEBACiAvKiBHZXQgcmVjZWl2ZSBidWZmZXIgZnJvbSBkZXNjcmlwdG9yLgogICogSGFuZGxlcyBjb3B5IG9mIHNtYWxsIGJ1ZmZlcnMgYW5kIHJlYWxsb2NhdGlvbiBmYWlsdXJlcwogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza2dlX3J4X2dldChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLAotCQkJCQkgIHN0cnVjdCBza2dlX2VsZW1lbnQgKmUsCi0JCQkJCSAgdTMyIGNvbnRyb2wsIHUzMiBzdGF0dXMsIHUxNiBjc3VtKQorc3RhdGljIHN0cnVjdCBza19idWZmICpza2dlX3J4X2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBza2dlX2VsZW1lbnQgKmUsCisJCQkJICAgdTMyIGNvbnRyb2wsIHUzMiBzdGF0dXMsIHUxNiBjc3VtKQogeworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTE2IGxlbiA9IGNvbnRyb2wgJiBCTVVfQkJDOwogCiAJaWYgKHVubGlrZWx5KG5ldGlmX21zZ19yeF9zdGF0dXMoc2tnZSkpKQogCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiByeCBzbG90ICV0ZCBzdGF0dXMgMHgleCBsZW4gJWRcbiIsCi0JCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIGUgLSBza2dlLT5yeF9yaW5nLnN0YXJ0LAorCQkgICAgICAgZGV2LT5uYW1lLCBlIC0gc2tnZS0+cnhfcmluZy5zdGFydCwKIAkJICAgICAgIHN0YXR1cywgbGVuKTsKIAogCWlmIChsZW4gPiBza2dlLT5yeF9idWZfc2l6ZSkKQEAgLTI2MDksNyArMjU5OCw3IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAobGVuIDwgUlhfQ09QWV9USFJFU0hPTEQpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKGxlbiArIDIsIEdGUF9BVE9NSUMpOworCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuICsgMik7CiAJCWlmICghc2tiKQogCQkJZ290byByZXN1Ym1pdDsKIApAQCAtMjYyNCw3ICsyNjEzLDcgQEAKIAkJc2tnZV9yeF9yZXVzZShlLCBza2dlLT5yeF9idWZfc2l6ZSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7Ci0JCW5za2IgPSBhbGxvY19za2Ioc2tnZS0+cnhfYnVmX3NpemUgKyBORVRfSVBfQUxJR04sIEdGUF9BVE9NSUMpOworCQluc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHNrZ2UtPnJ4X2J1Zl9zaXplICsgTkVUX0lQX0FMSUdOKTsKIAkJaWYgKCFuc2tiKQogCQkJZ290byByZXN1Ym1pdDsKIApAQCAtMjYzOSwyMCArMjYyOCwxOSBAQAogCX0KIAogCXNrYl9wdXQoc2tiLCBsZW4pOwotCXNrYi0+ZGV2ID0gc2tnZS0+bmV0ZGV2OwogCWlmIChza2dlLT5yeF9jc3VtKSB7CiAJCXNrYi0+Y3N1bSA9IGNzdW07CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CiAJfQogCi0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tnZS0+bmV0ZGV2KTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAJcmV0dXJuIHNrYjsKIGVycm9yOgogCiAJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2tnZSkpCiAJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHJ4IGVyciwgc2xvdCAldGQgY29udHJvbCAweCV4IHN0YXR1cyAweCV4XG4iLAotCQkgICAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lLCBlIC0gc2tnZS0+cnhfcmluZy5zdGFydCwKKwkJICAgICAgIGRldi0+bmFtZSwgZSAtIHNrZ2UtPnJ4X3Jpbmcuc3RhcnQsCiAJCSAgICAgICBjb250cm9sLCBzdGF0dXMpOwogCiAJaWYgKHNrZ2UtPmh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewpAQCAtMjY3NywxNSArMjY2NSwxNSBAQAogfQogCiAvKiBGcmVlIGFsbCBidWZmZXJzIGluIFR4IHJpbmcgd2hpY2ggYXJlIG5vIGxvbmdlciBvd25lZCBieSBkZXZpY2UgKi8KLXN0YXRpYyB2b2lkIHNrZ2VfdHhpcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHNrZ2VfdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza2dlX3JpbmcgKnJpbmcgPSAmc2tnZS0+dHhfcmluZzsKIAlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplOwogCi0Jcm1iKCk7CisJc2tnZV93cml0ZTgoc2tnZS0+aHcsIFFfQUREUih0eHFhZGRyW3NrZ2UtPnBvcnRdLCBRX0NTUiksIENTUl9JUlFfQ0xfRik7CiAKLQlzcGluX2xvY2soJnNrZ2UtPnR4X2xvY2spOworCW5ldGlmX3R4X2xvY2soZGV2KTsKIAlmb3IgKGUgPSByaW5nLT50b19jbGVhbjsgZSAhPSByaW5nLT50b191c2U7IGUgPSBlLT5uZXh0KSB7CiAJCXN0cnVjdCBza2dlX3R4X2Rlc2MgKnRkID0gZS0+ZGVzYzsKIApAQCAtMjY5NiwxMSArMjY4NCwxMCBAQAogCX0KIAlza2dlLT50eF9yaW5nLnRvX2NsZWFuID0gZTsKIAotCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHNrZ2UtPm5ldGRldikKLQkgICAgJiYgc2tnZV9hdmFpbCgmc2tnZS0+dHhfcmluZykgPiBUWF9MT1dfV0FURVIpCi0JCW5ldGlmX3dha2VfcXVldWUoc2tnZS0+bmV0ZGV2KTsKKwlpZiAoc2tnZV9hdmFpbCgmc2tnZS0+dHhfcmluZykgPiBUWF9MT1dfV0FURVIpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAotCXNwaW5fdW5sb2NrKCZza2dlLT50eF9sb2NrKTsKKwluZXRpZl90eF91bmxvY2soZGV2KTsKIH0KIAogc3RhdGljIGludCBza2dlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCkBAIC0yNzEyLDYgKzI2OTksMTAgQEAKIAlpbnQgdG9fZG8gPSBtaW4oZGV2LT5xdW90YSwgKmJ1ZGdldCk7CiAJaW50IHdvcmtfZG9uZSA9IDA7CiAKKwlza2dlX3R4X2RvbmUoZGV2KTsKKworCXNrZ2Vfd3JpdGU4KGh3LCBRX0FERFIocnhxYWRkcltza2dlLT5wb3J0XSwgUV9DU1IpLCBDU1JfSVJRX0NMX0YpOworCiAJZm9yIChlID0gcmluZy0+dG9fY2xlYW47IHByZWZldGNoKGUtPm5leHQpLCB3b3JrX2RvbmUgPCB0b19kbzsgZSA9IGUtPm5leHQpIHsKIAkJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMjcyMiw3ICsyNzEzLDcgQEAKIAkJaWYgKGNvbnRyb2wgJiBCTVVfT1dOKQogCQkJYnJlYWs7CiAKLQkJc2tiID0gc2tnZV9yeF9nZXQoc2tnZSwgZSwgY29udHJvbCwgcmQtPnN0YXR1cywgcmQtPmNzdW0yKTsKKwkJc2tiID0gc2tnZV9yeF9nZXQoZGV2LCBlLCBjb250cm9sLCByZC0+c3RhdHVzLCByZC0+Y3N1bTIpOwogCQlpZiAobGlrZWx5KHNrYikpIHsKIAkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwpAQCAtMjc0MiwxMiArMjczMywxMSBAQAogCWlmICh3b3JrX2RvbmUgPj0gIHRvX2RvKQogCQlyZXR1cm4gMTsgLyogbm90IGRvbmUgKi8KIAotCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7Ci0KIAlzcGluX2xvY2tfaXJxKCZody0+aHdfbG9jayk7Ci0JaHctPmludHJfbWFzayB8PSByeGlycW1hc2tbc2tnZS0+cG9ydF07CisJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCWh3LT5pbnRyX21hc2sgfD0gaXJxbWFza1tza2dlLT5wb3J0XTsKICAgCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7Ci0JbW1pb3diKCk7CisJc2tnZV9yZWFkMzIoaHcsIEIwX0lNU0spOwogCXNwaW5fdW5sb2NrX2lycSgmaHctPmh3X2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yODgxLDYgKzI4NzEsNyBAQAogCXNwaW5fbG9ja19pcnEoJmh3LT5od19sb2NrKTsKIAlody0+aW50cl9tYXNrIHw9IElTX0VYVF9SRUc7CiAJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKKwlza2dlX3JlYWQzMihodywgQjBfSU1TSyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZody0+aHdfbG9jayk7CiB9CiAKQEAgLTI4ODgsMjcgKzI4NzksMjMgQEAKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBkZXZfaWQ7CiAJdTMyIHN0YXR1czsKLQotCS8qIFJlYWRpbmcgdGhpcyByZWdpc3RlciBtYXNrcyBJUlEgKi8KLQlzdGF0dXMgPSBza2dlX3JlYWQzMihodywgQjBfU1BfSVNSQyk7Ci0JaWYgKHN0YXR1cyA9PSAwKQotCQlyZXR1cm4gSVJRX05PTkU7CisJaW50IGhhbmRsZWQgPSAwOwogCiAJc3Bpbl9sb2NrKCZody0+aHdfbG9jayk7CisJLyogUmVhZGluZyB0aGlzIHJlZ2lzdGVyIG1hc2tzIElSUSAqLworCXN0YXR1cyA9IHNrZ2VfcmVhZDMyKGh3LCBCMF9TUF9JU1JDKTsKKwlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IH4wKQorCQlnb3RvIG91dDsKKworCWhhbmRsZWQgPSAxOwogCXN0YXR1cyAmPSBody0+aW50cl9tYXNrOwogCWlmIChzdGF0dXMgJiBJU19FWFRfUkVHKSB7CiAJCWh3LT5pbnRyX21hc2sgJj0gfklTX0VYVF9SRUc7CiAJCXNjaGVkdWxlX3dvcmsoJmh3LT5waHlfd29yayk7CiAJfQogCi0JaWYgKHN0YXR1cyAmIElTX1hBMV9GKSB7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBRX0FERFIoUV9YQTEsIFFfQ1NSKSwgQ1NSX0lSUV9DTF9GKTsKLQkJc2tnZV90eGlycShody0+ZGV2WzBdKTsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgSVNfUjFfRikgewotCQlza2dlX3dyaXRlOChodywgUV9BRERSKFFfUjEsIFFfQ1NSKSwgQ1NSX0lSUV9DTF9GKTsKLQkJaHctPmludHJfbWFzayAmPSB+SVNfUjFfRjsKKwlpZiAoc3RhdHVzICYgKElTX1hBMV9GfElTX1IxX0YpKSB7CisJCWh3LT5pbnRyX21hc2sgJj0gfihJU19YQTFfRnxJU19SMV9GKTsKIAkJbmV0aWZfcnhfc2NoZWR1bGUoaHctPmRldlswXSk7CiAJfQogCkBAIC0yOTI3LDE0ICsyOTE0LDggQEAKIAkJc2tnZV9tYWNfaW50cihodywgMCk7CiAKIAlpZiAoaHctPmRldlsxXSkgewotCQlpZiAoc3RhdHVzICYgSVNfWEEyX0YpIHsKLQkJCXNrZ2Vfd3JpdGU4KGh3LCBRX0FERFIoUV9YQTIsIFFfQ1NSKSwgQ1NSX0lSUV9DTF9GKTsKLQkJCXNrZ2VfdHhpcnEoaHctPmRldlsxXSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgSVNfUjJfRikgewotCQkJc2tnZV93cml0ZTgoaHcsIFFfQUREUihRX1IyLCBRX0NTUiksIENTUl9JUlFfQ0xfRik7Ci0JCQlody0+aW50cl9tYXNrICY9IH5JU19SMl9GOworCQlpZiAoc3RhdHVzICYgKElTX1hBMl9GfElTX1IyX0YpKSB7CisJCQlody0+aW50cl9tYXNrICY9IH4oSVNfWEEyX0Z8SVNfUjJfRik7CiAJCQluZXRpZl9yeF9zY2hlZHVsZShody0+ZGV2WzFdKTsKIAkJfQogCkBAIC0yOTU1LDkgKzI5MzYsMTEgQEAKIAkJc2tnZV9lcnJvcl9pcnEoaHcpOwogCiAJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKKwlza2dlX3JlYWQzMihodywgQjBfSU1TSyk7CitvdXQ6CiAJc3Bpbl91bmxvY2soJmh3LT5od19sb2NrKTsKIAotCXJldHVybiBJUlFfSEFORExFRDsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCkBAIC0zMTA2LDcgKzMwODksNiBAQAogCWVsc2UKIAkJaHctPnJhbV9zaXplID0gdDggKiA0MDk2OwogCi0Jc3Bpbl9sb2NrX2luaXQoJmh3LT5od19sb2NrKTsKIAlody0+aW50cl9tYXNrID0gSVNfSFdfRVJSIHwgSVNfRVhUX1JFRyB8IElTX1BPUlRfMTsKIAlpZiAoaHctPnBvcnRzID4gMSkKIAkJaHctPmludHJfbWFzayB8PSBJU19QT1JUXzI7CkBAIC0zMjIyLDcgKzMyMDQsNyBAQAogCWRldi0+cG9sbF9jb250cm9sbGVyID0gc2tnZV9uZXRwb2xsOwogI2VuZGlmCiAJZGV2LT5pcnEgPSBody0+cGRldi0+aXJxOwotCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0xMVFg7CisKIAlpZiAoaGlnaG1lbSkKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKQEAgLTMyNDQsOCArMzIyNiw2IEBACiAKIAlza2dlLT5wb3J0ID0gcG9ydDsKIAotCXNwaW5fbG9ja19pbml0KCZza2dlLT50eF9sb2NrKTsKLQogCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX0dFTkVTSVMpIHsKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1NHOwogCQlza2dlLT5yeF9jc3VtID0gMTsKQEAgLTMzMzIsNiArMzMxMiw3IEBACiAJaHctPnBkZXYgPSBwZGV2OwogCW11dGV4X2luaXQoJmh3LT5waHlfbXV0ZXgpOwogCUlOSVRfV09SSygmaHctPnBoeV93b3JrLCBza2dlX2V4dGlycSwgaHcpOworCXNwaW5fbG9ja19pbml0KCZody0+aHdfbG9jayk7CiAKIAlody0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIDB4NDAwMCk7CiAJaWYgKCFody0+cmVncykgewpAQCAtMzM0MCwyMyArMzMyMSwxNiBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9odzsKIAl9CiAKLQllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNrZ2VfaW50ciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBodyk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKLQkJZ290byBlcnJfb3V0X2lvdW5tYXA7Ci0JfQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0KIAllcnIgPSBza2dlX3Jlc2V0KGh3KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggRFJWX1ZFUlNJT04gIiBhZGRyIDB4JWxseCBpcnEgJWQgY2hpcCAlcyByZXYgJWRcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwZGV2LT5pcnEsCiAJICAgICAgIHNrZ2VfYm9hcmRfbmFtZShodyksIGh3LT5jaGlwX3Jldik7CiAKLQlpZiAoKGRldiA9IHNrZ2VfZGV2aW5pdChodywgMCwgdXNpbmdfZGFjKSkgPT0gTlVMTCkKKwlkZXYgPSBza2dlX2RldmluaXQoaHcsIDAsIHVzaW5nX2RhYyk7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyX291dF9sZWRfb2ZmOwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CkBAIC0zMzY2LDcgKzMzNDAsNiBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCi0KIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIiwKQEAgLTMzNzQsNiArMzM0NywxMiBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBza2dlX2ludHIsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGh3KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGRldi0+aXJxKTsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CisJfQogCXNrZ2Vfc2hvd19hZGRyKGRldik7CiAKIAlpZiAoaHctPnBvcnRzID4gMSAmJiAoZGV2MSA9IHNrZ2VfZGV2aW5pdChodywgMSwgdXNpbmdfZGFjKSkpIHsKQEAgLTMzODYsMTUgKzMzNjUsMTYgQEAKIAkJCWZyZWVfbmV0ZGV2KGRldjEpOwogCQl9CiAJfQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CiAKIAlyZXR1cm4gMDsKIAorZXJyX291dF91bnJlZ2lzdGVyOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiBlcnJfb3V0X2ZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KGRldik7CiBlcnJfb3V0X2xlZF9vZmY6CiAJc2tnZV93cml0ZTE2KGh3LCBCMF9MRUQsIExFRF9TVEFUX09GRik7Ci1lcnJfb3V0X2ZyZWVfaXJxOgotCWZyZWVfaXJxKHBkZXYtPmlycSwgaHcpOwogZXJyX291dF9pb3VubWFwOgogCWlvdW5tYXAoaHctPnJlZ3MpOwogZXJyX291dF9mcmVlX2h3OgpAQCAtMzQyNCw2ICszNDA0LDcgQEAKIAlzcGluX2xvY2tfaXJxKCZody0+aHdfbG9jayk7CiAJaHctPmludHJfbWFzayA9IDA7CiAJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCAwKTsKKwlza2dlX3JlYWQzMihodywgQjBfSU1TSyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZody0+aHdfbG9jayk7CiAKIAlza2dlX3dyaXRlMTYoaHcsIEIwX0xFRCwgTEVEX1NUQVRfT0ZGKTsKQEAgLTM0NDksMjYgKzM0MzAsMjUgQEAKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpLCB3b2wgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAotCQlpZiAoZGV2KSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JCQkJaWYgKHNrZ2UtPndvbCkKLQkJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQkJCWVsc2UKLQkJCQkJc2tnZV9kb3duKGRldik7Ci0JCQl9Ci0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlpZiAoc2tnZS0+d29sKQorCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCWVsc2UKKwkJCQlza2dlX2Rvd24oZGV2KTsKIAkJCXdvbCB8PSBza2dlLT53b2w7CiAJCX0KKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwogCX0KIAotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCB3b2wpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKIAogCXJldHVybiAwOwpAQCAtMzQ3NywyMyArMzQ1NywzMyBAQAogc3RhdGljIGludCBza2dlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpOworCWludCBpLCBlcnI7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMCk7CiAKLQlza2dlX3Jlc2V0KGh3KTsKKwllcnIgPSBza2dlX3Jlc2V0KGh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbaV07Ci0JCWlmIChkZXYpIHsKLQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgc2tnZV91cChkZXYpKQorCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJZXJyID0gc2tnZV91cChkZXYpOworCisJCQlpZiAoZXJyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNvdWxkIG5vdCB1cDogJWRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKIAkJCQlkZXZfY2xvc2UoZGV2KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCX0KLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKQEAgLTM1MTAsNyArMzUwMCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNrZ2VfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZza2dlX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNrZ2VfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNrZ2VfY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuaCBiL2RyaXZlcnMvbmV0L3NrZ2UuaAppbmRleCA1OTMzODdiLi43OWUwOTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmgKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5oCkBAIC0yNDE3LDcgKzI0MTcsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICAgICpuZXRkZXY7CiAJaW50CQkgICAgIHBvcnQ7CiAKLQlzcGlubG9ja190CSAgICAgdHhfbG9jazsKIAlzdHJ1Y3Qgc2tnZV9yaW5nICAgICB0eF9yaW5nOwogCXN0cnVjdCBza2dlX3JpbmcgICAgIHJ4X3Jpbmc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCA5MzNlODdmLi43Y2UwNjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSAic2t5Mi5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2t5MiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjUiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS43IgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiICIKIAogLyoKQEAgLTEwNiw2ICsxMDYsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4OTAwMCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDlFMDApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRExJTkssIDB4NGIwMCkgfSwJLyogREdFLTU2MFQgKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0MDAxKSB9LCAJLyogREdFLTU1MFNYICovCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQwKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MSkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNDIpIH0sCkBAIC0xMTcsMTAgKzExOCwxNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM1MCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNTEpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUyKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM1MykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYxKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2MikgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY0KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2NSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjYpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY3KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2OCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjkpIH0sCiAJeyAwIH0KIH07CiAKQEAgLTE5MCw3ICsxOTgsNiBAQAogc3RhdGljIHZvaWQgc2t5Ml9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHNreTJfaHcgKmh3LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKIAl1MTYgcG93ZXJfY29udHJvbDsKLQl1MzIgcmVnMTsKIAlpbnQgdmF1eDsKIAogCXByX2RlYnVnKCJza3kyX3NldF9wb3dlcl9zdGF0ZSAlZFxuIiwgc3RhdGUpOwpAQCAtMjIzLDIwICsyMzAsOSBAQAogCQllbHNlCiAJCQlza3kyX3dyaXRlOChodywgQjJfWTJfQ0xLX0dBVEUsIDApOwogCi0JCS8qIFR1cm4gb2ZmIHBoeSBwb3dlciBzYXZpbmcgKi8KLQkJcmVnMSA9IHNreTJfcGNpX3JlYWQzMihodywgUENJX0RFVl9SRUcxKTsKLQkJcmVnMSAmPSB+KFBDSV9ZMl9QSFkxX1BPV0QgfCBQQ0lfWTJfUEhZMl9QT1dEKTsKLQotCQkvKiBsb29rcyBsaWtlIHRoaXMgWEwgaXMgYmFjayBhc3N3YXJkcyAuLiAqLwotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKSB7Ci0JCQlyZWcxIHw9IFBDSV9ZMl9QSFkxX0NPTUE7Ci0JCQlpZiAoaHctPnBvcnRzID4gMSkKLQkJCQlyZWcxIHw9IFBDSV9ZMl9QSFkyX0NPTUE7Ci0JCX0KLQkJc2t5Ml9wY2lfd3JpdGUzMihodywgUENJX0RFVl9SRUcxLCByZWcxKTsKLQkJdWRlbGF5KDEwMCk7Ci0KIAkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSkgeworCQkJdTMyIHJlZzE7CisKIAkJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHMywgMCk7CiAJCQlyZWcxID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBQQ0lfREVWX1JFRzQpOwogCQkJcmVnMSAmPSBQX0FTUE1fQ09OVFJPTF9NU0s7CkBAIC0yNDgsMTUgKzI0NCw2IEBACiAKIAljYXNlIFBDSV9EM2hvdDoKIAljYXNlIFBDSV9EM2NvbGQ6Ci0JCS8qIFR1cm4gb24gcGh5IHBvd2VyIHNhdmluZyAqLwotCQlyZWcxID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBQQ0lfREVWX1JFRzEpOwotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKQotCQkJcmVnMSAmPSB+KFBDSV9ZMl9QSFkxX1BPV0QgfCBQQ0lfWTJfUEhZMl9QT1dEKTsKLQkJZWxzZQotCQkJcmVnMSB8PSAoUENJX1kyX1BIWTFfUE9XRCB8IFBDSV9ZMl9QSFkyX1BPV0QpOwotCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzEsIHJlZzEpOwotCQl1ZGVsYXkoMTAwKTsKLQogCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKQogCQkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLCAwKTsKIAkJZWxzZQpAQCAtMjgwLDcgKzI2Nyw3IEBACiAJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogfQogCi1zdGF0aWMgdm9pZCBza3kyX3BoeV9yZXNldChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCitzdGF0aWMgdm9pZCBza3kyX2dtYWNfcmVzZXQoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0KQogewogCXUxNiByZWc7CiAKQEAgLTUyOCw2ICs1MTUsMjkgQEAKIAkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fREVGX01TSyk7CiB9CiAKK3N0YXRpYyB2b2lkIHNreTJfcGh5X3Bvd2VyKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgaW50IG9ub2ZmKQoreworCXUzMiByZWcxOworCXN0YXRpYyBjb25zdCB1MzIgcGh5X3Bvd2VyW10KKwkJPSB7IFBDSV9ZMl9QSFkxX1BPV0QsIFBDSV9ZMl9QSFkyX1BPV0QgfTsKKworCS8qIGxvb2tzIGxpa2UgdGhpcyBYTCBpcyBiYWNrIGFzc3dhcmRzIC4uICovCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgJiYgaHctPmNoaXBfcmV2ID4gMSkKKwkJb25vZmYgPSAhb25vZmY7CisKKwlyZWcxID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBQQ0lfREVWX1JFRzEpOworCisJaWYgKG9ub2ZmKQorCQkvKiBUdXJuIG9mZiBwaHkgcG93ZXIgc2F2aW5nICovCisJCXJlZzEgJj0gfnBoeV9wb3dlcltwb3J0XTsKKwllbHNlCisJCXJlZzEgfD0gcGh5X3Bvd2VyW3BvcnRdOworCisJc2t5Ml9wY2lfd3JpdGUzMihodywgUENJX0RFVl9SRUcxLCByZWcxKTsKKwlza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHMSk7CisJdWRlbGF5KDEwMCk7Cit9CisKIC8qIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiAqLwogc3RhdGljIHZvaWQgc2t5Ml9waHlfcmVpbml0KHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCiB7CkBAIC03NjAsOSArNzcwLDEwIEBACiAvKiBVcGRhdGUgY2hpcCdzIG5leHQgcG9pbnRlciAqLwogc3RhdGljIGlubGluZSB2b2lkIHNreTJfcHV0X2lkeChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHEsIHUxNiBpZHgpCiB7CisJcSA9IFkyX1FBRERSKHEsIFBSRUZfVU5JVF9QVVRfSURYKTsKIAl3bWIoKTsKLQlza3kyX3dyaXRlMTYoaHcsIFkyX1FBRERSKHEsIFBSRUZfVU5JVF9QVVRfSURYKSwgaWR4KTsKLQltbWlvd2IoKTsKKwlza3kyX3dyaXRlMTYoaHcsIHEsIGlkeCk7CisJc2t5Ml9yZWFkMTYoaHcsIHEpOwogfQogCiAKQEAgLTk0OSwxNCArOTYwLDE2IEBACiAvKgogICogSXQgYXBwZWFycyB0aGUgaGFyZHdhcmUgaGFzIGEgYnVnIGluIHRoZSBGSUZPIGxvZ2ljIHRoYXQKICAqIGNhdXNlIGl0IHRvIGhhbmcgaWYgdGhlIEZJRk8gZ2V0cyBvdmVycnVuIGFuZCB0aGUgcmVjZWl2ZSBidWZmZXIKLSAqIGlzIG5vdCBhbGlnbmVkLiBBTHNvIGFsbG9jX3NrYigpIHdvbid0IGFsaWduIHByb3Blcmx5IGlmIHNsYWIKLSAqIGRlYnVnZ2luZyBpcyBlbmFibGVkLgorICogaXMgbm90IDY0IGJ5dGUgYWxpZ25lZC4gVGhlIGJ1ZmZlciByZXR1cm5lZCBmcm9tIG5ldGRldl9hbGxvY19za2IgaXMKKyAqIGFsaWduZWQgZXhjZXB0IGlmIHNsYWIgZGVidWdnaW5nIGlzIGVuYWJsZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNreTJfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnBfbWFzaykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNreTJfYWxsb2Nfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJICAgICBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jc2tiID0gYWxsb2Nfc2tiKHNpemUgKyBSWF9TS0JfQUxJR04sIGdmcF9tYXNrKTsKKwlza2IgPSBfX25ldGRldl9hbGxvY19za2IoZGV2LCBsZW5ndGggKyBSWF9TS0JfQUxJR04sIGdmcF9tYXNrKTsKIAlpZiAobGlrZWx5KHNrYikpIHsKIAkJdW5zaWduZWQgbG9uZyBwCT0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKIAkJc2tiX3Jlc2VydmUoc2tiLCBBTElHTihwLCBSWF9TS0JfQUxJR04pIC0gcCk7CkBAIC05OTIsNyArMTAwNSw4IEBACiAJZm9yIChpID0gMDsgaSA8IHNreTItPnJ4X3BlbmRpbmc7IGkrKykgewogCQlzdHJ1Y3QgcmluZ19pbmZvICpyZSA9IHNreTItPnJ4X3JpbmcgKyBpOwogCi0JCXJlLT5za2IgPSBza3kyX2FsbG9jX3NrYihza3kyLT5yeF9idWZzaXplLCBHRlBfS0VSTkVMKTsKKwkJcmUtPnNrYiA9IHNreTJfYWxsb2Nfc2tiKHNreTItPm5ldGRldiwgc2t5Mi0+cnhfYnVmc2l6ZSwKKwkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIXJlLT5za2IpCiAJCQlnb3RvIG5vbWVtOwogCkBAIC0xMDgwLDYgKzEwOTQsOCBAQAogCWlmICghc2t5Mi0+cnhfcmluZykKIAkJZ290byBlcnJfb3V0OwogCisJc2t5Ml9waHlfcG93ZXIoaHcsIHBvcnQsIDEpOworCiAJc2t5Ml9tYWNfaW5pdChodywgcG9ydCk7CiAKIAkvKiBEZXRlcm1pbmUgYXZhaWxhYmxlIHJhbSBidWZmZXIgc3BhY2UgKGluIDRLIGJsb2NrcykuCkBAIC0xMTg0LDcgKzEyMDAsNiBAQAogCXN0cnVjdCBza3kyX3R4X2xlICpsZSA9IE5VTEw7CiAJc3RydWN0IHR4X3JpbmdfaW5mbyAqcmU7CiAJdW5zaWduZWQgaSwgbGVuOwotCWludCBhdmFpbDsKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAJdTMyIGFkZHI2NDsKIAl1MTYgbXNzOwpAQCAtMTIzNCwyNSArMTI0OSwxOCBAQAogCS8qIENoZWNrIGZvciBUQ1AgU2VnbWVudGF0aW9uIE9mZmxvYWQgKi8KIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCWlmIChtc3MgIT0gMCkgewotCQkvKiBqdXN0IGRyb3AgdGhlIHBhY2tldCBpZiBub24tbGluZWFyIGV4cGFuc2lvbiBmYWlscyAqLwotCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSAmJgotCQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQogCQltc3MgKz0gKChza2ItPmgudGgtPmRvZmYgLSA1KSAqIDQpOwkvKiBUQ1Agb3B0aW9ucyAqLwogCQltc3MgKz0gKHNrYi0+bmguaXBoLT5paGwgKiA0KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAkJbXNzICs9IEVUSF9ITEVOOwotCX0KIAotCWlmIChtc3MgIT0gc2t5Mi0+dHhfbGFzdF9tc3MpIHsKLQkJbGUgPSBnZXRfdHhfbGUoc2t5Mik7Ci0JCWxlLT50eC50c28uc2l6ZSA9IGNwdV90b19sZTE2KG1zcyk7Ci0JCWxlLT50eC50c28ucnN2ZCA9IDA7Ci0JCWxlLT5vcGNvZGUgPSBPUF9MUkdMRU4gfCBIV19PV05FUjsKLQkJbGUtPmN0cmwgPSAwOwotCQlza3kyLT50eF9sYXN0X21zcyA9IG1zczsKKwkJaWYgKG1zcyAhPSBza3kyLT50eF9sYXN0X21zcykgeworCQkJbGUgPSBnZXRfdHhfbGUoc2t5Mik7CisJCQlsZS0+dHgudHNvLnNpemUgPSBjcHVfdG9fbGUxNihtc3MpOworCQkJbGUtPnR4LnRzby5yc3ZkID0gMDsKKwkJCWxlLT5vcGNvZGUgPSBPUF9MUkdMRU4gfCBIV19PV05FUjsKKwkJCWxlLT5jdHJsID0gMDsKKwkJCXNreTItPnR4X2xhc3RfbXNzID0gbXNzOworCQl9CiAJfQogCiAJY3RybCA9IDA7CkBAIC0xMjgwLDEyICsxMjg4LDE3IEBACiAJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCiAJCQljdHJsIHw9IFVEUFRDUDsKIAotCQlsZSA9IGdldF90eF9sZShza3kyKTsKLQkJbGUtPnR4LmNzdW0uc3RhcnQgPSBjcHVfdG9fbGUxNihoZHIpOwotCQlsZS0+dHguY3N1bS5vZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOwotCQlsZS0+bGVuZ3RoID0gMDsJLyogaW5pdGlhbCBjaGVja3N1bSB2YWx1ZSAqLwotCQlsZS0+Y3RybCA9IDE7CS8qIG9uZSBwYWNrZXQgKi8KLQkJbGUtPm9wY29kZSA9IE9QX1RDUExJU1cgfCBIV19PV05FUjsKKwkJaWYgKGhkciAhPSBza3kyLT50eF9jc3VtX3N0YXJ0IHx8IG9mZnNldCAhPSBza3kyLT50eF9jc3VtX29mZnNldCkgeworCQkJc2t5Mi0+dHhfY3N1bV9zdGFydCA9IGhkcjsKKwkJCXNreTItPnR4X2NzdW1fb2Zmc2V0ID0gb2Zmc2V0OworCisJCQlsZSA9IGdldF90eF9sZShza3kyKTsKKwkJCWxlLT50eC5jc3VtLnN0YXJ0ID0gY3B1X3RvX2xlMTYoaGRyKTsKKwkJCWxlLT50eC5jc3VtLm9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldCk7CisJCQlsZS0+bGVuZ3RoID0gMDsJLyogaW5pdGlhbCBjaGVja3N1bSB2YWx1ZSAqLworCQkJbGUtPmN0cmwgPSAxOwkvKiBvbmUgcGFja2V0ICovCisJCQlsZS0+b3Bjb2RlID0gT1BfVENQTElTVyB8IEhXX09XTkVSOworCQl9CiAJfQogCiAJbGUgPSBnZXRfdHhfbGUoc2t5Mik7CkBAIC0xMzIwLDIzICsxMzMzLDE4IEBACiAJCWxlLT5vcGNvZGUgPSBPUF9CVUZGRVIgfCBIV19PV05FUjsKIAogCQlmcmUgPSBza3kyLT50eF9yaW5nCi0JCSAgICArIFJJTkdfTkVYVCgocmUgLSBza3kyLT50eF9yaW5nKSArIGksIFRYX1JJTkdfU0laRSk7CisJCQkrIFJJTkdfTkVYVCgocmUgLSBza3kyLT50eF9yaW5nKSArIGksIFRYX1JJTkdfU0laRSk7CiAJCXBjaV91bm1hcF9hZGRyX3NldChmcmUsIG1hcGFkZHIsIG1hcHBpbmcpOwogCX0KIAogCXJlLT5pZHggPSBza3kyLT50eF9wcm9kOwogCWxlLT5jdHJsIHw9IEVPUDsKIAotCWF2YWlsID0gdHhfYXZhaWwoc2t5Mik7Ci0JaWYgKG1zcyAhPSAwIHx8IGF2YWlsIDwgVFhfTUlOX1BFTkRJTkcpIHsKLSAJCWxlLT5jdHJsIHw9IEZSQ19TVEFUOwotCQlpZiAoYXZhaWwgPD0gTUFYX1NLQl9UWF9MRSkKLQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQl9CisJaWYgKHR4X2F2YWlsKHNreTIpIDw9IE1BWF9TS0JfVFhfTEUpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAogCXNreTJfcHV0X2lkeChodywgdHhxYWRkcltza3kyLT5wb3J0XSwgc2t5Mi0+dHhfcHJvZCk7CiAKLW91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJnNreTItPnR4X2xvY2spOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CkBAIC0xNDIxLDcgKzE0MjksNyBAQAogCS8qIFN0b3AgbW9yZSBwYWNrZXRzIGZyb20gYmVpbmcgcXVldWVkICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCi0Jc2t5Ml9waHlfcmVzZXQoaHcsIHBvcnQpOworCXNreTJfZ21hY19yZXNldChodywgcG9ydCk7CiAKIAkvKiBTdG9wIHRyYW5zbWl0dGVyICovCiAJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9DU1IpLCBCTVVfU1RPUCk7CkBAIC0xNDY5LDYgKzE0NzcsOCBAQAogCWltYXNrICY9IH5wb3J0aXJxX21za1twb3J0XTsKIAlza3kyX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGltYXNrKTsKIAorCXNreTJfcGh5X3Bvd2VyKGh3LCBwb3J0LCAwKTsKKwogCS8qIHR1cm4gb2ZmIExFRCdzICovCiAJc2t5Ml93cml0ZTE2KGh3LCBCMF9ZMkxFRCwgTEVEX1NUQVRfT0ZGKTsKIApAQCAtMTgzMiwxNSArMTg0MiwxNiBAQAogICogRm9yIHNtYWxsIHBhY2tldHMgb3IgZXJyb3JzLCBqdXN0IHJldXNlIGV4aXN0aW5nIHNrYi4KICAqIEZvciBsYXJnZXIgcGFja2V0cywgZ2V0IG5ldyBidWZmZXIuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2t5Ml9yZWNlaXZlKHN0cnVjdCBza3kyX3BvcnQgKnNreTIsCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNreTJfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICB1MTYgbGVuZ3RoLCB1MzIgc3RhdHVzKQogeworIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcmluZ19pbmZvICpyZSA9IHNreTItPnJ4X3JpbmcgKyBza3kyLT5yeF9uZXh0OwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCiAJaWYgKHVubGlrZWx5KG5ldGlmX21zZ19yeF9zdGF0dXMoc2t5MikpKQogCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiByeCBzbG90ICV1IHN0YXR1cyAweCV4IGxlbiAlZFxuIiwKLQkJICAgICAgIHNreTItPm5ldGRldi0+bmFtZSwgc2t5Mi0+cnhfbmV4dCwgc3RhdHVzLCBsZW5ndGgpOworCQkgICAgICAgZGV2LT5uYW1lLCBza3kyLT5yeF9uZXh0LCBzdGF0dXMsIGxlbmd0aCk7CiAKIAlza3kyLT5yeF9uZXh0ID0gKHNreTItPnJ4X25leHQgKyAxKSAlIHNreTItPnJ4X3BlbmRpbmc7CiAJcHJlZmV0Y2goc2t5Mi0+cnhfcmluZyArIHNreTItPnJ4X25leHQpOwpAQCAtMTg1MSwxMSArMTg2MiwxMSBAQAogCWlmICghKHN0YXR1cyAmIEdNUl9GU19SWF9PSykpCiAJCWdvdG8gcmVzdWJtaXQ7CiAKLQlpZiAobGVuZ3RoID4gc2t5Mi0+bmV0ZGV2LT5tdHUgKyBFVEhfSExFTikKKwlpZiAobGVuZ3RoID4gZGV2LT5tdHUgKyBFVEhfSExFTikKIAkJZ290byBvdmVyc2l6ZTsKIAogCWlmIChsZW5ndGggPCBjb3B5YnJlYWspIHsKLQkJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIDIsIEdGUF9BVE9NSUMpOworCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuZ3RoICsgMik7CiAJCWlmICghc2tiKQogCQkJZ290byByZXN1Ym1pdDsKIApAQCAtMTg3MCw3ICsxODgxLDcgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAotCQluc2tiID0gc2t5Ml9hbGxvY19za2Ioc2t5Mi0+cnhfYnVmc2l6ZSwgR0ZQX0FUT01JQyk7CisJCW5za2IgPSBza3kyX2FsbG9jX3NrYihkZXYsIHNreTItPnJ4X2J1ZnNpemUsIEdGUF9BVE9NSUMpOwogCQlpZiAoIW5za2IpCiAJCQlnb3RvIHJlc3VibWl0OwogCkBAIC0xOTAwLDcgKzE5MTEsNyBAQAogCiAJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2t5MikgJiYgbmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IHJ4IGVycm9yLCBzdGF0dXMgMHgleCBsZW5ndGggJWRcbiIsCi0JCSAgICAgICBza3kyLT5uZXRkZXYtPm5hbWUsIHN0YXR1cywgbGVuZ3RoKTsKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzLCBsZW5ndGgpOwogCiAJaWYgKHN0YXR1cyAmIChHTVJfRlNfTE9OR19FUlIgfCBHTVJfRlNfVU5fU0laRSkpCiAJCXNreTItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CkBAIC0xOTI2LDEyICsxOTM3LDYgQEAKIAl9CiB9CiAKLS8qIElzIHN0YXR1cyByaW5nIGVtcHR5IG9yIGlzIHRoZXJlIG1vcmUgdG8gZG8/ICovCi1zdGF0aWMgaW5saW5lIGludCBza3kyX21vcmVfd29yayhjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcpCi17Ci0JcmV0dXJuIChody0+c3RfaWR4ICE9IHNreTJfcmVhZDE2KGh3LCBTVEFUX1BVVF9JRFgpKTsKLX0KLQogLyogUHJvY2VzcyBzdGF0dXMgcmVzcG9uc2UgcmluZyAqLwogc3RhdGljIGludCBza3kyX3N0YXR1c19pbnRyKHN0cnVjdCBza3kyX2h3ICpodywgaW50IHRvX2RvKQogewpAQCAtMTk2MCwxMSArMTk2NSwxMCBAQAogCiAJCXN3aXRjaCAobGUtPm9wY29kZSAmIH5IV19PV05FUikgewogCQljYXNlIE9QX1JYU1RBVDoKLQkJCXNrYiA9IHNreTJfcmVjZWl2ZShza3kyLCBsZW5ndGgsIHN0YXR1cyk7CisJCQlza2IgPSBza3kyX3JlY2VpdmUoZGV2LCBsZW5ndGgsIHN0YXR1cyk7CiAJCQlpZiAoIXNrYikKIAkJCQlicmVhazsKIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIApAQCAtMjAyMiw2ICsyMDI2LDkgQEAKIAkJfQogCX0KIAorCS8qIEZ1bGx5IHByb2Nlc3NlZCBzdGF0dXMgcmluZyBzbyBjbGVhciBpcnEgKi8KKwlza3kyX3dyaXRlMzIoaHcsIFNUQVRfQ1RSTCwgU0NfU1RBVF9DTFJfSVJRKTsKKwogZXhpdF9sb29wOgogCWlmIChidWZfd3JpdGVbMF0pIHsKIAkJc2t5MiA9IG5ldGRldl9wcml2KGh3LT5kZXZbMF0pOwpAQCAtMjIzMSwxOSArMjIzOCwxNiBAQAogCQlza3kyX2Rlc2NyaXB0b3JfZXJyb3IoaHcsIDEsICJ0cmFuc21pdCIsIFkyX0lTX0NIS19UWEEyKTsKIAogCXdvcmtfZG9uZSA9IHNreTJfc3RhdHVzX2ludHIoaHcsIHdvcmtfbGltaXQpOwotCSpidWRnZXQgLT0gd29ya19kb25lOwotCWRldjAtPnF1b3RhIC09IHdvcmtfZG9uZTsKKwlpZiAod29ya19kb25lIDwgd29ya19saW1pdCkgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYwKTsKIAotCWlmIChzdGF0dXMgJiBZMl9JU19TVEFUX0JNVSkKLQkJc2t5Ml93cml0ZTMyKGh3LCBTVEFUX0NUUkwsIFNDX1NUQVRfQ0xSX0lSUSk7Ci0KLQlpZiAoc2t5Ml9tb3JlX3dvcmsoaHcpKQorCQlza3kyX3JlYWQzMihodywgQjBfWTJfU1BfTElTUik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCSpidWRnZXQgLT0gd29ya19kb25lOworCQlkZXYwLT5xdW90YSAtPSB3b3JrX2RvbmU7CiAJCXJldHVybiAxOwotCi0JbmV0aWZfcnhfY29tcGxldGUoZGV2MCk7Ci0KLQlza3kyX3JlYWQzMihodywgQjBfWTJfU1BfTElTUik7Ci0JcmV0dXJuIDA7CisJfQogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc2t5Ml9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0yNDA5LDcgKzI0MTMsNyBAQAogCXNreTJfd3JpdGUzMihodywgQjBfSFdFX0lNU0ssIFkyX0hXRV9BTExfTUFTSyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspCi0JCXNreTJfcGh5X3Jlc2V0KGh3LCBpKTsKKwkJc2t5Ml9nbWFjX3Jlc2V0KGh3LCBpKTsKIAogCW1lbXNldChody0+c3RfbGUsIDAsIFNUQVRVU19MRV9CWVRFUyk7CiAJaHctPnN0X2lkeCA9IDA7CkBAIC0zMjAwLDYgKzMyMDQsOCBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHctPnBkZXY7CiAJaW50IGVycjsKIAorCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZody0+bXNpX3dhaXQpOworCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCBZMl9JU19JUlFfU1cpOwogCiAJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBza3kyX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBodyk7CkBAIC0zMjA5LDEwICszMjE1LDggQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmaHctPm1zaV93YWl0KTsKLQogCXNreTJfd3JpdGU4KGh3LCBCMF9DVFNULCBDU19TVF9TV19JUlEpOwotCXdtYigpOworCXNreTJfcmVhZDgoaHcsIEIwX0NUU1QpOwogCiAJd2FpdF9ldmVudF90aW1lb3V0KGh3LT5tc2lfd2FpdCwgaHctPm1zaV9kZXRlY3RlZCwgSFovMTApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmggYi9kcml2ZXJzL25ldC9za3kyLmgKaW5kZXggMmRiOGQxOS4uZmE4YWY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5oCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuaApAQCAtMTc0OCw3ICsxNzQ4LDYgQEAKIAlJTklUX1NVTT0gMTw8MywKIAlMT0NLX1NVTT0gMTw8NCwKIAlJTlNfVkxBTj0gMTw8NSwKLQlGUkNfU1RBVD0gMTw8NiwKIAlFT1AJPSAxPDw3LAogfTsKIApAQCAtMTg0NCw2ICsxODQzLDggQEAKIAl1MzIJCSAgICAgdHhfYWRkcjY0OwogCXUxNgkJICAgICB0eF9wZW5kaW5nOwogCXUxNgkJICAgICB0eF9sYXN0X21zczsKKwl1MTYJCSAgICAgdHhfY3N1bV9zdGFydDsKKwl1MTYJCSAgICAgdHhfY3N1bV9vZmZzZXQ7CiAKIAlzdHJ1Y3QgcmluZ19pbmZvICAgICAqcnhfcmluZyBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCXN0cnVjdCBza3kyX3J4X2xlICAgICpyeF9sZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaGMuYyBiL2RyaXZlcnMvbmV0L3NsaGMuYwppbmRleCAzYTFiNzEzLi45YTU0MGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGhjLmMKKysrIGIvZHJpdmVycy9uZXQvc2xoYy5jCkBAIC05NCwyNyArOTQsMjMgQEAKIAlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICp0czsKIAlzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcDsKIAotCWNvbXAgPSAoc3RydWN0IHNsY29tcHJlc3MgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2xjb21wcmVzcyksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKKwljb21wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNsY29tcHJlc3MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBjb21wKQogCQlnb3RvIG91dF9mYWlsOwotCW1lbXNldChjb21wLCAwLCBzaXplb2Yoc3RydWN0IHNsY29tcHJlc3MpKTsKIAogCWlmICggcnNsb3RzID4gMCAgJiYgIHJzbG90cyA8IDI1NiApIHsKIAkJc2l6ZV90IHJzaXplID0gcnNsb3RzICogc2l6ZW9mKHN0cnVjdCBjc3RhdGUpOwotCQljb21wLT5yc3RhdGUgPSAoc3RydWN0IGNzdGF0ZSAqKSBrbWFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKTsKKwkJY29tcC0+cnN0YXRlID0ga3phbGxvYyhyc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIGNvbXAtPnJzdGF0ZSkKIAkJCWdvdG8gb3V0X2ZyZWU7Ci0JCW1lbXNldChjb21wLT5yc3RhdGUsIDAsIHJzaXplKTsKIAkJY29tcC0+cnNsb3RfbGltaXQgPSByc2xvdHMgLSAxOwogCX0KIAogCWlmICggdHNsb3RzID4gMCAgJiYgIHRzbG90cyA8IDI1NiApIHsKIAkJc2l6ZV90IHRzaXplID0gdHNsb3RzICogc2l6ZW9mKHN0cnVjdCBjc3RhdGUpOwotCQljb21wLT50c3RhdGUgPSAoc3RydWN0IGNzdGF0ZSAqKSBrbWFsbG9jKHRzaXplLCBHRlBfS0VSTkVMKTsKKwkJY29tcC0+dHN0YXRlID0ga3phbGxvYyh0c2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIGNvbXAtPnRzdGF0ZSkKIAkJCWdvdG8gb3V0X2ZyZWUyOwotCQltZW1zZXQoY29tcC0+dHN0YXRlLCAwLCB0c2l6ZSk7CiAJCWNvbXAtPnRzbG90X2xpbWl0ID0gdHNsb3RzIC0gMTsKIAl9CiAKQEAgLTE0MSw5ICsxMzcsOSBAQAogCXJldHVybiBjb21wOwogCiBvdXRfZnJlZTI6Ci0Ja2ZyZWUoKHVuc2lnbmVkIGNoYXIgKiljb21wLT5yc3RhdGUpOworCWtmcmVlKGNvbXAtPnJzdGF0ZSk7CiBvdXRfZnJlZToKLQlrZnJlZSgodW5zaWduZWQgY2hhciAqKWNvbXApOworCWtmcmVlKGNvbXApOwogb3V0X2ZhaWw6CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03MDAsMjAgKzY5Niw2IEBACiBFWFBPUlRfU1lNQk9MKHNsaGNfdW5jb21wcmVzcyk7CiBFWFBPUlRfU1lNQk9MKHNsaGNfdG9zcyk7CiAKLSNpZmRlZiBNT0RVTEUKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ1NMSVA6IGNvZGUgY29weXJpZ2h0IDE5ODkgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIE1PRFVMRSAqLwogI2Vsc2UgLyogQ09ORklHX0lORVQgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKaW5kZXggMGIxNTI5MC4uNDQzOGZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxMXguYwpAQCAtNTUsOCArNTUsNiBAQAogCQkJICkKICNlbmRpZgogCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCBjMGE2MmIwLi44ZTFmNjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTIwNTMsNyArMjA1Myw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZzdGFyZmlyZV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzdGFyZmlyZV9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCmluZGV4IDY5ODU2OGUuLmMyNDNhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpAQCAtMTcsNiArMTcsOCBAQAogCVN1cHBvcnQgYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CiAJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9zdW5kYW5jZS5odG1sCiAJW2xpbmsgbm8gbG9uZ2VyIHByb3ZpZGVzIHVzZWZ1bCBpbmZvIC1qZ2FyemlrXQorCUFyY2hpdmVzIG9mIHRoZSBtYWlsaW5nIGxpc3QgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuYmVvd3VsZi5vcmcvcGlwZXJtYWlsL25ldGRyaXZlcnMvCiAKICovCiAKQEAgLTY0Niw3ICs2NDgsNyBAQAogCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCiAJaWYgKG5ldGlmX21zZ19odyhucCkpCiAJCXByaW50aygiQVNJQyBDb250cm9sIGlzICV4LlxuIiwgaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpKTsKLQlpb3dyaXRlMTYoMHgwMGZmLCBpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCXN1bmRhbmNlX3Jlc2V0KGRldiwgMHgwMGZmIDw8IDE2KTsKIAlpZiAobmV0aWZfbXNnX2h3KG5wKSkKIAkJcHJpbnRrKCJBU0lDIENvbnRyb2wgaXMgbm93ICV4LlxuIiwgaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpKTsKIApAQCAtMTA3NSwxMyArMTA3Nyw4IEBACiAJCiAJLyogUmVzZXQgdHggbG9naWMsIFR4TGlzdFB0ciB3aWxsIGJlIGNsZWFuZWQgKi8KIAlpb3dyaXRlMTYgKFR4RGlzYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOwotCWlvd3JpdGUxNiAoVHhSZXNldCB8IERNQVJlc2V0IHwgRklGT1Jlc2V0IHwgTmV0d29ya1Jlc2V0LAotCQkJaW9hZGRyICsgQVNJQ0N0cmwgKyAyKTsKLQlmb3IgKGk9NTA7IGkgPiAwOyBpLS0pIHsKLQkJaWYgKChpb3JlYWQxNihpb2FkZHIgKyBBU0lDQ3RybCArIDIpICYgUmVzZXRCdXN5KSA9PSAwKQotCQkJYnJlYWs7Ci0JCW1kZWxheSgxKTsKLQl9CisJc3VuZGFuY2VfcmVzZXQoZGV2LCAoTmV0d29ya1Jlc2V0fEZJRk9SZXNldHxETUFSZXNldHxUeFJlc2V0KSA8PCAxNik7CisKIAkvKiBmcmVlIGFsbCB0eCBza2J1ZmYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKIAkJc2tiID0gbnAtPnR4X3NrYnVmZltpXTsKQEAgLTE3MzYsNyArMTczMyw3IEBACiAjaWZkZWYgTU9EVUxFCiAJcHJpbnRrKHZlcnNpb24pOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc3VuZGFuY2VfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3VuZGFuY2VfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHN1bmRhbmNlX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggYjcwYmJkNy4uMWE0NDFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTMxOTQsNyArMzE5NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZ2VtX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmdlbV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZ2VtX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RjMzU4MTUuYyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwppbmRleCA4YjUzZGVkLi4zOTQ2MGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90YzM1ODE1LmMKKysrIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCkBAIC0xNzI1LDcgKzE3MjUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0YzM1ODE1X2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdGMzNTgxNV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0YzM1ODE1X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0YzM1ODE1X2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IGVhZmFiYjIuLmQ2ZTJhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC0xMTgxOSw3ICsxMTgxOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRnM19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdGczX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRnM19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdGczX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKaW5kZXggNDY1OTIxZS4uNDEyMzkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKQEAgLTE4MTUsNyArMTgxNSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHhsX3BjaV9pbml0ICh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZ4bF8zYzM1OV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ4bF8zYzM1OV9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKaW5kZXggMjhkOTY4Zi4uMGQ2NjcwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKQEAgLTE5OTgsNyArMTk5OCw3IEBACiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzdHJlYW1lcl9pbml0X21vZHVsZSh2b2lkKSB7Ci0gIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnN0cmVhbWVyX3BjaV9kcml2ZXIpOworICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3RyZWFtZXJfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzdHJlYW1lcl9jbGVhbnVwX21vZHVsZSh2b2lkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwppbmRleCA2ODNmMTRiLi5mYTNhMmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogCWRyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMKIAotCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCU1haW50YWluZWQgYnkgVmFsZXJpZSBIZW5zb24gPHZhbF9oZW5zb25AbGludXguaW50ZWwuY29tPgogCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQogCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgogCkBAIC0yNiw5ICsyNiw5IEBACiAKIC8qIEhhbmRsZSB0aGUgMjExNDMgdW5pcXVlbHk6IGRvIGF1dG9zZWxlY3Qgd2l0aCBOV2F5LCBub3QgdGhlIEVFUFJPTSBsaXN0CiAgICBvZiBhdmFpbGFibGUgdHJhbnNjZWl2ZXJzLiAgKi8KLXZvaWQgdDIxMTQyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3ZvaWQgdDIxMTQyX21lZGlhX3Rhc2sodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKIAlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKIAlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggZDA1YzVhYS4uMTdhMmViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMjEzOCwxNyArMjEzOCwyMSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOwogCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwlpbnQgcmV0dmFsID0gMDsKIAogCXJ0bmxfbG9jaygpOwogCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQogCQlnb3RvIG91dDsKLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCQlkZV9pbml0X2h3KGRlKTsKLQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwotCX0gZWxzZSB7Ci0JCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXRfYXR0YWNoOworCWlmICgocmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgaW4gcmVzdW1lXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CiAJfQorCWRlX2luaXRfaHcoZGUpOworb3V0X2F0dGFjaDoKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiBvdXQ6CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gMDsKQEAgLTIxNzIsNyArMjE3Niw3IEBACiAjaWZkZWYgTU9EVUxFCiAJcHJpbnRrKCIlcyIsIHZlcnNpb24pOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJmRlX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRlX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkZV9leGl0ICh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKaW5kZXggNzVmZjE0YS4uZTY2MWQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCkBAIC01NzU0LDcgKzU3NTQsNyBAQAogCWludCBlcnIgPSAwOwogCiAjaWZkZWYgQ09ORklHX1BDSQotCWVyciA9IHBjaV9tb2R1bGVfaW5pdCAoJmRlNHg1X3BjaV9kcml2ZXIpOworCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRlNHg1X3BjaV9kcml2ZXIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VJU0EKIAllcnIgfD0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZkZTR4NV9laXNhX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggNGU1YjBmMi4uNjZkYWRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMjAzOSw3ICsyMDM5LDcgQEAKIAlpZiAoSFBOQV9Ob2lzZUZsb29yID4gMTUpCiAJCUhQTkFfTm9pc2VGbG9vciA9IDA7CiAKLQlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmZG1mZV9kcml2ZXIpOworCXJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZG1mZV9kcml2ZXIpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwppbmRleCA1ZmZiZDViLi4yMDY5MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAJZHJpdmVycy9uZXQvdHVsaXAvZWVwcm9tLmMKIAotCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCU1haW50YWluZWQgYnkgVmFsZXJpZSBIZW5zb24gPHZhbF9oZW5zb25AbGludXguaW50ZWwuY29tPgogCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQogCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCmluZGV4IDk5Y2NmMmUuLjdmOGY1ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKIAlkcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwogCi0JTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJTWFpbnRhaW5lZCBieSBWYWxlcmllIEhlbnNvbiA8dmFsX2hlbnNvbkBsaW51eC5pbnRlbC5jb20+CiAJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCiAJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCmluZGV4IGU5YmMyYTkuLjIwYmQ1MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAJZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwogCi0JTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJTWFpbnRhaW5lZCBieSBWYWxlcmllIEhlbnNvbiA8dmFsX2hlbnNvbkBsaW51eC5pbnRlbC5jb20+CiAJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCiAJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYwppbmRleCBjYTdlNTMyLi44NWE1MjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9wbmljLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKIAlkcml2ZXJzL25ldC90dWxpcC9wbmljLmMKIAotCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCU1haW50YWluZWQgYnkgVmFsZXJpZSBIZW5zb24gPHZhbF9oZW5zb25AbGludXguaW50ZWwuY29tPgogCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQogCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jIGIvZHJpdmVycy9uZXQvdHVsaXAvcG5pYzIuYwppbmRleCBhYjk4NTAyLi5jMzFiZTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogCWRyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKIAotCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCU1haW50YWluZWQgYnkgVmFsZXJpZSBIZW5zb24gPHZhbF9oZW5zb25AbGludXguaW50ZWwuY29tPgogCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQogCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgogICAgICAgICBNb2RpZmllZCB0byBoZXAgc3VwcG9ydCBQTklDX0lJIGJ5IEtldmluIEIuIEhlbmRyaWNrcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKaW5kZXggZTA1OGE5Zi4uMDY2ZTVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCkBAIC0xLDcgKzEsNyBAQAogLyoKIAlkcml2ZXJzL25ldC90dWxpcC90aW1lci5jCiAKLQlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlNYWludGFpbmVkIGJ5IFZhbGVyaWUgSGVuc29uIDx2YWxfaGVuc29uQGxpbnV4LmludGVsLmNvbT4KIAlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KIAlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KIApAQCAtMTgsMTMgKzE4LDE0IEBACiAjaW5jbHVkZSAidHVsaXAuaCIKIAogCi12b2lkIHR1bGlwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3ZvaWQgdHVsaXBfbWVkaWFfdGFzayh2b2lkICpkYXRhKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwogCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOwogCXUzMiBjc3IxMiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjEyKTsKIAlpbnQgbmV4dF90aWNrID0gMipIWjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHR1bGlwX2RlYnVnID4gMikgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aWNrLCAlcywgc3RhdHVzICU4Ljh4IG1vZGUiCkBAIC0xMjYsNiArMTI3LDE1IEBACiAJfQogCWJyZWFrOwogCX0KKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJaWYgKHRwLT50aW1lb3V0X3JlY292ZXJ5KSB7CisJCXR1bGlwX3R4X3RpbWVvdXRfY29tcGxldGUodHAsIGlvYWRkcik7CisJCXRwLT50aW1lb3V0X3JlY292ZXJ5ID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwogCS8qIG1vZF90aW1lciBzeW5jaHJvbml6ZXMgdXMgd2l0aCBwb3RlbnRpYWwgYWRkX3RpbWVyIGNhbGxzCiAJICogZnJvbSBpbnRlcnJ1cHRzLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaCBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKaW5kZXggM2JjZmJmMy4uMjU2NjhkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCkBAIC0zMCwxMSArMzAsMTAgQEAKIC8qIHVuZGVmaW5lLCBvciBkZWZpbmUgdG8gdmFyaW91cyBkZWJ1Z2dpbmcgbGV2ZWxzICg+NCA9PSBvYnNjZW5lIGxldmVscykgKi8KICNkZWZpbmUgVFVMSVBfREVCVUcgMQogCi0vKiB1bmRlZmluZSBVU0VfSU9fT1BTIGZvciBNTUlPLCBkZWZpbmUgZm9yIFBJTyAqLwogI2lmZGVmIENPTkZJR19UVUxJUF9NTUlPCi0jIHVuZGVmIFVTRV9JT19PUFMKKyNkZWZpbmUgVFVMSVBfQkFSCTEJLyogQ0JNQSAqLwogI2Vsc2UKLSMgZGVmaW5lIFVTRV9JT19PUFMgMQorI2RlZmluZSBUVUxJUF9CQVIJMAkvKiBDQklPICovCiAjZW5kaWYKIAogCkBAIC00NCw3ICs0Myw4IEBACiAJaW50IGlvX3NpemU7CiAJaW50IHZhbGlkX2ludHJzOwkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KIAlpbnQgZmxhZ3M7Ci0Jdm9pZCAoKm1lZGlhX3RpbWVyKSAodW5zaWduZWQgbG9uZyBkYXRhKTsKKwl2b2lkICgqbWVkaWFfdGltZXIpICh1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqbWVkaWFfdGFzaykgKHZvaWQgKik7CiB9OwogCiAKQEAgLTE0Miw2ICsxNDIsNyBAQAogCVJ4Tm9CdWYgPSAweDgwLAogCVJ4SW50ciA9IDB4NDAsCiAJVHhGSUZPVW5kZXJmbG93ID0gMHgyMCwKKwlSeEVyckludHIgPSAweDEwLAogCVR4SmFiYmVyID0gMHgwOCwKIAlUeE5vQnVmID0gMHgwNCwKIAlUeERpZWQgPSAweDAyLApAQCAtMTkyLDkgKzE5MywxNCBAQAogCiAKIGVudW0gZGVzY19zdGF0dXNfYml0cyB7Ci0JRGVzY093bmVkID0gMHg4MDAwMDAwMCwKLQlSeERlc2NGYXRhbEVyciA9IDB4ODAwMCwKLQlSeFdob2xlUGt0ID0gMHgwMzAwLAorCURlc2NPd25lZCAgICA9IDB4ODAwMDAwMDAsCisJRGVzY1dob2xlUGt0ID0gMHg2MDAwMDAwMCwKKwlEZXNjRW5kUGt0ICAgPSAweDQwMDAwMDAwLAorCURlc2NTdGFydFBrdCA9IDB4MjAwMDAwMDAsCisJRGVzY0VuZFJpbmcgID0gMHgwMjAwMDAwMCwKKwlEZXNjVXNlTGluayAgPSAweDAxMDAwMDAwLAorCVJ4RGVzY0ZhdGFsRXJyID0gMHgwMDgwMDAsCisJUnhXaG9sZVBrdCAgID0gMHgwMDAwMDMwMCwKIH07CiAKIApAQCAtMzY2LDYgKzM3Miw3IEBACiAJdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOwkvKiBEb24ndCBzZW5zZSBtZWRpYSB0eXBlLiAqLwogCXVuc2lnbmVkIGludCBtZWRpYXNlbnNlOjE7CS8qIE1lZGlhIHNlbnNpbmcgaW4gcHJvZ3Jlc3MuICovCiAJdW5zaWduZWQgaW50IG53YXk6MSwgbndheXNldDoxOwkJLyogMjExNDMgaW50ZXJuYWwgTldheS4gKi8KKwl1bnNpZ25lZCBpbnQgdGltZW91dF9yZWNvdmVyeToxOwogCXVuc2lnbmVkIGludCBjc3IwOwkvKiBDU1IwIHNldHRpbmcuICovCiAJdW5zaWduZWQgaW50IGNzcjY7CS8qIEN1cnJlbnQgQ1NSNiBjb250cm9sIHNldHRpbmdzLiAqLwogCXVuc2lnbmVkIGNoYXIgZWVwcm9tW0VFUFJPTV9TSVpFXTsJLyogU2VyaWFsIEVFUFJPTSBjb250ZW50cy4gKi8KQEAgLTM4NCw2ICszOTEsNyBAQAogCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwogCWludCBjc3IxMl9zaGFkb3c7CiAJaW50IHBhZDA7CQkvKiBVc2VkIGZvciA4LWJ5dGUgYWxpZ25tZW50ICovCisJc3RydWN0IHdvcmtfc3RydWN0IG1lZGlhX3dvcms7CiB9OwogCiAKQEAgLTM5OCw3ICs0MDYsNyBAQAogCiAvKiAyMTE0Mi5jICovCiBleHRlcm4gdTE2IHQyMTE0Ml9jc3IxNFtdOwotdm9pZCB0MjExNDJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgdDIxMTQyX21lZGlhX3Rhc2sodm9pZCAqZGF0YSk7CiB2b2lkIHQyMTE0Ml9zdGFydF9ud2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCB0MjExNDJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSk7CiAKQEAgLTQzNiw3ICs0NDQsNyBAQAogdm9pZCBwbmljX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIHRpbWVyLmMgKi8KLXZvaWQgdHVsaXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgdHVsaXBfbWVkaWFfdGFzayh2b2lkICpkYXRhKTsKIHZvaWQgbXhpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCBjb21ldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCkBAIC00ODUsNCArNDkzLDE0IEBACiAJdHVsaXBfc3RhcnRfcnh0eCh0cCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dWxpcF90eF90aW1lb3V0X2NvbXBsZXRlKHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJLyogU3RvcCBhbmQgcmVzdGFydCB0aGUgY2hpcCdzIFR4IHByb2Nlc3Nlcy4gKi8KKwl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMSk7CisKKwl0cC0+c3RhdHMudHhfZXJyb3JzKys7Cit9CisKICNlbmRpZiAvKiBfX05FVF9UVUxJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwppbmRleCA3MzUxODMxLi44MDkyYzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC0xLDcgKzEsNyBAQAogLyogdHVsaXBfY29yZS5jOiBBIERFQyAyMXg0eC1mYW1pbHkgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KIAogLyoKLQlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlNYWludGFpbmVkIGJ5IFZhbGVyaWUgSGVuc29uIDx2YWxfaGVuc29uQGxpbnV4LmludGVsLmNvbT4KIAlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KIAlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KIApAQCAtMTMwLDcgKzEzMCwxNCBAQAogaW50IHR1bGlwX2RlYnVnID0gMTsKICNlbmRpZgogCitzdGF0aWMgdm9pZCB0dWxpcF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXNjaGVkdWxlX3dvcmsoJnRwLT5tZWRpYV93b3JrKTsKK30KIAogLyoKICAqIFRoaXMgdGFibGUgdXNlIGR1cmluZyBvcGVyYXRpb24gZm9yIGNhcGFiaWxpdGllcyBhbmQgbWVkaWEgdGltZXIuCkBAIC0xNDQsNTkgKzE1MSw2MCBAQAogCiAgIC8qIERDMjExNDAgKi8KICAgeyAiRGlnaXRhbCBEUzIxMTQwIFR1bGlwIiwgMTI4LCAweDAwMDFlYmVmLAotCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIHwgSEFTX1BDSV9NV0ksIHR1bGlwX3RpbWVyIH0sCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBIQVNfUENJX01XSSwgdHVsaXBfdGltZXIsCisJdHVsaXBfbWVkaWFfdGFzayB9LAogCiAgIC8qIERDMjExNDIsIERDMjExNDMgKi8KLSAgeyAiRGlnaXRhbCBEUzIxMTQzIFR1bGlwIiwgMTI4LCAweDA4MDFmYmZmLAorICB7ICJEaWdpdGFsIERTMjExNDIvNDMgVHVsaXAiLCAxMjgsIDB4MDgwMWZiZmYsCiAJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgfCBIQVNfQUNQSSB8IEhBU19OV0FZCi0JfCBIQVNfSU5UUl9NSVRJR0FUSU9OIHwgSEFTX1BDSV9NV0ksIHQyMTE0Ml90aW1lciB9LAorCXwgSEFTX0lOVFJfTUlUSUdBVElPTiB8IEhBU19QQ0lfTVdJLCB0dWxpcF90aW1lciwgdDIxMTQyX21lZGlhX3Rhc2sgfSwKIAogICAvKiBMQzgyQzE2OCAqLwogICB7ICJMaXRlLU9uIDgyYzE2OCBQTklDIiwgMjU2LCAweDAwMDFmYmVmLAotCUhBU19NSUkgfCBIQVNfUE5JQ05XQVksIHBuaWNfdGltZXIgfSwKKwlIQVNfTUlJIHwgSEFTX1BOSUNOV0FZLCBwbmljX3RpbWVyLCB9LAogCiAgIC8qIE1YOTg3MTMgKi8KICAgeyAiTWFjcm9uaXggOTg3MTMgUE1BQyIsIDEyOCwgMHgwMDAxZWJlZiwKLQlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSwgbXhpY190aW1lciB9LAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NLCBteGljX3RpbWVyLCB9LAogCiAgIC8qIE1YOTg3MTUgKi8KICAgeyAiTWFjcm9uaXggOTg3MTUgUE1BQyIsIDI1NiwgMHgwMDAxZWJlZiwKLQlIQVNfTUVESUFfVEFCTEUsIG14aWNfdGltZXIgfSwKKwlIQVNfTUVESUFfVEFCTEUsIG14aWNfdGltZXIsIH0sCiAKICAgLyogTVg5ODcyNSAqLwogICB7ICJNYWNyb25peCA5ODcyNSBQTUFDIiwgMjU2LCAweDAwMDFlYmVmLAotCUhBU19NRURJQV9UQUJMRSwgbXhpY190aW1lciB9LAorCUhBU19NRURJQV9UQUJMRSwgbXhpY190aW1lciwgfSwKIAogICAvKiBBWDg4MTQwICovCiAgIHsgIkFTSVggQVg4ODE0MCIsIDEyOCwgMHgwMDAxZmJmZiwKIAlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IE1DX0hBU0hfT05MWQotCXwgSVNfQVNJWCwgdHVsaXBfdGltZXIgfSwKKwl8IElTX0FTSVgsIHR1bGlwX3RpbWVyLCB0dWxpcF9tZWRpYV90YXNrIH0sCiAKICAgLyogUE5JQzIgKi8KICAgeyAiTGl0ZS1PbiBQTklDLUlJIiwgMjU2LCAweDA4MDFmYmZmLAotCUhBU19NSUkgfCBIQVNfTldBWSB8IEhBU184MDIzWCB8IEhBU19QQ0lfTVdJLCBwbmljMl90aW1lciB9LAorCUhBU19NSUkgfCBIQVNfTldBWSB8IEhBU184MDIzWCB8IEhBU19QQ0lfTVdJLCBwbmljMl90aW1lciwgfSwKIAogICAvKiBDT01FVCAqLwogICB7ICJBRE10ZWsgQ29tZXQiLCAyNTYsIDB4MDAwMWFiZWYsCi0JSEFTX01JSSB8IE1DX0hBU0hfT05MWSB8IENPTUVUX01BQ19BRERSLCBjb21ldF90aW1lciB9LAorCUhBU19NSUkgfCBNQ19IQVNIX09OTFkgfCBDT01FVF9NQUNfQUREUiwgY29tZXRfdGltZXIsIH0sCiAKICAgLyogQ09NUEVYOTg4MSAqLwogICB7ICJDb21wZXggOTg4MSBQTUFDIiwgMTI4LCAweDAwMDFlYmVmLAotCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NLCBteGljX3RpbWVyIH0sCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00sIG14aWNfdGltZXIsIH0sCiAKICAgLyogSTIxMTQ1ICovCiAgIHsgIkludGVsIERTMjExNDUgVHVsaXAiLCAxMjgsIDB4MDgwMWZiZmYsCiAJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgfCBIQVNfQUNQSQotCXwgSEFTX05XQVkgfCBIQVNfUENJX01XSSwgdDIxMTQyX3RpbWVyIH0sCisJfCBIQVNfTldBWSB8IEhBU19QQ0lfTVdJLCB0dWxpcF90aW1lciwgdHVsaXBfbWVkaWFfdGFzayB9LAogCiAgIC8qIERNOTEwWCAqLwogICB7ICJEYXZpY29tIERNOTEwMi9ETTkxMDJBIiwgMTI4LCAweDAwMDFlYmVmLAogCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIHwgSEFTX0FDUEksCi0JdHVsaXBfdGltZXIgfSwKKwl0dWxpcF90aW1lciwgdHVsaXBfbWVkaWFfdGFzayB9LAogCiAgIC8qIFJTNzExMiAqLwogICB7ICJDb25leGFudCBMQU5maW5pdHkiLCAyNTYsIDB4MDAwMWViZWYsCi0JSEFTX01JSSB8IEhBU19BQ1BJLCB0dWxpcF90aW1lciB9LAorCUhBU19NSUkgfCBIQVNfQUNQSSwgdHVsaXBfdGltZXIsIHR1bGlwX21lZGlhX3Rhc2sgfSwKIAogfTsKIApAQCAtMjk1LDEyICszMDMsMTQgQEAKIAogCS8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLwogCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBDU1IwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCAmaSk7ICAvKiBmbHVzaCB3cml0ZSAqLwogCXVkZWxheSgxMDApOwogCiAJLyogRGVhc3NlcnQgcmVzZXQuCiAJICAgV2FpdCB0aGUgc3BlY2lmaWVkIDUwIFBDSSBjeWNsZXMgYWZ0ZXIgYSByZXNldCBieSBpbml0aWFsaXppbmcKIAkgICBUeCBhbmQgUnggcXVldWVzIGFuZCB0aGUgYWRkcmVzcyBmaWx0ZXIgbGlzdC4gKi8KIAlpb3dyaXRlMzIodHAtPmNzcjAsIGlvYWRkciArIENTUjApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZpKTsgIC8qIGZsdXNoIHdyaXRlICovCiAJdWRlbGF5KDEwMCk7CiAKIAlpZiAodHVsaXBfZGVidWcgPiAxKQpAQCAtNTIyLDIwICs1MzIsOSBAQAogCQkJICAgIlNJQSAlOC44eCAlOC44eCAlOC44eCAlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAogCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpLAogCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTMpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCksIGlvcmVhZDMyKGlvYWRkciArIENTUjE1KSk7Ci0JCWlmICggISB0cC0+bWVkaWFsb2NrICAmJiAgdHAtPm10YWJsZSkgewotCQkJZG8KLQkJCQktLXRwLT5jdXJfaW5kZXg7Ci0JCQl3aGlsZSAodHAtPmN1cl9pbmRleCA+PSAwCi0JCQkJICAgJiYgKHR1bGlwX21lZGlhX2NhcFt0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XS5tZWRpYV0KLQkJCQkJICAgJiBNZWRpYUlzRkQpKTsKLQkJCWlmICgtLXRwLT5jdXJfaW5kZXggPCAwKSB7Ci0JCQkJLyogV2Ugc3RhcnQgYWdhaW4sIGJ1dCBzaG91bGQgaW5zdGVhZCBsb29rIGZvciBkZWZhdWx0LiAqLwotCQkJCXRwLT5jdXJfaW5kZXggPSB0cC0+bXRhYmxlLT5sZWFmY291bnQgLSAxOwotCQkJfQotCQkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgMCk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzd2l0Y2hpbmcgdG8gJXMgIgotCQkJCSAgICJtZWRpYS5cbiIsIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0pOwotCQl9CisJCXRwLT50aW1lb3V0X3JlY292ZXJ5ID0gMTsKKwkJc2NoZWR1bGVfd29yaygmdHAtPm1lZGlhX3dvcmspOworCQlnb3RvIG91dF91bmxvY2s7CiAJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBQTklDMikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUE5JQzIgdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsICIKIAkJICAgICAgICJDU1I2LzcgJTguOHggLyAlOC44eCBDU1IxMiAlOC44eCwgcmVzZXR0aW5nLi4uXG4iLApAQCAtNTc1LDE0ICs1NzQsOSBAQAogCX0KICNlbmRpZgogCi0JLyogU3RvcCBhbmQgcmVzdGFydCB0aGUgY2hpcCdzIFR4IHByb2Nlc3NlcyAuICovCisJdHVsaXBfdHhfdGltZW91dF9jb21wbGV0ZSh0cCwgaW9hZGRyKTsKIAotCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7Ci0JLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLwotCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxKTsKLQotCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQorb3V0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAluZXRpZl93YWtlX3F1ZXVlIChkZXYpOwpAQCAtNzMyLDYgKzcyNiw4IEBACiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCiAJZGVsX3RpbWVyX3N5bmMgKCZ0cC0+dGltZXIpOwogI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCiAJZGVsX3RpbWVyX3N5bmMgKCZ0cC0+b29tX3RpbWVyKTsKQEAgLTEzNjEsMTEgKzEzNTcsOCBAQAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAidHVsaXAiKSkKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCi0jaWZuZGVmIFVTRV9JT19PUFMKLQlpb2FkZHIgPSAgcGNpX2lvbWFwKHBkZXYsIDEsIHR1bGlwX3RibFtjaGlwX2lkeF0uaW9fc2l6ZSk7Ci0jZWxzZQotCWlvYWRkciA9ICBwY2lfaW9tYXAocGRldiwgMCwgdHVsaXBfdGJsW2NoaXBfaWR4XS5pb19zaXplKTsKLSNlbmRpZgorCWlvYWRkciA9ICBwY2lfaW9tYXAocGRldiwgVFVMSVBfQkFSLCB0dWxpcF90YmxbY2hpcF9pZHhdLmlvX3NpemUpOworCiAJaWYgKCFpb2FkZHIpCiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIApAQCAtMTM5OCw2ICsxMzkxLDggQEAKIAl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKIAl0cC0+dGltZXIuZnVuY3Rpb24gPSB0dWxpcF90YmxbdHAtPmNoaXBfaWRdLm1lZGlhX3RpbWVyOwogCisJSU5JVF9XT1JLKCZ0cC0+bWVkaWFfd29yaywgdHVsaXBfdGJsW3RwLT5jaGlwX2lkXS5tZWRpYV90YXNrLCBkZXYpOworCiAJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CiAKICNpZmRlZiBDT05GSUdfVFVMSVBfTVdJCkBAIC0xNjQ0LDggKzE2MzksMTQgQEAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCiAJCWdvdG8gZXJyX291dF9mcmVlX3Jpbmc7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgcmV2ICVkIGF0ICVwLCIsCi0JICAgICAgIGRldi0+bmFtZSwgY2hpcF9uYW1lLCBjaGlwX3JldiwgaW9hZGRyKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgcmV2ICVkIGF0ICIKKyNpZmRlZiBDT05GSUdfVFVMSVBfTU1JTworCQkiTU1JTyIKKyNlbHNlCisJCSJQb3J0IgorI2VuZGlmCisJCSIgJSNsbHgsIiwgZGV2LT5uYW1lLCBjaGlwX25hbWUsIGNoaXBfcmV2LAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgVFVMSVBfQkFSKSk7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlpZiAoZWVwcm9tX21pc3NpbmcpCkBAIC0xNzY4LDcgKzE3NjksMTAgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoKHJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJ0dWxpcDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIGluIHJlc3VtZVxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR1bGlwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSkpIHsKIAkJcHJpbnRrIChLRVJOX0VSUiAidHVsaXA6IHJlcXVlc3RfaXJxIGZhaWxlZCBpbiByZXN1bWVcbiIpOwpAQCAtMTg0OSw3ICsxODUzLDcgQEAKIAl0dWxpcF9tYXhfaW50ZXJydXB0X3dvcmsgPSBtYXhfaW50ZXJydXB0X3dvcms7CiAKIAkvKiBwcm9iZSBmb3IgYW5kIGluaXQgYm9hcmRzICovCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJnR1bGlwX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnR1bGlwX2RyaXZlcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCmluZGV4IGZkNjRiMmIuLmM0YzcyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYworKysgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKQEAgLTE3MDIsNyArMTcwMiw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVsaTUyNnhfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlpbnQgcmM7CiAKIAlwcmludGsodmVyc2lvbik7CiAJcHJpbnRlZF92ZXJzaW9uID0gMTsKQEAgLTE3MTQsMjIgKzE3MTMsMTkgQEAKIAlpZiAoY3I2c2V0KQogCQl1bGk1MjZ4X2NyNl91c2VyX3NldCA9IGNyNnNldDsKIAotIAlzd2l0Y2gobW9kZSkgeworIAlzd2l0Y2ggKG1vZGUpIHsKICAgIAljYXNlIFVMSTUyNlhfMTBNSEY6CiAJY2FzZSBVTEk1MjZYXzEwME1IRjoKIAljYXNlIFVMSTUyNlhfMTBNRkQ6CiAJY2FzZSBVTEk1MjZYXzEwME1GRDoKIAkJdWxpNTI2eF9tZWRpYV9tb2RlID0gbW9kZTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDp1bGk1MjZ4X21lZGlhX21vZGUgPSBVTEk1MjZYX0FVVE87CisJZGVmYXVsdDoKKwkJdWxpNTI2eF9tZWRpYV9tb2RlID0gVUxJNTI2WF9BVVRPOwogCQlicmVhazsKIAl9CiAKLQlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmdWxpNTI2eF9kcml2ZXIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiAwOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ1bGk1MjZ4X2RyaXZlcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKaW5kZXggZWJhOTA4My4uYTY0ZDY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCkBAIC05MCwxMCArOTAsOCBAQAogICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAogICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgogICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCi0jZGVmaW5lIFRYX1JJTkdfU0laRQkxNgogI2RlZmluZSBUWF9RVUVVRV9MRU4JMTAJCS8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAgKi8KICNkZWZpbmUgVFhfUVVFVUVfTEVOX1JFU1RBUlQJNQotI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKIAogI2RlZmluZSBUWF9CVUZMSU1JVAkoMTAyNC0xMjgpCiAKQEAgLTEzNyw2ICsxMzUsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAorI2luY2x1ZGUgInR1bGlwLmgiCisKIC8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogS0VSTl9JTkZPIERSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICgyLjQgcG9ydCkgIiBEUlZfUkVMREFURSAiICBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPlxuIgpAQCAtMjQyLDggKzI0Miw4IEBACiB9OwogCiAvKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSwgaG93ZXZlciBzb21lIHg4NiBzeXN0ZW1zCi0gICB3b3JrIG9ubHkgd2l0aCBJL08gc3BhY2UgYWNjZXNzZXMuICBQYXNzIC1EVVNFX0lPX09QUyB0byB1c2UgUENJIEkvTyBzcGFjZQotICAgYWNjZXNzZXMgaW5zdGVhZCBvZiBtZW1vcnkgc3BhY2UuICovCisgICB3b3JrIG9ubHkgd2l0aCBJL08gc3BhY2UgYWNjZXNzZXMuIFNlZSBDT05GSUdfVFVMSVBfTU1JTyBpbiAuY29uZmlnCisqLwogCiAvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuCiAgICBXaGlsZSBzaW1pbGFyIHRvIHRoZSBUdWxpcCwgdGhlc2UgcmVnaXN0ZXJzIGFyZSBsb25nd29yZCBhbGlnbmVkLgpAQCAtMjYxLDIxICsyNjEsMTEgQEAKIAlDdXJUeERlc2NBZGRyPTB4NEMsIEN1clR4QnVmQWRkcj0weDUwLAogfTsKIAotLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9lbmFibGUgcmVnaXN0ZXJzLiAqLwotLyogVGhlIGJpdHMgaW4gdGhlIEludHIgU3RhdHVzL0VuYWJsZSByZWdpc3RlcnMsIG1vc3RseSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KLWVudW0gaW50cl9zdGF0dXNfYml0cyB7Ci0JTm9ybWFsSW50cj0weDEwMDAwLCBBYm5vcm1hbEludHI9MHg4MDAwLAotCUludHJQQ0lFcnI9MHgyMDAwLCBUaW1lckludD0weDgwMCwKLQlJbnRyUnhEaWVkPTB4MTAwLCBSeE5vQnVmPTB4ODAsIEludHJSeERvbmU9MHg0MCwKLQlUeEZJRk9VbmRlcmZsb3c9MHgyMCwgUnhFcnJJbnRyPTB4MTAsCi0JVHhJZGxlPTB4MDQsIEludHJUeFN0b3BwZWQ9MHgwMiwgSW50clR4RG9uZT0weDAxLAotfTsKLQogLyogQml0cyBpbiB0aGUgTmV0d29ya0NvbmZpZyByZWdpc3Rlci4gKi8KIGVudW0gcnhfbW9kZV9iaXRzIHsKLQlBY2NlcHRFcnI9MHg4MCwgQWNjZXB0UnVudD0weDQwLAotCUFjY2VwdEJyb2FkY2FzdD0weDIwLCBBY2NlcHRNdWx0aWNhc3Q9MHgxMCwKLQlBY2NlcHRBbGxQaHlzPTB4MDgsIEFjY2VwdE15UGh5cz0weDAyLAorCUFjY2VwdEVycj0weDgwLAorCVJ4QWNjZXB0QnJvYWRjYXN0PTB4MjAsIEFjY2VwdE11bHRpY2FzdD0weDEwLAorCVJ4QWNjZXB0QWxsUGh5cz0weDA4LCBBY2NlcHRNeVBoeXM9MHgwMiwKIH07CiAKIGVudW0gbWlpX3JlZ19iaXRzIHsKQEAgLTI5NywxMyArMjg3LDYgQEAKIAl1MzIgYnVmZmVyMSwgYnVmZmVyMjsKIH07CiAKLS8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLwotZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKLQlEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NFbmRSaW5nPTB4MDIwMDAwMDAsIERlc2NVc2VMaW5rPTB4MDEwMDAwMDAsCi0JRGVzY1dob2xlUGt0PTB4NjAwMDAwMDAsIERlc2NTdGFydFBrdD0weDIwMDAwMDAwLCBEZXNjRW5kUGt0PTB4NDAwMDAwMDAsCi0JRGVzY0ludHI9MHg4MDAwMDAwMCwKLX07Ci0KICNkZWZpbmUgTUlJX0NOVAkJMSAvKiB3aW5ib25kIG9ubHkgc3VwcG9ydHMgb25lIE1JSSAqLwogc3RydWN0IG5ldGRldl9wcml2YXRlIHsKIAlzdHJ1Y3Qgdzg0MF9yeF9kZXNjICpyeF9yaW5nOwpAQCAtMzcxLDcgKzM1NCw2IEBACiAJaW50IGlycTsKIAlpbnQgaSwgb3B0aW9uID0gZmluZF9jbnQgPCBNQVhfVU5JVFMgPyBvcHRpb25zW2ZpbmRfY250XSA6IDA7CiAJdm9pZCBfX2lvbWVtICppb2FkZHI7Ci0JaW50IGJhciA9IDE7CiAKIAlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGkpIHJldHVybiBpOwpAQCAtMzkzLDEwICszNzUsOCBAQAogCiAJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKQogCQlnb3RvIGVycl9vdXRfbmV0ZGV2OwotI2lmZGVmIFVTRV9JT19PUFMKLQliYXIgPSAwOwotI2VuZGlmCi0JaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgbmV0ZGV2X3Jlc19zaXplKTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBUVUxJUF9CQVIsIG5ldGRldl9yZXNfc2l6ZSk7CiAJaWYgKCFpb2FkZHIpCiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIApAQCAtODM4LDcgKzgxOCw3IEBACiAJCQkJCW5wLT5yeF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQlucC0+cnhfcmluZ1tpXS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbaV07Ci0JCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IERlc2NPd247CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IERlc2NPd25lZDsKIAl9CiAKIAlucC0+Y3VyX3J4ID0gMDsKQEAgLTkyMyw3ICs5MDMsNyBAQAogCX0KICNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiAJaSB8PSAweEUwMDA7Ci0jZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkIChDT05GSUdfUEFSSVNDKQogCWkgfD0gMHg0ODAwOwogI2Vsc2UKICN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkCkBAIC0xMDQzLDExICsxMDIzLDExIEBACiAKIAkvKiBOb3cgYWNxdWlyZSB0aGUgaXJxIHNwaW5sb2NrLgogCSAqIFRoZSBkaWZmaWN1bHQgcmFjZSBpcyB0aGUgdGhlIG9yZGVyaW5nIGJldHdlZW4KLQkgKiBpbmNyZWFzaW5nIG5wLT5jdXJfdHggYW5kIHNldHRpbmcgRGVzY093bjoKKwkgKiBpbmNyZWFzaW5nIG5wLT5jdXJfdHggYW5kIHNldHRpbmcgRGVzY093bmVkOgogCSAqIC0gaWYgbnAtPmN1cl90eCBpcyBpbmNyZWFzZWQgZmlyc3QgdGhlIGludGVycnVwdAogCSAqICAgaGFuZGxlciBjb3VsZCBjb25zaWRlciB0aGUgcGFja2V0IGFzIHRyYW5zbWl0dGVkCi0JICogICBzaW5jZSBEZXNjT3duIGlzIGNsZWFyZWQuCi0JICogLSBJZiBEZXNjT3duIGlzIHNldCBmaXJzdCB0aGUgTklDIGNvdWxkIHJlcG9ydCB0aGUKKwkgKiAgIHNpbmNlIERlc2NPd25lZCBpcyBjbGVhcmVkLgorCSAqIC0gSWYgRGVzY093bmVkIGlzIHNldCBmaXJzdCB0aGUgTklDIGNvdWxkIHJlcG9ydCB0aGUKIAkgKiAgIHBhY2tldCBhcyBzZW50LCBidXQgdGhlIGludGVycnVwdCBoYW5kbGVyIHdvdWxkIGlnbm9yZSBpdAogCSAqICAgc2luY2UgdGhlIG5wLT5jdXJfdHggd2FzIG5vdCB5ZXQgaW5jcmVhc2VkLgogCSAqLwpAQCAtMTA1NSw3ICsxMDM1LDcgQEAKIAlucC0+Y3VyX3R4Kys7CiAKIAl3bWIoKTsgLyogZmx1c2ggbGVuZ3RoLCBidWZmZXIxLCBidWZmZXIyICovCi0JbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd247CisJbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd25lZDsKIAl3bWIoKTsgLyogZmx1c2ggc3RhdHVzIGFuZCBraWNrIHRoZSBoYXJkd2FyZSAqLwogCWlvd3JpdGUzMigwLCBucC0+YmFzZV9hZGRyICsgVHhTdGFydERlbWFuZCk7CiAJbnAtPnR4X3FfYnl0ZXMgKz0gc2tiLT5sZW47CkBAIC0xMTU1LDEyICsxMTM1LDEyIEBACiAKIAkJaGFuZGxlZCA9IDE7CiAKLQkJaWYgKGludHJfc3RhdHVzICYgKEludHJSeERvbmUgfCBSeE5vQnVmKSkKKwkJaWYgKGludHJfc3RhdHVzICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKQogCQkJbmV0ZGV2X3J4KGRldik7CiAJCWlmIChpbnRyX3N0YXR1cyAmIFJ4Tm9CdWYpCiAJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUnhTdGFydERlbWFuZCk7CiAKLQkJaWYgKGludHJfc3RhdHVzICYgKFR4SWRsZSB8IEludHJUeERvbmUpICYmCisJCWlmIChpbnRyX3N0YXR1cyAmIChUeE5vQnVmIHwgVHhJbnRyKSAmJgogCQkJbnAtPmN1cl90eCAhPSBucC0+ZGlydHlfdHgpIHsKIAkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJbmV0ZGV2X3R4X2RvbmUoZGV2KTsKQEAgLTExNjgsOCArMTE0OCw4IEBACiAJCX0KIAogCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KLQkJaWYgKGludHJfc3RhdHVzICYgKEFibm9ybWFsSW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IEludHJQQ0lFcnIgfAotCQkJCQkJICAgVGltZXJJbnQgfCBJbnRyVHhTdG9wcGVkKSkKKwkJaWYgKGludHJfc3RhdHVzICYgKEFibm9ybWFsSW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IFN5dGVtRXJyb3IgfAorCQkJCQkJICAgVGltZXJJbnQgfCBUeERpZWQpKQogCQkJbmV0ZGV2X2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOwogCiAJCWlmICgtLXdvcmtfbGltaXQgPCAwKSB7CkBAIC0xMzA1LDcgKzEyODUsNyBAQAogCQkJbnAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSBucC0+cnhfYWRkcltlbnRyeV07CiAJCX0KIAkJd21iKCk7Ci0JCW5wLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBEZXNjT3duOworCQlucC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gRGVzY093bmVkOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTM0Miw3ICsxMzIyLDcgQEAKIAkJCSAgIGRldi0+bmFtZSwgbmV3KTsKIAkJdXBkYXRlX2NzcjYoZGV2LCBuZXcpOwogCX0KLQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyUnhEaWVkKSB7CQkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwlpZiAoaW50cl9zdGF0dXMgJiBSeERpZWQpIHsJCS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLwogCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CiAJfQogCWlmIChpbnRyX3N0YXR1cyAmIFRpbWVySW50KSB7CkBAIC0xMzgxLDEzICsxMzYxLDEzIEBACiAJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CiAJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKLQkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXMKKwkJcnhfbW9kZSA9IFJ4QWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgUnhBY2NlcHRBbGxQaHlzCiAJCQl8IEFjY2VwdE15UGh5czsKIAl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKIAkJCSAgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKIAkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KIAkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOwotCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCQlyeF9tb2RlID0gUnhBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CiAJCWludCBpOwpAQCAtMTM5OCw3ICsxMzc4LDcgQEAKIAkJCWZpbHRlcmJpdCAmPSAweDNmOwogCQkJbWNfZmlsdGVyW2ZpbHRlcmJpdCA+PiA1XSB8PSAxIDw8IChmaWx0ZXJiaXQgJiAzMSk7CiAJCX0KLQkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJcnhfbW9kZSA9IFJ4QWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOwogCX0KIAlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKIAlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKQEAgLTE2NDYsMTQgKzE2MjYsMTggQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0dmFsID0gMDsKIAogCXJ0bmxfbG9jaygpOwogCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQogCQlnb3RvIG91dDsgLyogZGV2aWNlIG5vdCBzdXNwZW5kZWQgKi8KIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCS8qCXBjaV9wb3dlcl9vbihwZGV2KTsgKi8KLQorCQlpZiAoKHJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIGluIHJlc3VtZVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KIAkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwogCQlpb3dyaXRlMzIoMSwgbnAtPmJhc2VfYWRkcitQQ0lCdXNDZmcpOwogCQlpb3JlYWQzMihucC0+YmFzZV9hZGRyK1BDSUJ1c0NmZyk7CkBAIC0xNjcxLDcgKzE2NTUsNyBAQAogCX0KIG91dDoKIAlydG5sX3VubG9jaygpOwotCXJldHVybiAwOworCXJldHVybiByZXR2YWw7CiB9CiAjZW5kaWYKIApAQCAtMTY4OSw3ICsxNjczLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHc4NDBfaW5pdCh2b2lkKQogewogCXByaW50ayh2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ3ODQwX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnc4NDBfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHc4NDBfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwppbmRleCAxN2NhN2RjLi5kNzk3YjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwpAQCAtMTcwNyw3ICsxNzA3LDcgQEAKICNpZmRlZiBNT0RVTEUKIAlwcmludGsodmVyc2lvbik7CiAjZW5kaWYKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ4aXJjb21fZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmeGlyY29tX2RyaXZlcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCmluZGV4IDQxMDNjMzcuLjEwMTQ0NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYworKysgYi9kcml2ZXJzL25ldC90eXBob29uLmMKQEAgLTI2NjAsNyArMjY2MCw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogdHlwaG9vbl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdHlwaG9vbl9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0eXBob29uX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwppbmRleCBhZTk3MTA4Li5lZmViMTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYworKysgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpAQCAtMjAwNSw3ICsyMDA1LDcgQEAKICNpZmRlZiBNT0RVTEUKIAlwcmludGsodmVyc2lvbik7CiAjZW5kaWYKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZyaGluZV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZyaGluZV9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKaW5kZXggYWE5Y2Q5Mi4uZTI2NmRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTIyNTAsNyArMjI1MCw3IEBACiAJaW50IHJldDsKIAogCXZlbG9jaXR5X3JlZ2lzdGVyX25vdGlmaWVyKCk7Ci0JcmV0ID0gcGNpX21vZHVsZV9pbml0KCZ2ZWxvY2l0eV9kcml2ZXIpOworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZlbG9jaXR5X2RyaXZlcik7CiAJaWYgKHJldCA8IDApCiAJCXZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIoKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmggYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaAppbmRleCA0OTZjM2Q1Li40NjY1ZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaAorKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApAQCAtMjYyLDI1ICsyNjIsNiBAQAogCWRtYV9hZGRyX3Qgc2tiX2RtYTsKIH07CiAKLS8qKgotICoJYWxsb2NfcmRfaW5mbwkJLQlhbGxvY2F0ZSBhbiByZCBpbmZvIGJsb2NrCi0gKgotICoJQWxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHJlY2VpdmUgaW5mbyBzdHJ1Y3R1cmUgdXNlZCBmb3Iga2VlcGluZwotICoJdHJhY2sgb2Yga2VybmVsIHNpZGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBlYWNoIHJlY2VpdmUKLSAqCWRlc2NyaXB0b3Igd2UgYXJlIHVzaW5nCi0gKi8KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqYWxsb2NfcmRfaW5mbyh2b2lkKQotewotCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpwdHI7Ci0JaWYgKChwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlIHsKLQkJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSk7Ci0JCXJldHVybiBwdHI7Ci0JfQotfQotCiAvKgogICoJVXNlZCB0byB0cmFjayB0cmFuc21pdCBzaWRlIGJ1ZmZlcnMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X21haW4uYwppbmRleCA0MzBiMWY2Li5hNWU3Y2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jCkBAIC00MCw3ICs0MCw2IEBACiAqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBPUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLwogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMgYi9kcml2ZXJzL25ldC93YW4vZGxjaS5jCmluZGV4IDZlMWVjNWIuLjczNjk4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpAQCAtMjgsNyArMjgsNiBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX0RMQ0lfQ09VTlQgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMgYi9kcml2ZXJzL25ldC93YW4vZHNjYzQuYwppbmRleCA2ODRhZjQzLi5hZjRkNDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYworKysgYi9kcml2ZXJzL25ldC93YW4vZHNjYzQuYwpAQCAtMjA2Miw3ICsyMDYyLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZHNjYzRfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkc2NjNF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkc2NjNF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZHNjYzRfY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCmluZGV4IDM3MDVkYjA0YS4uNTY0MzUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCkBAIC0yNjk3LDcgKzI2OTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspCiAJCWZzdF9jYXJkX2FycmF5W2ldID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmZnN0X3dvcmtfcV9sb2NrKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZmc3RfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZnN0X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCmluZGV4IDM5ZjQ0MjQuLjdiNWQ4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYworKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKQEAgLTE3OTAsNyArMTc5MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbG1jKHZvaWQpCiB7Ci0gICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbG1jX2RyaXZlcik7CisgICAgcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmxtY19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9sbWModm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYwppbmRleCA1NjdlZmZmLi41NmU2OTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCkBAIC0zNjc3LDcgKzM2NzcsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcGNfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmNwY19kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjcGNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNwY19jbGVhbnVwX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCmluZGV4IDRkZjYxZmEuLmE2YjljMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYworKysgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogSW52YWxpZCBQQ0kgY2xvY2sgZnJlcXVlbmN5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnBjaTIwMF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpMjAwX3BjaV9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCmluZGV4IDc2MjhjMmQuLjBiYTAxOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwpAQCAtMzIsNyArMzIsNiBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX0RMQ0lfTUFYICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKaW5kZXggYjIwMzFkZi4uZWM2OGY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogI2lmZGVmIE1PRFVMRQogCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKICNlbmRpZgotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJndhbnhsX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ3YW54bF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHdhbnhsX2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jCmluZGV4IGQ0MjVjM2MuLjNiZmE3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jCkBAIC03Niw3ICs3Niw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGF0bWVsX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYXRtZWxfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXRtZWxfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGF0bWVsX2NsZWFudXBfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggNWQ1ZGFiNi4uZDJkYjhlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtNjUzMiw3ICs2NTMyLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6ICVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CiAJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CiAKLQlyZXQgPSBwY2lfbW9kdWxlX2luaXQoJmlwdzIxMDBfcGNpX2RyaXZlcik7CisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaXB3MjEwMF9wY2lfZHJpdmVyKTsKIAogI2lmZGVmIENPTkZJR19JUFcyMTAwX0RFQlVHCiAJaXB3MjEwMF9kZWJ1Z19sZXZlbCA9IGRlYnVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCmluZGV4IGZhMjQ1ZjEuLmYyOWVjMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTExNzg4LDcgKzExNzg4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6ICIgRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9DT1BZUklHSFQgIlxuIik7CiAKLQlyZXQgPSBwY2lfbW9kdWxlX2luaXQoJmlwd19kcml2ZXIpOworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlwd19kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJSVBXX0VSUk9SKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fbm9ydGVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX25vcnRlbC5jCmluZGV4IGJmMDViOTAuLmVhZjNkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fbm9ydGVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19ub3J0ZWwuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBvcmlub2NvX25vcnRlbF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZvcmlub2NvX25vcnRlbF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX25vcnRlbF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgb3Jpbm9jb19ub3J0ZWxfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMKaW5kZXggMTc1OWM1NC4uOTdhOGI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IG9yaW5vY29fcGNpX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm9yaW5vY29fcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBvcmlub2NvX3BjaV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wbHguYwppbmRleCA3ZjAwNmY2Li4zMTE2MmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMKQEAgLTM1MSw3ICszNTEsNyBAQAogc3RhdGljIGludCBfX2luaXQgb3Jpbm9jb19wbHhfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmb3Jpbm9jb19wbHhfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19wbHhfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9yaW5vY29fcGx4X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCmluZGV4IDA4MzE3MjEuLjdjN2I5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb190bWQuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBvcmlub2NvX3RtZF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZvcmlub2NvX3RtZF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX3RtZF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgb3Jpbm9jb190bWRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCmluZGV4IDA5ZmMxN2EuLmY2OTJkY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCiAJX19idWdfb25fd3Jvbmdfc3RydWN0X3NpemVzICgpOwogCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcHJpc201NF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTU0X2RyaXZlcik7CiB9CiAKIC8qIGJ5IHRoZSB0aW1lIHByaXNtNTRfbW9kdWxlX2V4aXQoKSB0ZXJtaW5hdGVzLCBhcyBhIHBvc3Rjb25kaXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKaW5kZXggODQ1OWExOC4uYjZiMjQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKKysrIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKQEAgLTE0MzQsNyArMTQzNCw3IEBACiAjaWZkZWYgTU9EVUxFCiAJcHJpbnRrKHZlcnNpb24pOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJnllbGxvd2Zpbl9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ5ZWxsb3dmaW5fZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYyBiL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCmluZGV4IDJkMjBjYWYuLmE5YmIzY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCkBAIC0xMjMsNyArMTIzLDggQEAKIAlpY2g2X3NhdGEJCT0gNCwKIAlpY2g2X3NhdGFfYWhjaQkJPSA1LAogCWljaDZtX3NhdGFfYWhjaQkJPSA2LAotCWljaDhfc2F0YV9haGNpCQk9IDcsCisJaWNoN21fc2F0YV9haGNpCQk9IDcsCisJaWNoOF9zYXRhX2FoY2kJCT0gOCwKIAogCS8qIGNvbnN0YW50cyBmb3IgbWFwcGluZyB0YWJsZSAqLwogCVAwCQkJPSAwLCAgLyogcG9ydCAwICovCkBAIC0xODgsNyArMTg5LDcgQEAKIAkvKiA4MjgwMUdCL0dSL0dIIChJQ0g3LCBpZGVudGljYWwgdG8gSUNINikgKi8KIAl7IDB4ODA4NiwgMHgyN2MwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g2X3NhdGFfYWhjaSB9LAogCS8qIDI4MDFHQk0vR0hNIChJQ0g3TSwgaWRlbnRpY2FsIHRvIElDSDZNKSAqLwotCXsgMHg4MDg2LCAweDI3YzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZtX3NhdGFfYWhjaSB9LAorCXsgMHg4MDg2LCAweDI3YzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDdtX3NhdGFfYWhjaSB9LAogCS8qIEVudGVycHJpc2UgU291dGhicmlkZ2UgMiAod2hlcmUncyB0aGUgZGF0YXNoZWV0PykgKi8KIAl7IDB4ODA4NiwgMHgyNjgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g2X3NhdGFfYWhjaSB9LAogCS8qIFNBVEEgQ29udHJvbGxlciAxIElERSAoSUNIOCwgbm8gZGF0YXNoZWV0IHlldCkgKi8KQEAgLTMzNiw2ICszMzcsMjQgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g3bV9tYXBfZGIgPSB7CisJLm1hc2sgPSAweDMsCisJLnBvcnRfZW5hYmxlID0gMHg1LAorCS5wcmVzZW50X3NoaWZ0ID0gNCwKKworCS8qIE1hcCAwMWIgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBkb2MgYnV0IHNvbWUgbm90ZWJvb2tzIHVzZQorCSAqIGl0IGFueXdheS4gIEFUTSwgdGhlIG9ubHkgY2FzZSBzcG90dGVkIGNhcnJpZXMgc3Vic3lzdGVtIElECisJICogMTAyNTowMTA3LiAgVGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20gaWNoNm0uCisJICovCisJLm1hcCA9IHsKKwkJLyogUE0gICBQUyAgIFNNICAgU1MgICAgICAgTUFQICovCisJCXsgIFAwLCAgUDIsICBSViwgIFJWIH0sIC8qIDAwYiAqLworCQl7IElERSwgSURFLCAgUDEsICBQMyB9LCAvKiAwMWIgKi8KKwkJeyAgUDAsICBQMiwgSURFLCBJREUgfSwgLyogMTBiICovCisJCXsgIFJWLCAgUlYsICBSViwgIFJWIH0sCisJfSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgaWNoOF9tYXBfZGIgPSB7CiAJLm1hc2sgPSAweDMsCiAJLnBvcnRfZW5hYmxlID0gMHgzLApAQCAtMzU1LDYgKzM3NCw3IEBACiAJW2ljaDZfc2F0YV0JCT0gJmljaDZfbWFwX2RiLAogCVtpY2g2X3NhdGFfYWhjaV0JPSAmaWNoNl9tYXBfZGIsCiAJW2ljaDZtX3NhdGFfYWhjaV0JPSAmaWNoNm1fbWFwX2RiLAorCVtpY2g3bV9zYXRhX2FoY2ldCT0gJmljaDdtX21hcF9kYiwKIAlbaWNoOF9zYXRhX2FoY2ldCT0gJmljaDhfbWFwX2RiLAogfTsKIApAQCAtNDQ0LDYgKzQ2NCwxOCBAQAogCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKIAl9LAogCisJLyogaWNoN21fc2F0YV9haGNpICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwKKwkJCQkgIFBJSVhfRkxBR19DSEVDS0lOVFIgfCBQSUlYX0ZMQUdfU0NSIHwKKwkJCQkgIFBJSVhfRkxBR19BSENJLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLworCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKKwl9LAorCiAJLyogaWNoOF9zYXRhX2FoY2kgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfbXYuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX212LmMKaW5kZXggMTA1M2M3Yy4uZmEzOGE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfbXYuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9tdi5jCkBAIC0xOTYxLDggKzE5NjEsNyBAQAogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDApOwogCWRvIHsKIAkJc2F0YV9zY3JfcmVhZChhcCwgU0NSX1NUQVRVUywgJnNzdGF0dXMpOwotCQlzc3RhdHVzICY9IDB4MzsKLQkJaWYgKChzc3RhdHVzID09IDMpIHx8IChzc3RhdHVzID09IDApKQorCQlpZiAoKChzc3RhdHVzICYgMHgzKSA9PSAzKSB8fCAoKHNzdGF0dXMgJiAweDMpID09IDApKQogCQkJYnJlYWs7CiAKIAkJX19tc2xlZXAoMSwgY2FuX3NsZWVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3ZpYS5jIGIvZHJpdmVycy9zY3NpL3NhdGFfdmlhLmMKaW5kZXggMDFkNDAzNi4uYTM3MjdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfdmlhLmMKQEAgLTc3LDYgKzc3LDcgQEAKIHN0YXRpYyB2b2lkIHZ0NjQyMF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3ZpYV9wY2lfdGJsW10gPSB7CisJeyAweDExMDYsIDB4MDU5MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgdnQ2NDIwIH0sCiAJeyAweDExMDYsIDB4MzE0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgdnQ2NDIwIH0sCiAJeyAweDExMDYsIDB4MzI0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgdnQ2NDIxIH0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IGFjYjI0YzYuLmEyYzU2YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpAQCAtMTQ0NCw3ICsxNDQ0LDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMgkJMHgwNDAyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDMJCTB4MDQwMwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA0CQkweDA0MDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwNAkJMHgwNDA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDUJCTB4MDQwNQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAwCQkweDA1MDAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMQkJMHgwNTAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDIJCTB4MDUwMgpAQCAtMTY1Nyw3ICsxNjU3LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwNCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDA1LCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzUwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAyLCBISURfUVVJUktfSUdOT1JFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jIGIvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYwppbmRleCAzYjE3NWFhLi5hMzM4YmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogc3RhdGljIGludCBpdG1fcmVhZF9kYXRhKHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50ICp4LCBpbnQgKnksIGludCAqdG91Y2gsIGludCAqcHJlc3MpCiB7CiAJKnggPSAoKHBrdFswXSAmIDB4MUYpIDw8IDcpIHwgKHBrdFszXSAmIDB4N0YpOwotCSp4ID0gKChwa3RbMV0gJiAweDFGKSA8PCA3KSB8IChwa3RbNF0gJiAweDdGKTsKKwkqeSA9ICgocGt0WzFdICYgMHgxRikgPDwgNykgfCAocGt0WzRdICYgMHg3Rik7CiAJKnByZXNzID0gKChwa3RbMl0gJiAweDFGKSA8PCA3KSB8IChwa3RbNV0gJiAweDdGKTsKIAkqdG91Y2ggPSB+cGt0WzddICYgMHgyMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwppbmRleCA3MzhiZDdjLi5lMTY1ODJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwpAQCAtMzQzNSw2ICszNDM1LDggQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHNpc3VzYl90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgwNzExLCAweDA5MDApIH0sCisJeyBVU0JfREVWSUNFKDB4MDcxMSwgMHgwOTAxKSB9LAorCXsgVVNCX0RFVklDRSgweDA3MTEsIDB4MDkwMikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxODJkLCAweDAyMWMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MTgyZCwgMHgwMjY5KSB9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCAxNTk0NWU4Li5jNjExNWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtNTA2LDYgKzUwNiw3IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1lFSV9TRVJWT0NFTlRFUjMxX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVEhPUkxBQlNfUElEKSB9LAogCXsgVVNCX0RFVklDRShURVNUT19WSUQsIFRFU1RPX1VTQl9JTlRFUkZBQ0VfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HQU1NQV9TQ09VVF9QSUQpIH0sCiAJeyB9LAkJCQkJLyogT3B0aW9uYWwgcGFyYW1ldGVyIGVudHJ5ICovCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKaW5kZXggODg4OGNkOC4uNzcyOTk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKQEAgLTQ2Nyw2ICs0NjcsMTEgQEAKICNkZWZpbmUgVEVTVE9fVklECQkJMHgxMjhECiAjZGVmaW5lIFRFU1RPX1VTQl9JTlRFUkZBQ0VfUElECQkweDAwMDEKIAorLyoKKyAqIEdhbW1hIFNjb3V0IChodHRwOi8vZ2FtbWEtc2NvdXQuY29tLykuIFN1Ym1pdHRlZCBieSByc2NAcnVudHV4LmNvbS4KKyAqLworI2RlZmluZSBGVERJX0dBTU1BX1NDT1VUX1BJRAkJMHhENjc4CS8qIEdhbW1hIFNjb3V0IG9ubGluZSAqLworCiAvKiBDb21tYW5kcyAqLwogI2RlZmluZSBGVERJX1NJT19SRVNFVCAJCTAgLyogUmVzZXQgdGhlIHBvcnQgKi8KICNkZWZpbmUgRlRESV9TSU9fTU9ERU1fQ1RSTCAJMSAvKiBTZXQgdGhlIG1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWNwbGQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWNwbGQuaAppbmRleCA1Njc1YjE3Li40MGU4ZTI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1jcGxkLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtY3BsZC5oCkBAIC05LDkgKzksNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX0FOVUJJU0NQTERfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1pcnEuaAppbmRleCA4MmYxNWRiLi40YjVmNDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1pcnEuaApAQCAtOSw5ICs5LDcgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgotICovCisqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfQU5VQklTSVJRX0gKICNkZWZpbmUgX19BU01fQVJDSF9BTlVCSVNJUlFfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtbWFwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1tYXAuaAppbmRleCBkNTI5ZmZkLi4wNThhMjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1tYXAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1tYXAuaApAQCAtOSw4ICs5LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgogKi8KIAogLyogbmVlZHMgYXJjaC9tYXAuaCBpbmNsdWRpbmcgd2l0aCB0aGlzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2F1ZGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2F1ZGlvLmgKaW5kZXggMGQyNzZlNi4uN2UwMjIyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hdWRpby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYXVkaW8uaApAQCAtOSwxMCArOSw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqCTIwLU5vdi0yMDA0IEJKRCAgQ3JlYXRlZCBmaWxlCi0gKgkwNy1NYXItMjAwNSBCSkQgIEFkZGVkIHN1c3BlbmQvcmVzdW1lIGNhbGxzCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfQVVESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LWNwbGQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYmFzdC1jcGxkLmgKaW5kZXggZTI4Y2E1MS4uODk2OWNmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LWNwbGQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtY3BsZC5oCkBAIC04LDExICs4LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgotICogIDI1LU1heS0yMDAzIEJKRCAgQ3JlYXRlZCBmaWxlLCBhZGRlZCBDVFJMMSByZWdpc3RlcnMKLSAqICAzMC1BdWctMjAwNCBCSkQgIFVwZGF0ZWQgZGVmaW5pdGlvbnMgZnJvbSAyLjQuMjYgcG9ydAotICogIDMwLUF1Zy0yMDA0IEJKRCAgQWRkZWQgQ1RSTDMgYW5kIENUUkw0IGRlZmluaXRpb25zCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfQkFTVENQTERfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LWlycS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LWlycS5oCmluZGV4IGI3OWI0N2YuLjE1ZmZhNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYmFzdC1pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtaXJxLmgKQEAgLTgsMTEgKzgsNyBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMTQtU2VwLTIwMDQgQkpEICBGaXhlZCBJUlFfVVNCT0MgZGVmaW5pdGlvbgotICogIDA2LUphbi0yMDAzIEJKRCAgTGludXggMi42LjAgdmVyc2lvbgotICovCisqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfQkFTVElSUV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfQkFTVElSUV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtbWFwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtbWFwLmgKaW5kZXggMjljMDdlMy4uNzI3Y2VmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LW1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYmFzdC1tYXAuaApAQCAtOCwxMCArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwNi1KYW4tMjAwMyBCSkQgIExpbnV4IDIuNi4wIHZlcnNpb24sIG1vdmVkIGJhc3Qgc3BlY2lmaWNzIGZyb20gYXJjaC9tYXAuaAotICogIDEyLU1hci0yMDA0IEJKRCAgRml4ZWQgaGVhZGVyIGluY2x1ZGUgcHJvdGVjdGlvbgogKi8KIAogLyogbmVlZHMgYXJjaC9tYXAuaCBpbmNsdWRpbmcgd2l0aCB0aGlzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtcG11LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2Jhc3QtcG11LmgKaW5kZXggNzU4YzVjNS4uODI4MzYwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9iYXN0LXBtdS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYmFzdC1wbXUuaApAQCAtOSw5ICs5LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgotICoJMDgtT2N0LTIwMDMJQkpECUluaXRpYWwgY3JlYXRpb24KICovCiAKICNpZm5kZWYgX19BU01fQVJDSF9CQVNUUE1VX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZGVidWctbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZGVidWctbWFjcm8uUwppbmRleCBiN2QxNWQxLi45MzA2NDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9kZWJ1Zy1tYWNyby5TCkBAIC0xMCw5ICsxMCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgICAgMTAtTWFyLTIwMDUgTENWUiAgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKICovCiAKICNpbmNsdWRlIDxhc20vYXJjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaAppbmRleCA0NzkwNDkxLi43MTE2MTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2ZiLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9mYi5oCkBAIC03LDEzICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKgkwNy1TZXAtMjAwNAlSVFAJQ3JlYXRlZCBmaWxlCi0gKgkwMy1Ob3YtMjAwNAlCSkQJVXBkYXRlZCBhbmQgbWlub3IgY2xlYW51cHMKLSAqCTAzLUF1Zy0yMDA1ICAgICBSVFAgICAgIFJlbmFtZWQgdG8gZmIuaAotICoJMjYtT2N0LTIwMDUJQkpECUNoYW5nZWQgbmFtZSBvZiBwbGF0ZGF0YSBpbml0CiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSTV9GQl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2hhcmR3YXJlLmgKaW5kZXggYTIzMzBiZi4uODcxZjhhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaGFyZHdhcmUuaApAQCAtOCwxNiArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAyMS1NYXktMjAwMyBCSkQgIENyZWF0ZWQgZmlsZQotICogIDA2LUp1bi0yMDAzIEJKRCAgQWRkZWQgQ1BVIGZyZXF1ZW5jeSBzZXR0aW5ncwotICogIDAzLVNlcC0yMDAzIEJKRCAgTGludXggdjIuNiBzdXBwb3J0Ci0gKiAgMTItTWFyLTIwMDQgQkpEICBGaXhlZCBpbmNsdWRlIHByb3RlY3Rpb24sIGZpeGVkIHR5cGUgb2YgY2xvY2sgdmFycwotICogIDE0LVNlcC0yMDA0IEJKRCAgQWRkZWQgbWlzY2NyIGFuZCBnZXRwaW4gdG8gZ3BpbwotICogIDAxLU9jdC0yMDA0IEJKRCAgQWRkZWQgdGhlIG5ldyBncGlvIGZ1bmN0aW9ucwotICogIDE2LU9jdC0yMDA0IEJKRCAgUmVtb3ZlZCB0aGUgY2xvY2sgdmFyaWFibGVzCi0gKiAgMTUtSmFuLTIwMDYgTENWUiBBZGRlZCBzM2MyNDAwX2dwaW9fZ2V0aXJxKCkKICovCiAKICNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2lkbGUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaWRsZS5oCmluZGV4IDc0OTIyN2MuLmVlZDQ1MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaWRsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaWRsZS5oCkBAIC04LDEwICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgQ1BVIElkbGUgY29udHJvbHMKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICoJMjgtT2N0LTIwMDQgIEJKRCAgSW5pdGlhbCB2ZXJzaW9uCi0gKgogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX0lETEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9paWMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaWljLmgKaW5kZXggNTE4NTQ3Zi4uZWQzZDZjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9paWMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2lpYy5oCkBAIC04LDEwICs4LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgotICoJMDUtT2N0LTIwMDQgQkpEICBDcmVhdGVkIGZpbGUKLSAqCTE5LU9jdC0yMDA0IEJKRAkgVXBkYXRlZCBmb3IgczNjMjQ0MAogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX0lJQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2lvLmgKaW5kZXggMTZmYmM4YS4uNmIzNWE0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaW8uaApAQCAtNCwxMyArNCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk3IFJ1c3NlbGwgS2luZwogICoJICAgICAoQykgMjAwMyBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCi0gKiBNb2RpZmljYXRpb25zOgotICogIDA2LURlYy0xOTk3CVJNSwlDcmVhdGVkLgotICogIDAyLVNlcC0yMDAzIEJKRAlNb2RpZmllZCBmb3IgUzNDMjQxMAotICogIDEwLU1hci0yMDA1IExDVlIJQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKLSAqICAxMy1PY3QtMjAwNSBCSkQJRml4ZWQgcHJvYmxlbXMgd2l0aCBMRFJIL1NUUkggb2Zmc2V0IHJhbmdlCi0gKi8KKyovCiAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2lycXMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaXJxcy5oCmluZGV4IGQ5NzczZDYuLjM5YTY5ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaXJxcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaXJxcy5oCkBAIC02LDE0ICs2LDcgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQ2hhbmdlbG9nOgotICogIDEyLU1heS0yMDAzIEJKRCAgQ3JlYXRlZCBmaWxlCi0gKiAgMDgtSmFuLTIwMDMgQkpEICBMaW51eCAyLjYuMCB2ZXJzaW9uLCBtb3ZlZCBCQVNUIGJpdHMgb3V0Ci0gKiAgMTItTWFyLTIwMDQgQkpEICBGaXhlZCBidWcgaW4gaGVhZGVyIHByb3RlY3Rpb24KLSAqICAxMC1GZWItMjAwNSBCSkQgIEFkZGVkIGNhbWVyYSBJUlEgZnJvbSBndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dgotICogIDI4LUZlYi0yMDA1IEJKRCAgVXBkYXRlZCBzM2MyNDQwIElSUXMKLSAqLworKi8KIAogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL21hcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9tYXAuaAppbmRleCBmYWUyNzY2Li4yN2JhMGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL21hcC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWFwLmgKQEAgLTgsMTMgKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMTItTWF5LTIwMDMgQkpEICAgQ3JlYXRlZCBmaWxlCi0gKiAgMDYtSmFuLTIwMDMgQkpEICAgTGludXggMi42LjAgdmVyc2lvbiwgbW92ZWQgYmFzdCBzcGVjaWZpY3Mgb3V0Ci0gKiAgMTAtRmViLTIwMDUgQkpEICAgQWRkZWQgQ0FNSUYgZGVmaW5pdGlvbiBmcm9tIGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2Ci0gKiAgMTAtTWFyLTIwMDUgTENWUiAgQWRkZWQgc3VwcG9ydCB0byBTM0MyNDAwLCBjaGFuZ2VkIHtWQSxTWn0gbmFtZXMKLSAqICAxNS1KYW4tMjAwNiBMQ1ZSICBBZGRlZCBTM0MyNFhYX1BBIG1hY3JvcyBmb3IgY29tbW9uIFMzQzI0WFggcmVzb3VyY2VzCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL21lbW9yeS5oCmluZGV4IDZhYjgzNGEuLjRiZTZhNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9tZW1vcnkuaApAQCAtMSw2ICsxLDQgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9tZW1vcnkuaAotICoKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWVtb3J5LmgKICAqICBmcm9tIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXJwYy9tZW1vcnkuaAogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4IFJ1c3NlbGwgS2luZy4KQEAgLTgsMTYgKzYsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAyMC1PY3QtMTk5NiBSTUsJQ3JlYXRlZAotICogICAzMS1EZWMtMTk5NyBSTUsJRml4ZWQgZGVmaW5pdGlvbnMgdG8gcmVkdWNlIHdhcm5pbmdzCi0gKiAgIDExLUphbi0xOTk4IFJNSwlVbmlubGluZWQgdG8gcmVkdWNlIGhpdHMgb24gY2FjaGUKLSAqICAgMDgtRmViLTE5OTggUk1LCUFkZGVkIF9fdmlydF90b19idXMgYW5kIF9fYnVzX3RvX3ZpcnQKLSAqICAgMjEtTWFyLTE5OTkgUk1LCVJlbmFtZWQgdG8gbWVtb3J5LmgKLSAqCQkgUk1LCUFkZGVkIFRBU0tfU0laRSBhbmQgUEFHRV9PRkZTRVQKLSAqICAgMDUtQXByLTIwMDQgQkpEICAgIENvcGllZCBhbmQgYWx0ZXJlZCBmb3IgYXJjaC1zM2MyNDEwCi0gKiAgIDE3LU1hci0yMDA1IExDVlIgICBNb2RpZmllZCBmb3IgUzNDMjQwMAogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL25hbmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbmFuZC5oCmluZGV4IDkxNDhhYzAuLmUzNTBhZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbmFuZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbmFuZC5oCkBAIC04LDkgKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgkyMy1TZXAtMjAwNCBCSkQgIENyZWF0ZWQgZmlsZQogKi8KIAogLyogc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvb3NpcmlzLW1hcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9vc2lyaXMtbWFwLmgKaW5kZXggN2M0YjBjZC4uZTJkNDA2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9vc2lyaXMtbWFwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9vc2lyaXMtbWFwLmgKQEAgLTksOCArOSw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKICovCiAKIC8qIG5lZWRzIGFyY2gvbWFwLmggaW5jbHVkaW5nIHdpdGggdGhpcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWFkYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWFkYy5oCmluZGV4IDE1YmZjMmYuLmM3YjkwYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1hZGMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtYWRjLmgKQEAgLTcsOSArNyw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCiAgKiBTM0MyNDEwIEFEQyByZWdpc3RlcnMKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAgMjctMDktMjAwNCAgICAgU0FIICAgICBDcmVhdGVkIGZpbGUKICovCiAKICNpZm5kZWYgX19BU01fQVJDSF9SRUdTX0FEQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtY2xvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCmluZGV4IGE3YzYxZmUuLmIyZjQ2OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCkBAIC04LDE4ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgY2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAgMTgtQXVnLTIwMDQgQmVuIERvb2tzICAgICAgICAgQWRkZWQgMjQ0MCBkZWZpbml0aW9ucwotICogICAgMDgtQXVnLTIwMDQgSGVyYmVydCBQ9nR6bCAgICAgQWRkZWQgQ0xLQ09OIGRlZmluaXRpb25zCi0gKiAgICAxOS0wNi0yMDAzICBCZW4gRG9va3MgICAgICAgICBDcmVhdGVkIGZpbGUKLSAqICAgIDEyLTAzLTIwMDQgIEJlbiBEb29rcyAgICAgICAgIFVwZGF0ZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAyOS1TZXAtMjAwNCBCZW4gRG9va3MJICAgIEZpeGVkIHVzYWdlIGZvciBhc3NlbWJseSBpbmNsdXNpb24KLSAqICAgIDEwLUZlYi0yMDA1IEJlbiBEb29rcwkgICAgRml4ZWQgQ0FNRElWTiBhZGRyZXNzIChHdWlsbGF1bWUgR291cmF0KQotICogICAgMTAtTWFyLTIwMDUgTHVjYXMgVmlsbGEgUmVhbCAgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKLSAqICAgIDI3LUF1Zy0yMDA1IEJlbiBEb29rcwkgICAgQWRkIGNsb2NrLXNsb3cgaW5mbwotICogICAgMjAtT2N0LTIwMDUgQmVuIERvb2tzCSAgICBGaXhlZCBvdmVyZmxvdyBpbiBQTEwgKEd1aWxsYXVtZSBHb3VyYXQpCi0gKiAgICAyMC1PY3QtMjAwNSBCZW4gRG9va3MJICAgIEFkZCBtYXNrcyBmb3IgRENMSyAoR3VpbGxhdW1lIEdvdXJhdCkKICovCiAKICNpZm5kZWYgX19BU01fQVJNX1JFR1NfQ0xPQ0sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpby5oCmluZGV4IDZkZDE3ZjBmLi45M2M0OTQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvLmgKQEAgLTgsMjEgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICogUzNDMjQxMCBHUElPIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDE5LTA2LTIwMDMgICAgIEJKRCAgICAgQ3JlYXRlZCBmaWxlCi0gKiAgICAyMy0wNi0yMDAzICAgICBCSkQgICAgIFVwZGF0ZWQgR1NUQVRVUyByZWdpc3RlcnMKLSAqICAgIDEyLTAzLTIwMDQgICAgIEJKRCAgICAgVXBkYXRlZCBpbmNsdWRlIHByb3RlY3Rpb24KLSAqICAgIDIwLTA3LTIwMDQgICAgIEJKRCAgICAgQWRkZWQgR1BJTyBwaW4gbnVtYmVycywgYWRkZWQgUG9ydCBBIGRlZmluaXRpb25zCi0gKiAgICAwNC0xMC0yMDA0ICAgICBCSkQgICAgIEZpeGVkIG51bWJlciBvZiBidWdzLCBhZGRlZCBFWFQgSVJRIGZpbHRlciBkZWZzCi0gKiAgICAxNy0xMC0yMDA0ICAgICBCSkQgICAgIEFkZGVkIEdTVEFUVVMxIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKiAgICAxOC0xMS0yMDA0ICAgICBCSkQgICAgIEZpeGVkIGRlZmluaXRpb25zIG9mIEdQRTMsIEdQRTQsIEdQRTUgYW5kIEdQRTYKLSAqICAgIDE4LTExLTIwMDQgICAgIEJKRCAgICAgQWRkZWQgUzNDMjQ0MCBBQzk3IGNvbnRyb2xzCi0gKiAgICAxMC1NYXItMjAwNSAgICBMQ1ZSICAgIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCi0gKiAgICAyOC1NYXItMjAwNSAgICBMQ1ZSICAgIEZpeGVkIGRlZmluaXRpb24gb2YgR1BCMTAKLSAqICAgIDI2LU9jdC0yMDA1ICAgIEJKRCAgICAgQWRkZWQgZ2VuZXJpYyBjb25maWd1cmF0aW9uIHR5cGVzCi0gKiAgICAyNy1Ob3YtMjAwNSAgICBMQ1ZSICAgIEFkZGVkIGRlZmluaXRpb25zIHRvIFMzQzI0MDAgcmVnaXN0ZXJzCi0gKiAgICAxNS1KYW4tMjAwNiAgICBMQ1ZSICAgIFdyaXR0ZW4gUzNDMjRYWF9HUElPX0JBU0UoKSBtYWNybwogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpb2ouaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvai5oCmluZGV4IDE4ZWRhZTUuLjkxY2VmYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvai5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvai5oCkBAIC04LDEwICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0NDAgR1BJTyBKIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDExLUF1Zy0yMDA0ICAgICBCSkQgICAgIENyZWF0ZWQgZmlsZQotICogICAgMTAtRmViLTIwMDUgICAgIEJKRCAgICAgRml4IEdQSjEyIGRlZmluaXRpb24gKEd1aWxsYXVtZSBHb3VyYXQpCiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1paWMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1paWMuaAppbmRleCBmZWQzMjg4Li4yYWUyOTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaWljLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWlpYy5oCkBAIC04LDEwICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgSTJDIENvbnRyb2xsZXIKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICoJMDMtT2N0LTIwMDQgIEJKRCAgSW5pdGlhbCBpbmNsdWRlIGZvciBMaW51eAotICoJMDgtTm92LTIwMDQgIEJKRCAgQWRkZWQgUzNDMjQ0MCBmaWx0ZXIgcmVnaXN0ZXIKICovCiAKICNpZm5kZWYgX19BU01fQVJDSF9SRUdTX0lJQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaWlzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaWlzLmgKaW5kZXggN2ZkZGU5Yi4uNzJjZDI1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWlpcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1paXMuaApAQCAtOCwxNyArOCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCiAgKiBTM0MyNDEwIElJUyByZWdpc3RlciBkZWZpbml0aW9uCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDE5LTA2LTIwMDMgICAgIEJKRCAgICAgQ3JlYXRlZCBmaWxlCi0gKiAgICAyNi0wNi0yMDAzICAgICBCSkQgICAgIEZpbmlzaGVkIG9mZiBkZWZpbml0aW9ucyBmb3IgcmVnaXN0ZXIgYWRkcmVzc2VzCi0gKiAgICAxMi0wMy0yMDA0ICAgICBCSkQgICAgIFVwZGF0ZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAwNy0wMy0yMDA1ICAgICBCSkQgICAgIEFkZGVkIEZJRk8gc2l6ZSBmbGFncyBhbmQgUzNDMjQ0MCBNUExMCi0gKiAgICAwNS0wNC0yMDA1ICAgICBMQ1ZSICAgIEFkZGVkIElJU0ZDT04gZGVmaW5pdGlvbnMgZm9yIHRoZSBTM0MyNDAwCi0gKiAgICAxOC0wNy0yMDA1ICAgICBEQSAgICAgIENoYW5nZSBJSVNDT05fTVBMTCB0byBJSVNNT0RfTVBMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JyZWN0IElJU01PRF8yNTZGUyBhbmQgSUlTTU9EXzM4NEZTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBJSVNDT05fUFNDRU4KLSAqLworKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfSUlTX0gKICNkZWZpbmUgX19BU01fQVJDSF9SRUdTX0lJU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaXJxLmgKaW5kZXggNTcyZmNhNS4uMjlmYjhlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWlycS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1pcnEuaApAQCAtNiwxNCArNiw3IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDE5LTA2LTIwMDMgICAgIEJKRCAgICAgQ3JlYXRlZCBmaWxlCi0gKiAgICAxMi0wMy0yMDA0ICAgICBCSkQgICAgIFVwZGF0ZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAxMC0wMy0yMDA1ICAgICBMQ1ZSICAgIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCi0gKi8KKyovCiAKIAogI2lmbmRlZiBfX19BU01fQVJDSF9SRUdTX0lSUV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbGNkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbGNkLmgKaW5kZXggYjZiMWI0ZS4uYjMwNmQ2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWxjZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1sY2QuaApAQCAtNiwxNCArNiw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDEyLTA2LTIwMDMgICAgIEJKRCAgICAgQ3JlYXRlZCBmaWxlCi0gKiAgICAyNi0wNi0yMDAzICAgICBCSkQgICAgIFVwZGF0ZWQgTENEQ09OIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKiAgICAxMi0wMy0yMDA0ICAgICBCSkQgICAgIFVwZGF0ZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAxMC0wMy0yMDA1ICAgICBMQ1ZSICAgIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1tZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1tZW0uaAppbmRleCBhMmQ3ZDBjLi4zNzVkY2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbWVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLW1lbS5oCkBAIC04LDEyICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgTWVtb3J5IENvbnRyb2wgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICoJMjktU2VwLTIwMDQgIEJKRCAgSW5pdGlhbCBpbmNsdWRlIGZvciBMaW51eAotICogICAgICAxMC1NYXItMjAwNSAgTENWUiBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQotICogICAgICAwNC1BcHItMjAwNSAgTENWUiBBZGRlZCBTM0MyNDAwIERSQU0vQkFOS1NJWkVfTUFTSyBkZWZpbml0aW9ucwotICoKICovCiAKICNpZm5kZWYgX19BU01fQVJNX01FTVJFR1NfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLW5hbmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1uYW5kLmgKaW5kZXggYzE0NzBjNi4uYjgyNGQzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLW5hbmQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbmFuZC5oCkBAIC04LDEwICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgTkFORCByZWdpc3RlciBkZWZpbml0aW9ucwotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKiAgICAxOC1BdWctMjAwNCAgICBCSkQgICAgIENvcGllZCBmaWxlIGZyb20gMi40IGFuZCB1cGRhdGVkCi0gKiAgICAwMS1NYXktMjAwNSAgICBCSkQgICAgIEFkZGVkIGRlZmluaXRpb25zIGZvciBzM2MyNDQwIGNvbnRyb2xsZXIKICovCiAKICNpZm5kZWYgX19BU01fQVJNX1JFR1NfTkFORApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXJ0Yy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXJ0Yy5oCmluZGV4IDBmYmVjMDcuLmNkODhmZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ydGMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtcnRjLmgKQEAgLTgsMTEgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICogUzNDMjQxMCBJbnRlcm5hbCBSVEMgcmVnaXN0ZXIgZGVmaW5pdGlvbgotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKiAgICAxOS0wNi0yMDAzICAgICBCSkQgICAgIENyZWF0ZWQgZmlsZQotICogICAgMTItMDMtMjAwNCAgICAgQkpEICAgICBVcGRhdGVkIGluY2x1ZGUgcHJvdGVjdGlvbgotICogICAgMTUtMDEtMjAwNSAgICAgTENWUiAgICBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQSAoczNjMjQwMCBzdXBwb3J0KQogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfUlRDX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zZGkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zZGkuaAppbmRleCBjYTlhMjZmLi4wNmU3MTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtc2RpLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNkaS5oCkBAIC04LDExICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgTU1DL1NESU8gcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAgMTgtQXVnLTIwMDQgQmVuIERvb2tzICAgICAgQ3JlYXRlZCBpbml0aWFsIGZpbGUKLSAqICAgIDI5LU5vdi0yMDA0IEtvZW4gTWFydGVucyAgIEFkZGVkIHNvbWUgbWlzc2luZyBkZWZpbmVzLCBmaXhlZCBkdXBsaWNhdGVzCi0gKiAgICAyOS1Ob3YtMjAwNCBCZW4gRG9va3MJIFVwZGF0ZWQgS29lbidzIHBhdGNoCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSTV9SRUdTX1NESQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNlcmlhbC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNlcmlhbC5oCmluZGV4IDkzZjY1MWEuLjE5Yzc3ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtc2VyaWFsLmgKQEAgLTI3LDEwICsyNyw3IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKiBNb2RpZmljYXRpb25zOgotICogICAgIDEwLU1hci0yMDA1IExDVlIgIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBIChzM2MyNDAwIHN1cHBvcnQpCi0gKi8KKyovCiAKICNpZm5kZWYgX19BU01fQVJNX1JFR1NfU0VSSUFMX0gKICNkZWZpbmUgX19BU01fQVJNX1JFR1NfU0VSSUFMX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zcGkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zcGkuaAppbmRleCAzMzgyMTc4Li4zNTUyMjgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtc3BpLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNwaS5oCkBAIC03LDEzICs3LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgU1BJIHJlZ2lzdGVyIGRlZmluaXRpb24KLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAgMjAtMDQtMjAwNCAgICAgS0YgICAgICBDcmVhdGVkIGZpbGUKLSAqICAgIDA0LTEwLTIwMDQgICAgIEJKRCAgICAgUmVtb3ZlZCBWQSBhZGRyZXNzIChubyBsb25nZXIgbWFwcGVkKQotICoJCQkgICAgIHRpZGllZCBmaWxlIGZvciBzdWJtaXNzaW9uCi0gKiAgICAwMy0wNC0yMDA1ICAgICBMQ1ZSICAgIEFkZGVkIFMzQzI0MDBfU1BQSU5fbkNTIGRlZmluaXRpb24KLSAqLworKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfU1BJX0gKICNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1NQSV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtdGltZXIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy10aW1lci5oCmluZGV4IDE2OTA2NGUuLjczMTkxOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy10aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy10aW1lci5oCkBAIC04LDEzICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFMzQzI0MTAgVGltZXIgY29uZmlndXJhdGlvbgotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKiAgICAwNS0wNi0yMDAzICAgICBCSkQgICAgIENyZWF0ZWQgZmlsZQotICogICAgMjYtMDYtMjAwMyAgICAgQkpEICAgICBBZGRlZCBtb3JlIHRpbWVyIGRlZmluaXRpb25zIHRvIG11eCAvIGNvbnRyb2wKLSAqICAgIDEyLTAzLTIwMDQgICAgIEJKRCAgICAgVXBkYXRlZCBpbmNsdWRlIHByb3RlY3Rpb24KLSAqICAgIDEwLTAyLTIwMDUgICAgIEJKRCAgICAgQWRkZWQgUzNDMjQxMF9UQ0ZHMV9NVVg0X1NISUZUIChHdWlsbGF1bWUgR291cmF0KQotICogICAgMTAtMDMtMjAwNSAgICAgTENWUiAgICBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtdWRjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtdWRjLmgKaW5kZXggYmYzMTViNy4uM2FhMzFhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXVkYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy11ZGMuaApAQCAtNiwxMyArNiw3IEBACiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKiAgICAwMS0wOC0yMDA0CUluaXRpYWwgY3JlYXRpb24KLSAqICAgIDEyLTA5LTIwMDQJQ2xlYW51cCBmb3Igc3VibWlzc2lvbgotICogICAgMjQtMTAtMjAwNAlGaXhlZCBTM0MyNDEwX1VEQ19NQVhQX1JFRyBkZWZpbml0aW9uCi0gKiAgICAxMC0wMy0yMDA1CUNoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCi0gKi8KKyovCiAKICNpZm5kZWYgX19BU01fQVJDSF9SRUdTX1VEQ19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19VRENfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXdhdGNoZG9nLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtd2F0Y2hkb2cuaAppbmRleCBkMTk5Y2E2Li5mNGZmZjQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtd2F0Y2hkb2cuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtd2F0Y2hkb2cuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtL2FyY2gtczNjMjQxMC9yZWdzMHdhdGNoZG9nLmgKKy8qIGxpbnV4L2luY2x1ZGUvYXNtL2FyY2gtczNjMjQxMC9yZWdzLXdhdGNoZG9nLmgKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2ltdGVjIEVsZWN0cm9uaWNzIDxsaW51eEBzaW10ZWMuY28udWs+CiAgKgkJICAgICAgaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KQEAgLTgsMTEgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICogUzNDMjQxMCBXYXRjaGRvZyB0aW1lciBjb250cm9sCi0gKgotICogIENoYW5nZWxvZzoKLSAqICAgIDIxLTA2LTIwMDMgICAgIEJKRCAgICAgQ3JlYXRlZCBmaWxlCi0gKiAgICAxMi0wMy0yMDA0ICAgICBCSkQgICAgIFVwZGF0ZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAxMC0wMy0yMDA1ICAgICBMQ1ZSICAgIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3N5c3RlbS5oCmluZGV4IDliMGQ4NTAuLjcxODI0NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9zeXN0ZW0uaApAQCAtOCwxNCArOCw3IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAxMi1NYXktMjAwMyBCSkQgIENyZWF0ZWQgZmlsZQotICogIDE0LU1heS0yMDAzIEJKRCAgUmVtb3ZlZCBpZGxlIHRvIGFpZCBkZWJ1Z2dpbmcKLSAqICAxMi1KdW4tMjAwMyBCSkQgIEFkZGVkIHJlc2V0IHZpYSB3YXRjaGRvZwotICogIDA0LVNlcC0yMDAzIEJKRCAgTW92ZWQgdG8gdjIuNgotICogIDI4LU9jdC0yMDA0IEJKRCAgQWRkZWQgb3Zlci1yaWRlIGZvciBpZGxlLCBhbmQgZml4ZWQgcmVzZXQgcGFuaWMoKQotICovCisqLwogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3RpbWV4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3RpbWV4LmgKaW5kZXggMzU1OGEzYS4uNzAzYzMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC90aW1leC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdGltZXguaApAQCAtOCwxMiArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwMi1TZXAtMjAwMyBCSkQgIENyZWF0ZWQgZmlsZQotICogIDA1LUphbi0yMDA0IEJKRCAgVXBkYXRlZCBmb3IgTGludXggMi42LjAKLSAqICAyMi1Ob3YtMjAwNCBCSkQgIEZpeGVkIENMT0NLX1RJQ0tfUkFURQotICogIDEwLUphbi0yMDA0IEJKRCAgUmVtb3ZlZCBzM2MyNDEwX2Nsb2NrX3RpY2tfcmF0ZQogKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVYX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdW5jb21wcmVzcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC91bmNvbXByZXNzLmgKaW5kZXggOGUxNTJhMC4uODFiM2U5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC91bmNvbXByZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC91bmNvbXByZXNzLmgKQEAgLTgsMTUgKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMjItTWF5LTIwMDMgQkpEICBDcmVhdGVkCi0gKiAgMDgtU2VwLTIwMDMgQkpEICBNb3ZlZCB0byBsaW51eCB2Mi42Ci0gKiAgMTItTWFyLTIwMDQgQkpEICBVcGRhdGVkIGhlYWRlciBwcm90ZWN0aW9uCi0gKiAgMTItT2N0LTIwMDQgQkpEICBUYWtlIGFjY291bnQgb2YgZGVidWcgdWFydCBjb25maWd1cmF0aW9uCi0gKiAgMTUtTm92LTIwMDQgQkpEICBGaXhlZCB1YXJ0IGNvbmZpZ3VyYXRpb24KLSAqICAyMi1GZWItMjAwNSBCSkQgIEFkZGVkIHdhdGNoZG9nIHRvIHVuY29tcHJlc3MKLSAqICAwNC1BcHItMjAwNSBMQ1ZSIEFkZGVkIHN1cHBvcnQgdG8gUzNDMjQwMCAobm8gY3B1aWQgYXQgR1NUQVRVUzEpCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3VzYi1jb250cm9sLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3VzYi1jb250cm9sLmgKaW5kZXggYmQ0M2I1Ni4uMzU3MjM1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC91c2ItY29udHJvbC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdXNiLWNvbnRyb2wuaApAQCAtOCwxMSArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAxMS1TZXAtMjAwNCBCSkQgIENyZWF0ZWQgZmlsZQotICogIDIxLVNlcC0yMDA0IEJKRCAgVXBkYXRlZCBwb3J0IGluZm8KLSAqICAwOS1BdWctMjAwNSBCSkQgIFJlbmFtZWQgczNjMjQxMF9yZXBvcnRfb2MgczNjMjQxMF91c2JfcmVwb3J0X29jCiAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfVVNCQ09OVFJPTF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3ZtYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdm1hbGxvYy5oCmluZGV4IDMzOTYzY2QuLjBhZTNiZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdm1hbGxvYy5oCkBAIC0xMCwxMSArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICogUzNDMjQxMCB2bWFsbG9jIGRlZmluaXRpb24KLSAqCi0gKiAgQ2hhbmdlbG9nOgotICogICAgMTItTWFyLTIwMDQgQkpECUZpeGVkIGhlYWRlciwgYWRkZWQgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgICAxMj1NYXItMjAwNCBCSkQJRml4ZWQgVk1BTExPQ19FTkQgZGVmaW5pdGlvbnMKLSAqLworKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1ZNQUxMT0NfSAogI2RlZmluZSBfX0FTTV9BUkNIX1ZNQUxMT0NfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtY3BsZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtY3BsZC5oCmluZGV4IDBlZTM3M2EuLmEzNDFiMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdnIxMDAwLWNwbGQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3ZyMTAwMC1jcGxkLmgKQEAgLTgsMTAgKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMjUtTWF5LTIwMDMgQkpEICBDcmVhdGVkIGZpbGUsIGFkZGVkIENUUkwxIHJlZ2lzdGVycwotICogIDE5LU1hci0yMDA0IEJKRCAgQWRkZWQgVlIxMDAwIENQTEQgZGVmaW5pdGlvbnMKICovCiAKICNpZm5kZWYgX19BU01fQVJDSF9WUjEwMDBDUExEX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdnIxMDAwLWlycS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtaXJxLmgKaW5kZXggNjk0Zjc3MS4uYzM5YTBmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtaXJxLmgKQEAgLTgsMTEgKzgsNyBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMDYtSmFuLTIwMDMgQkpEICBMaW51eCAyLjYuMCB2ZXJzaW9uCi0gKiAgMTktTWFyLTIwMDQgQkpEICBVcGRhdGVzIGZvciBWUjEwMDAKLSAqLworKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX1ZSMTAwMElSUV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVlIxMDAwSVJRX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvdnIxMDAwLW1hcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtbWFwLmgKaW5kZXggODY3YzkzNS4uMWZlNGRiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtbWFwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC92cjEwMDAtbWFwLmgKQEAgLTgsMTIgKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMDYtSmFuLTIwMDMgQkpEICBMaW51eCAyLjYuMCB2ZXJzaW9uLCBzcGxpdCBzcGVjaWZpY3MgZnJvbSBhcmNoL21hcC5oCi0gKiAgMTItTWFyLTIwMDQgQkpEICBGaXhlZCBoZWFkZXIgaW5jbHVkZSBwcm90ZWN0aW9uCi0gKiAgMTktTWFyLTIwMDQgQkpEICBDb3BpZWQgdG8gVlIxMDAwIG1hY2hpbmUgaGVhZGVycy4KLSAqICAxOS1KYW4tMjAwNSBCSkQgIFVwZGF0ZWQgbWFwIGRlZmluaXRpb25zCiAqLwogCiAvKiBuZWVkcyBhcmNoL21hcC5oIGluY2x1ZGluZyB3aXRoIHRoaXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrLmgKaW5kZXggZTJmMWQ3NS4uMDFiN2MyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKLQl1bnNpZ25lZCBsb25nIHRtcCB0bXAyID0gMTsKKwl1bnNpZ25lZCBsb25nIHRtcCwgdG1wMiA9IDE7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIxOglsZHJleAklMCwgWyUyXVxuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdWRpdF9yZWFkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2F1ZGl0X3JlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg3NDY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdWRpdF9yZWFkLmgKQEAgLTAsMCArMSw4IEBACitfX05SX3JlYWRsaW5rLAorX19OUl9xdW90YWN0bCwKK19fTlJfbGlzdHhhdHRyLAorX19OUl9sbGlzdHhhdHRyLAorX19OUl9mbGlzdHhhdHRyLAorX19OUl9nZXR4YXR0ciwKK19fTlJfbGdldHhhdHRyLAorX19OUl9mZ2V0eGF0dHIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F1ZGl0X3dyaXRlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2F1ZGl0X3dyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwZDM2NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXVkaXRfd3JpdGUuaApAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfZGlyX3dyaXRlLmg+CitfX05SX2FjY3QsCitfX05SX3N3YXBvbiwKK19fTlJfcXVvdGFjdGwsCitfX05SX3RydW5jYXRlLAorI2lmZGVmIF9fTlJfdHJ1bmNhdGU2NAorX19OUl90cnVuY2F0ZTY0LAorI2VuZGlmCisjaWZkZWYgX19OUl9iaW5kCitfX05SX2JpbmQsCQkvKiBiaW5kIGNhbiBhZmZlY3QgZnMgb2JqZWN0IG9ubHkgaW4gb25lIHdheS4uLiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggNjRmOWY5ZS4uNDBhNmMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtMTMyLDYgKzEzMiwxMCBAQAogI2RlZmluZSBBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIgMQogI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFIgMgogI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFJfMzIgMworI2RlZmluZSBBVURJVF9DTEFTU19SRUFEIDQKKyNkZWZpbmUgQVVESVRfQ0xBU1NfUkVBRF8zMiA1CisjZGVmaW5lIEFVRElUX0NMQVNTX1dSSVRFIDYKKyNkZWZpbmUgQVVESVRfQ0xBU1NfV1JJVEVfMzIgNwogCiAvKiBUaGlzIGJpdG1hc2sgaXMgdXNlZCB0byB2YWxpZGF0ZSB1c2VyIGlucHV0LiAgSXQgcmVwcmVzZW50cyBhbGwgYml0cyB0aGF0CiAgKiBhcmUgY3VycmVudGx5IHVzZWQgaW4gYW4gYXVkaXQgZmllbGQgY29uc3RhbnQgdW5kZXJzdG9vZCBieSB0aGUga2VybmVsLgpAQCAtMTc3LDYgKzE4MSw3IEBACiAjZGVmaW5lIEFVRElUX0VYSVQJMTAzCiAjZGVmaW5lIEFVRElUX1NVQ0NFU1MgICAxMDQJLyogZXhpdCA+PSAwOyB2YWx1ZSBpZ25vcmVkICovCiAjZGVmaW5lIEFVRElUX1dBVENICTEwNQorI2RlZmluZSBBVURJVF9QRVJNCTEwNgogCiAjZGVmaW5lIEFVRElUX0FSRzAgICAgICAyMDAKICNkZWZpbmUgQVVESVRfQVJHMSAgICAgIChBVURJVF9BUkcwKzEpCkBAIC0yNTIsNiArMjU3LDExIEBACiAjZGVmaW5lIEFVRElUX0FSQ0hfVjg1MAkJKEVNX1Y4NTB8X19BVURJVF9BUkNIX0xFKQogI2RlZmluZSBBVURJVF9BUkNIX1g4Nl82NAkoRU1fWDg2XzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCiAKKyNkZWZpbmUgQVVESVRfUEVSTV9FWEVDCQkxCisjZGVmaW5lIEFVRElUX1BFUk1fV1JJVEUJMgorI2RlZmluZSBBVURJVF9QRVJNX1JFQUQJCTQKKyNkZWZpbmUgQVVESVRfUEVSTV9BVFRSCQk4CisKIHN0cnVjdCBhdWRpdF9zdGF0dXMgewogCV9fdTMyCQltYXNrOwkJLyogQml0IG1hc2sgZm9yIHZhbGlkIGVudHJpZXMgKi8KIAlfX3UzMgkJZW5hYmxlZDsJLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLwpAQCAtMzE0LDYgKzMyNCw3IEBACiAjZGVmaW5lIEFVRElUU0NfRkFJTFVSRSAyCiAjZGVmaW5lIEFVRElUU0NfUkVTVUxUKHgpICggKChsb25nKSh4KSk8MD9BVURJVFNDX0ZBSUxVUkU6QVVESVRTQ19TVUNDRVNTICkKIGV4dGVybiBpbnQgX19pbml0IGF1ZGl0X3JlZ2lzdGVyX2NsYXNzKGludCBjbGFzcywgdW5zaWduZWQgKmxpc3QpOworZXh0ZXJuIGludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpOwogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIC8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIGF1ZGl0c2MuYyAqLwogCQkJCS8qIFB1YmxpYyBBUEkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCBjMWYwMjFlLi5iYTA5NWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC03Nyw3ICs3Nyw3IEBACiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlCWNsYXNzX2RldjsKIAlpbnQJCQlpbmRleDsKLQlzdHJ1Y3QgbW1jX2hvc3Rfb3BzCSpvcHM7CisJY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyAqb3BzOwogCXVuc2lnbmVkIGludAkJZl9taW47CiAJdW5zaWduZWQgaW50CQlmX21heDsKIAl1MzIJCQlvY3JfYXZhaWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IDAzYTE0YTMuLjYyN2UyYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCkBAIC0xMDUsNiArMTA1LDggQEAKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHVuc2lnbmVkIGludCwKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKIAorZXh0ZXJuIHZvaWQgbW1jX3NldF9kYXRhX3RpbWVvdXQoc3RydWN0IG1tY19kYXRhICosIGNvbnN0IHN0cnVjdCBtbWNfY2FyZCAqLCBpbnQpOworCiBleHRlcm4gaW50IF9fbW1jX2NsYWltX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2NsYWltX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KQpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCAwYTM2MDkxLi45NjNmZDE1IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtMTAyOCw2ICsxMDI4LDkgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpoZXggPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CiAKKwlpZiAoIWFiKQorCQlyZXR1cm47CisKIAlCVUdfT04oIWFiLT5za2IpOwogCXNrYiA9IGFiLT5za2I7CiAJYXZhaWwgPSBza2JfdGFpbHJvb20oc2tiKTsKQEAgLTEwNjAsNiArMTA2Myw5IEBACiAJdW5zaWduZWQgY2hhciAqcHRyOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKKwlpZiAoIWFiKQorCQlyZXR1cm47CisKIAlCVUdfT04oIWFiLT5za2IpOwogCXNrYiA9IGFiLT5za2I7CiAJYXZhaWwgPSBza2JfdGFpbHJvb20oc2tiKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5oIGIva2VybmVsL2F1ZGl0LmgKaW5kZXggNmFhMzNiOC4uYTMzNzAyMyAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmgKKysrIGIva2VybmVsL2F1ZGl0LmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCXJldHVybiAoaW5vICYgKEFVRElUX0lOT0RFX0JVQ0tFVFMtMSkpOwogfQogCitleHRlcm4gaW50IGF1ZGl0X21hdGNoX2NsYXNzKGludCBjbGFzcywgdW5zaWduZWQgc3lzY2FsbCk7CiBleHRlcm4gaW50IGF1ZGl0X2NvbXBhcmF0b3IoY29uc3QgdTMyIGxlZnQsIGNvbnN0IHUzMiBvcCwgY29uc3QgdTMyIHJpZ2h0KTsKIGV4dGVybiBpbnQgYXVkaXRfY29tcGFyZV9kbmFtZV9wYXRoKGNvbnN0IGNoYXIgKmRuYW1lLCBjb25zdCBjaGFyICpwYXRoLAogCQkJCSAgICBpbnQgKmRpcmxlbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRmaWx0ZXIuYyBiL2tlcm5lbC9hdWRpdGZpbHRlci5jCmluZGV4IDZhOWE1YzVhLi5hNDQ4NzliIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRmaWx0ZXIuYworKysgYi9rZXJuZWwvYXVkaXRmaWx0ZXIuYwpAQCAtMzAyLDYgKzMwMiwxNSBAQAogCXJldHVybiAwOwogfQogCitpbnQgYXVkaXRfbWF0Y2hfY2xhc3MoaW50IGNsYXNzLCB1bnNpZ25lZCBzeXNjYWxsKQoreworCWlmICh1bmxpa2VseShzeXNjYWxsID49IEFVRElUX0JJVE1BU0tfU0laRSAqIHNpemVvZihfX3UzMikpKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkoY2xhc3MgPj0gQVVESVRfU1lTQ0FMTF9DTEFTU0VTIHx8ICFjbGFzc2VzW2NsYXNzXSkpCisJCXJldHVybiAwOworCXJldHVybiBjbGFzc2VzW2NsYXNzXVtBVURJVF9XT1JEKHN5c2NhbGwpXSAmIEFVRElUX0JJVChzeXNjYWxsKTsKK30KKwogLyogQ29tbW9uIHVzZXItc3BhY2UgdG8ga2VybmVsIHJ1bGUgdHJhbnNsYXRpb24uICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpdF9lbnRyeSAqYXVkaXRfdG9fZW50cnlfY29tbW9uKHN0cnVjdCBhdWRpdF9ydWxlICpydWxlKQogewpAQCAtNDA0LDYgKzQxMyw3IEBACiAJCWNhc2UgQVVESVRfUEVSUzoKIAkJY2FzZSBBVURJVF9BUkNIOgogCQljYXNlIEFVRElUX01TR1RZUEU6CisJCWNhc2UgQVVESVRfUFBJRDoKIAkJY2FzZSBBVURJVF9ERVZNQUpPUjoKIAkJY2FzZSBBVURJVF9ERVZNSU5PUjoKIAkJY2FzZSBBVURJVF9FWElUOgpAQCAtNDEzLDYgKzQyMywxMCBAQAogCQljYXNlIEFVRElUX0FSRzI6CiAJCWNhc2UgQVVESVRfQVJHMzoKIAkJCWJyZWFrOworCQljYXNlIEFVRElUX1BFUk06CisJCQlpZiAoZi0+dmFsICYgfjE1KQorCQkJCWdvdG8gZXhpdF9mcmVlOworCQkJYnJlYWs7CiAJCWNhc2UgQVVESVRfSU5PREU6CiAJCQllcnIgPSBhdWRpdF90b19pbm9kZSgmZW50cnktPnJ1bGUsIGYpOwogCQkJaWYgKGVycikKQEAgLTU2Nyw2ICs1ODEsMTAgQEAKIAkJCWVudHJ5LT5ydWxlLmJ1ZmxlbiArPSBmLT52YWw7CiAJCQllbnRyeS0+cnVsZS5maWx0ZXJrZXkgPSBzdHI7CiAJCQlicmVhazsKKwkJY2FzZSBBVURJVF9QRVJNOgorCQkJaWYgKGYtPnZhbCAmIH4xNSkKKwkJCQlnb3RvIGV4aXRfZnJlZTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ290byBleGl0X2ZyZWU7CiAJCX0KQEAgLTkxMyw3ICs5MzEsNyBAQAogCQl9CiAKIAkJYWIgPSBhdWRpdF9sb2dfc3RhcnQoTlVMTCwgR0ZQX0tFUk5FTCwgQVVESVRfQ09ORklHX0NIQU5HRSk7Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJhdWRpdCB1cGRhdGVkIHJ1bGVzIHNwZWNpZnlpbmcgd2F0Y2g9Iik7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJhdWRpdCB1cGRhdGVkIHJ1bGVzIHNwZWNpZnlpbmcgcGF0aD0iKTsKIAkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgb3dhdGNoLT5wYXRoKTsKIAkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiB3aXRoIGRldj0ldSBpbm89JWx1XG4iLCBkZXYsIGlubyk7CiAJCWF1ZGl0X2xvZ19lbmQoYWIpOwpAQCAtOTM2LDE5ICs5NTQsMjggQEAKIAlzdHJ1Y3QgYXVkaXRfd2F0Y2ggKncsICpuZXh0dzsKIAlzdHJ1Y3QgYXVkaXRfa3J1bGUgKnIsICpuZXh0cjsKIAlzdHJ1Y3QgYXVkaXRfZW50cnkgKmU7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWI7CiAKIAltdXRleF9sb2NrKCZhdWRpdF9maWx0ZXJfbXV0ZXgpOwogCXBhcmVudC0+ZmxhZ3MgfD0gQVVESVRfUEFSRU5UX0lOVkFMSUQ7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHcsIG5leHR3LCAmcGFyZW50LT53YXRjaGVzLCB3bGlzdCkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgbmV4dHIsICZ3LT5ydWxlcywgcmxpc3QpIHsKIAkJCWUgPSBjb250YWluZXJfb2Yociwgc3RydWN0IGF1ZGl0X2VudHJ5LCBydWxlKTsKKworCQkJYWIgPSBhdWRpdF9sb2dfc3RhcnQoTlVMTCwgR0ZQX0tFUk5FTCwgQVVESVRfQ09ORklHX0NIQU5HRSk7CisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiYXVkaXQgaW1wbGljaXRseSByZW1vdmVkIHJ1bGUgcGF0aD0iKTsKKwkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIHctPnBhdGgpOworCQkJaWYgKHItPmZpbHRlcmtleSkgeworCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIga2V5PSIpOworCQkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIHItPmZpbHRlcmtleSk7CisJCQl9IGVsc2UKKwkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGtleT0obnVsbCkiKTsKKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbGlzdD0lZCIsIHItPmxpc3Rucik7CisJCQlhdWRpdF9sb2dfZW5kKGFiKTsKKwogCQkJbGlzdF9kZWwoJnItPnJsaXN0KTsKIAkJCWxpc3RfZGVsX3JjdSgmZS0+bGlzdCk7CiAJCQljYWxsX3JjdSgmZS0+cmN1LCBhdWRpdF9mcmVlX3J1bGVfcmN1KTsKLQotCQkJYXVkaXRfbG9nKE5VTEwsIEdGUF9LRVJORUwsIEFVRElUX0NPTkZJR19DSEFOR0UsCi0JCQkJICJhdWRpdCBpbXBsaWNpdGx5IHJlbW92ZWQgcnVsZSBmcm9tIGxpc3Q9JWRcbiIsCi0JCQkJICBBVURJVF9GSUxURVJfRVhJVCk7CiAJCX0KIAkJYXVkaXRfcmVtb3ZlX3dhdGNoKHcpOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IGVmYzFiNzQuLjFiZDg4MjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtMjA5LDYgKzIwOSw1NCBAQAogI2VuZGlmCiB9OwogCisjZGVmaW5lIEFDQ19NT0RFKHgpICgiXDAwNFwwMDJcMDA2XDAwNiJbKHgpJk9fQUNDTU9ERV0pCitzdGF0aWMgaW5saW5lIGludCBvcGVuX2FyZyhpbnQgZmxhZ3MsIGludCBtYXNrKQoreworCWludCBuID0gQUNDX01PREUoZmxhZ3MpOworCWlmIChmbGFncyAmIChPX1RSVU5DIHwgT19DUkVBVCkpCisJCW4gfD0gQVVESVRfUEVSTV9XUklURTsKKwlyZXR1cm4gbiAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgYXVkaXRfbWF0Y2hfcGVybShzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY3R4LCBpbnQgbWFzaykKK3sKKwl1bnNpZ25lZCBuID0gY3R4LT5tYWpvcjsKKwlzd2l0Y2ggKGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoY3R4LT5hcmNoLCBuKSkgeworCWNhc2UgMDoJLyogbmF0aXZlICovCisJCWlmICgobWFzayAmIEFVRElUX1BFUk1fV1JJVEUpICYmCisJCSAgICAgYXVkaXRfbWF0Y2hfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEUsIG4pKQorCQkJcmV0dXJuIDE7CisJCWlmICgobWFzayAmIEFVRElUX1BFUk1fUkVBRCkgJiYKKwkJICAgICBhdWRpdF9tYXRjaF9jbGFzcyhBVURJVF9DTEFTU19SRUFELCBuKSkKKwkJCXJldHVybiAxOworCQlpZiAoKG1hc2sgJiBBVURJVF9QRVJNX0FUVFIpICYmCisJCSAgICAgYXVkaXRfbWF0Y2hfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSLCBuKSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKKwljYXNlIDE6IC8qIDMyYml0IG9uIGJpYXJjaCAqLworCQlpZiAoKG1hc2sgJiBBVURJVF9QRVJNX1dSSVRFKSAmJgorCQkgICAgIGF1ZGl0X21hdGNoX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFXzMyLCBuKSkKKwkJCXJldHVybiAxOworCQlpZiAoKG1hc2sgJiBBVURJVF9QRVJNX1JFQUQpICYmCisJCSAgICAgYXVkaXRfbWF0Y2hfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRF8zMiwgbikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKChtYXNrICYgQVVESVRfUEVSTV9BVFRSKSAmJgorCQkgICAgIGF1ZGl0X21hdGNoX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUl8zMiwgbikpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSAyOiAvKiBvcGVuICovCisJCXJldHVybiBtYXNrICYgQUNDX01PREUoY3R4LT5hcmd2WzFdKTsKKwljYXNlIDM6IC8qIG9wZW5hdCAqLworCQlyZXR1cm4gbWFzayAmIEFDQ19NT0RFKGN0eC0+YXJndlsyXSk7CisJY2FzZSA0OiAvKiBzb2NrZXRjYWxsICovCisJCXJldHVybiAoKG1hc2sgJiBBVURJVF9QRVJNX1dSSVRFKSAmJiBjdHgtPmFyZ3ZbMF0gPT0gU1lTX0JJTkQpOworCWNhc2UgNTogLyogZXhlY3ZlICovCisJCXJldHVybiBtYXNrICYgQVVESVRfUEVSTV9FWEVDOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwogLyogRGV0ZXJtaW5lIGlmIGFueSBjb250ZXh0IG5hbWUgZGF0YSBtYXRjaGVzIGEgcnVsZSdzIHdhdGNoIGRhdGEgKi8KIC8qIENvbXBhcmUgYSB0YXNrX3N0cnVjdCB3aXRoIGFuIGF1ZGl0X3J1bGUuICBSZXR1cm4gMSBvbiBtYXRjaCwgMAogICogb3RoZXJ3aXNlLiAqLwpAQCAtMzk3LDYgKzQ0NSw5IEBACiAJCQkvKiBpZ25vcmUgdGhpcyBmaWVsZCBmb3IgZmlsdGVyaW5nICovCiAJCQlyZXN1bHQgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgQVVESVRfUEVSTToKKwkJCXJlc3VsdCA9IGF1ZGl0X21hdGNoX3Blcm0oY3R4LCBmLT52YWwpOworCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoIXJlc3VsdCkK