LyoKICogIEFtaWdhIExpbnV4L202OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKICoKICogIKkgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gKGdlZXJ0QGxpbnV4LW02OGsub3JnKQogKgkJCSAgICAgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKQogKgogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24KICoKICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCiAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCiAqCiAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCiAqCQkJUHVibGljYXRpb24gIzE2OTA3LCBSZXYuIEIsIEFtZW5kbWVudC8wLCBNYXkgMTk5NAogKgogKglNQzY4MjMwOglQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgKFBJL1QpCiAqCQkJTW90b3JvbGEgU2VtaWNvbmR1Y3RvcnMsIERlY2VtYmVyLCAxOTgzCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eAogKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoZSBBcmlhZG5lIGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBWaWxsYWdlIFRyb25pYy4gSXQgY29udGFpbnM6CiAqCiAqCS0gYW4gQW03OUM5NjAgUENuZXQtSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBib3RoCiAqCSAgMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIDEwQkFTRS1UIChVVFApIGNvbm5lY3RvcnMKICoKICoJLSBhbiBNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lciBjb25maWd1cmVkIGFzIDIgcGFyYWxsZWwgcG9ydHMKICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvem9ycm8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgoKI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CgojaW5jbHVkZSAiYXJpYWRuZS5oIgoKCiNpZmRlZiBBUklBRE5FX0RFQlVHCmludCBhcmlhZG5lX2RlYnVnID0gQVJJQURORV9ERUJVRzsKI2Vsc2UKaW50IGFyaWFkbmVfZGVidWcgPSAxOwojZW5kaWYKCgogICAgLyoKICAgICAqCU1hY3JvcyB0byBGaXggRW5kaWFubmVzcyBwcm9ibGVtcwogICAgICovCgoJCQkJLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCiNkZWZpbmUgc3dhcHcoeCkJKCgoeD4+OCkmMHgwMGZmKXwoKHg8PDgpJjB4ZmYwMCkpCgkJCQkvKiBHZXQgdGhlIExvdyBCWVRFIGluIGEgV09SRCAqLwojZGVmaW5lIGxvd2IoeCkJCSh4JjB4ZmYpCgkJCQkvKiBHZXQgdGhlIFN3YXBwZWQgSGlnaCBXT1JEIGluIGEgTE9ORyAqLwojZGVmaW5lIHN3aGlnaHcoeCkJKCgoKHgpPj44KSYweGZmMDApfCgoKHgpPj4yNCkmMHgwMGZmKSkKCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBMb3cgV09SRCBpbiBhIExPTkcgKi8KI2RlZmluZSBzd2xvd3coeCkJKCgoKHgpPDw4KSYweGZmMDApfCgoKHgpPj44KSYweDAwZmYpKQoKCiAgICAvKgogICAgICoJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCiAgICAgKi8KCiNkZWZpbmUgVFhfUklOR19TSVpFCTUKI2RlZmluZSBSWF9SSU5HX1NJWkUJMTYKCiNkZWZpbmUgUEtUX0JVRl9TSVpFCTE1MjAKCgogICAgLyoKICAgICAqCVByaXZhdGUgRGV2aWNlIERhdGEKICAgICAqLwoKc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSB7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdHhfcmluZ1tUWF9SSU5HX1NJWkVdOwogICAgdm9sYXRpbGUgc3RydWN0IFJEUkUgKnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnR4X2J1ZmZbVFhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnJ4X2J1ZmZbUlhfUklOR19TSVpFXTsKICAgIGludCBjdXJfdHgsIGN1cl9yeDsJCQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KICAgIGludCBkaXJ0eV90eDsJCQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLwogICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgICBjaGFyIHR4X2Z1bGw7Cn07CgoKICAgIC8qCiAgICAgKglTdHJ1Y3R1cmUgQ3JlYXRlZCBpbiB0aGUgQXJpYWRuZSdzIFJBTSBCdWZmZXIKICAgICAqLwoKc3RydWN0IGxhbmNlZGF0YSB7CiAgICBzdHJ1Y3QgVERSRSB0eF9yaW5nW1RYX1JJTkdfU0laRV07CiAgICBzdHJ1Y3QgUkRSRSByeF9yaW5nW1JYX1JJTkdfU0laRV07CiAgICB1X3Nob3J0IHR4X2J1ZmZbVFhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUvc2l6ZW9mKHVfc2hvcnQpXTsKICAgIHVfc2hvcnQgcnhfYnVmZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOwp9OwoKc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBpcnFyZXR1cm5fdCBhcmlhZG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwojaWZkZWYgSEFWRV9NVUxUSUNBU1QKc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwojZW5kaWYKCgpzdGF0aWMgdm9pZCBtZW1jcHl3KHZvbGF0aWxlIHVfc2hvcnQgKmRlc3QsIHVfc2hvcnQgKnNyYywgaW50IGxlbikKewogICAgd2hpbGUgKGxlbiA+PSAyKSB7CgkqKGRlc3QrKykgPSAqKHNyYysrKTsKCWxlbiAtPSAyOwogICAgfQogICAgaWYgKGxlbiA9PSAxKQoJKmRlc3QgPSAoKih1X2NoYXIgKilzcmMpPDw4Owp9CgoKc3RhdGljIGludCBfX2RldmluaXQgYXJpYWRuZV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAoJCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKCgpzdGF0aWMgc3RydWN0IHpvcnJvX2RldmljZV9pZCBhcmlhZG5lX3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAgICB7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORSB9LAogICAgeyAwIH0KfTsKCnN0YXRpYyBzdHJ1Y3Qgem9ycm9fZHJpdmVyIGFyaWFkbmVfZHJpdmVyID0gewogICAgLm5hbWUJPSAiYXJpYWRuZSIsCiAgICAuaWRfdGFibGUJPSBhcmlhZG5lX3pvcnJvX3RibCwKICAgIC5wcm9iZQk9IGFyaWFkbmVfaW5pdF9vbmUsCiAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoYXJpYWRuZV9yZW1vdmVfb25lKSwKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGFyaWFkbmVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKewogICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwogICAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBib2FyZCtBUklBRE5FX0xBTkNFOwogICAgdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBib2FyZCtBUklBRE5FX1JBTTsKICAgIHN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OwogICAgaW50IGVycjsKCiAgICByMSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlX2FkZHIsIHNpemVvZihzdHJ1Y3QgQW03OUM5NjApLCAiQW03OUM5NjAiKTsKICAgIGlmICghcjEpCglyZXR1cm4gLUVCVVNZOwogICAgcjIgPSByZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBBUklBRE5FX1JBTV9TSVpFLCAiUkFNIik7CiAgICBpZiAoIXIyKSB7CglyZWxlYXNlX3Jlc291cmNlKHIxKTsKCXJldHVybiAtRUJVU1k7CiAgICB9CgogICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUpKTsKICAgIGlmIChkZXYgPT0gTlVMTCkgewoJcmVsZWFzZV9yZXNvdXJjZShyMSk7CglyZWxlYXNlX3Jlc291cmNlKHIyKTsKCXJldHVybiAtRU5PTUVNOwogICAgfQoKICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwoKICAgIHIxLT5uYW1lID0gZGV2LT5uYW1lOwogICAgcjItPm5hbWUgPSBkZXYtPm5hbWU7CgogICAgZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CiAgICBkZXYtPmRldl9hZGRyWzFdID0gMHg2MDsKICAgIGRldi0+ZGV2X2FkZHJbMl0gPSAweDMwOwogICAgZGV2LT5kZXZfYWRkclszXSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyPj4xNikgJiAweGZmOwogICAgZGV2LT5kZXZfYWRkcls0XSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyPj44KSAmIDB4ZmY7CiAgICBkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7CiAgICBkZXYtPmJhc2VfYWRkciA9IFpUV09fVkFERFIoYmFzZV9hZGRyKTsKICAgIGRldi0+bWVtX3N0YXJ0ID0gWlRXT19WQUREUihtZW1fc3RhcnQpOwogICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQrQVJJQURORV9SQU1fU0laRTsKCiAgICBkZXYtPm9wZW4gPSAmYXJpYWRuZV9vcGVuOwogICAgZGV2LT5zdG9wID0gJmFyaWFkbmVfY2xvc2U7CiAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhcmlhZG5lX3N0YXJ0X3htaXQ7CiAgICBkZXYtPnR4X3RpbWVvdXQgPSAmYXJpYWRuZV90eF90aW1lb3V0OwogICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CiAgICBkZXYtPmdldF9zdGF0cyA9ICZhcmlhZG5lX2dldF9zdGF0czsKICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKCiAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgIGlmIChlcnIpIHsKCXJlbGVhc2VfcmVzb3VyY2UocjEpOwoJcmVsZWFzZV9yZXNvdXJjZShyMik7CglmcmVlX25ldGRldihkZXYpOwoJcmV0dXJuIGVycjsKICAgIH0KICAgIHpvcnJvX3NldF9kcnZkYXRhKHosIGRldik7CgogICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFyaWFkbmUgYXQgMHglMDhseCwgRXRoZXJuZXQgQWRkcmVzcyAiCgkgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIGRldi0+bmFtZSwgYm9hcmQsCgkgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAoJICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CgogICAgcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGFyaWFkbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CiAgICB1X3Nob3J0IGluOwogICAgdV9sb25nIHZlcnNpb247CiAgICBpbnQgaTsKCiAgICAvKiBSZXNldCB0aGUgTEFOQ0UgKi8KICAgIGluID0gbGFuY2UtPlJlc2V0OwoKICAgIC8qIFN0b3AgdGhlIExBTkNFICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CgogICAgLyogQ2hlY2sgdGhlIExBTkNFIHZlcnNpb24gKi8KICAgIGxhbmNlLT5SQVAgPSBDU1I4ODsJCS8qIENoaXAgSUQgKi8KICAgIHZlcnNpb24gPSBzd2FwdyhsYW5jZS0+UkRQKTsKICAgIGxhbmNlLT5SQVAgPSBDU1I4OTsJCS8qIENoaXAgSUQgKi8KICAgIHZlcnNpb24gfD0gc3dhcHcobGFuY2UtPlJEUCk8PDE2OwogICAgaWYgKCh2ZXJzaW9uICYgMHgwMDAwMGZmZikgIT0gMHgwMDAwMDAwMykgewoJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9vcGVuOiBDb3VsZG4ndCBmaW5kIEFNRCBFdGhlcm5ldCBDaGlwXG4iKTsKCXJldHVybiAtRUFHQUlOOwogICAgfQogICAgaWYgKCh2ZXJzaW9uICYgMHgwZmZmZjAwMCkgIT0gMHgwMDAwMzAwMCkgewoJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9vcGVuOiBDb3VsZG4ndCBmaW5kIEFtNzlDOTYwIChXcm9uZyBwYXJ0ICIKCSAgICAgICAibnVtYmVyID0gJWxkKVxuIiwgKHZlcnNpb24gJiAweDBmZmZmMDAwKT4+MTIpOwoJcmV0dXJuIC1FQUdBSU47CiAgICB9CiNpZiAwCiAgICBwcmludGsoS0VSTl9ERUJVRyAiYXJpYWRuZV9vcGVuOiBBbTc5Qzk2MCAoUENuZXQtSVNBKSBSZXZpc2lvbiAlbGRcbiIsCgkgICAodmVyc2lvbiAmIDB4ZjAwMDAwMDApPj4yOCk7CiNlbmRpZgoKICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7CgogICAgLyogTWlzY2VsbGFuZW91cyBTdHVmZiAqLwogICAgbGFuY2UtPlJBUCA9IENTUjM7CQkvKiBJbnRlcnJ1cHQgTWFza3MgYW5kIERlZmVycmFsIENvbnRyb2wgKi8KICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CiAgICBsYW5jZS0+UkFQID0gQ1NSNDsJCS8qIFRlc3QgYW5kIEZlYXR1cmVzIENvbnRyb2wgKi8KICAgIGxhbmNlLT5SRFAgPSBEUE9MTHxBUEFEX1hNVHxNRkNPTXxSQ1ZDQ09NfFRYU1RSVE18SkFCTTsKCiAgICAvKiBTZXQgdGhlIE11bHRpY2FzdCBUYWJsZSAqLwogICAgbGFuY2UtPlJBUCA9IENTUjg7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlsxNTowXSAqLwogICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKICAgIGxhbmNlLT5SQVAgPSBDU1I5OwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbMzE6MTZdICovCiAgICBsYW5jZS0+UkRQID0gMHgwMDAwOwogICAgbGFuY2UtPlJBUCA9IENTUjEwOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNDc6MzJdICovCiAgICBsYW5jZS0+UkRQID0gMHgwMDAwOwogICAgbGFuY2UtPlJBUCA9IENTUjExOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNjM6NDhdICovCiAgICBsYW5jZS0+UkRQID0gMHgwMDAwOwoKICAgIC8qIFNldCB0aGUgRXRoZXJuZXQgSGFyZHdhcmUgQWRkcmVzcyAqLwogICAgbGFuY2UtPlJBUCA9IENTUjEyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlsxNTowXSAqLwogICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVswXTsKICAgIGxhbmNlLT5SQVAgPSBDU1IxMzsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbMzE6MTZdICovCiAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzFdOwogICAgbGFuY2UtPlJBUCA9IENTUjE0OwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUls0NzozMl0gKi8KICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMl07CgogICAgLyogU2V0IHRoZSBJbml0IEJsb2NrIE1vZGUgKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CgogICAgLyogU2V0IHRoZSBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmcgUG9pbnRlciAqLwogICAgbGFuY2UtPlJBUCA9IENTUjMwOwkJLyogQmFzZSBBZGRyZXNzIG9mIFRyYW5zbWl0IFJpbmcgKi8KICAgIGxhbmNlLT5SRFAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfcmluZykpOwogICAgbGFuY2UtPlJBUCA9IENTUjMxOwkJLyogQmFzZSBBZGRyZXNzIG9mIHRyYW5zbWl0IFJpbmcgKi8KICAgIGxhbmNlLT5SRFAgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X3JpbmcpKTsKCiAgICAvKiBTZXQgdGhlIFJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIFBvaW50ZXIgKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IyNDsJCS8qIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KICAgIGxhbmNlLT5SRFAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfcmluZykpOwogICAgbGFuY2UtPlJBUCA9IENTUjI1OwkJLyogQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLwogICAgbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfcmluZykpOwoKICAgIC8qIFNldCB0aGUgTnVtYmVyIG9mIFJYIGFuZCBUWCBSaW5nIEVudHJpZXMgKi8KICAgIGxhbmNlLT5SQVAgPSBDU1I3NjsJCS8qIFJlY2VpdmUgUmluZyBMZW5ndGggKi8KICAgIGxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVJYX1JJTkdfU0laRSkpOwogICAgbGFuY2UtPlJBUCA9IENTUjc4OwkJLyogVHJhbnNtaXQgUmluZyBMZW5ndGggKi8KICAgIGxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVRYX1JJTkdfU0laRSkpOwoKICAgIC8qIEVuYWJsZSBNZWRpYSBJbnRlcmZhY2UgUG9ydCBBdXRvIFNlbGVjdCAoMTBCQVNFLTIvMTBCQVNFLVQpICovCiAgICBsYW5jZS0+UkFQID0gSVNBQ1NSMjsJLyogTWlzY2VsbGFuZW91cyBDb25maWd1cmF0aW9uICovCiAgICBsYW5jZS0+SURQID0gQVNFTDsKCiAgICAvKiBMRUQgQ29udHJvbCAqLwogICAgbGFuY2UtPlJBUCA9IElTQUNTUjU7CS8qIExFRDEgU3RhdHVzICovCiAgICBsYW5jZS0+SURQID0gUFNFfFhNVEU7CiAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNjsJLyogTEVEMiBTdGF0dXMgKi8KICAgIGxhbmNlLT5JRFAgPSBQU0V8Q09MRTsKICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I3OwkvKiBMRUQzIFN0YXR1cyAqLwogICAgbGFuY2UtPklEUCA9IFBTRXxSQ1ZFOwoKICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CgogICAgaSA9IHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYXJpYWRuZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2KTsKICAgIGlmIChpKSByZXR1cm4gaTsKCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlZGF0YSAqbGFuY2VkYXRhID0gKHN0cnVjdCBsYW5jZWRhdGEgKilkZXYtPm1lbV9zdGFydDsKICAgIGludCBpOwoKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICBwcml2LT50eF9mdWxsID0gMDsKICAgIHByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl90eCA9IDA7CiAgICBwcml2LT5kaXJ0eV90eCA9IDA7CgogICAgLyogU2V0IHVwIFRYIFJpbmcgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgewoJdm9sYXRpbGUgc3RydWN0IFREUkUgKnQgPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOwoJdC0+VE1EMCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSk7Cgl0LT5UTUQxID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSkgfAoJCSAgVEZfU1RQIHwgVEZfRU5QOwoJdC0+VE1EMiA9IHN3YXB3KCh1X3Nob3J0KS1QS1RfQlVGX1NJWkUpOwoJdC0+VE1EMyA9IDA7Cglwcml2LT50eF9yaW5nW2ldID0gJmxhbmNlZGF0YS0+dHhfcmluZ1tpXTsKCXByaXYtPnR4X2J1ZmZbaV0gPSBsYW5jZWRhdGEtPnR4X2J1ZmZbaV07CiNpZiAwCglwcmludGsoS0VSTl9ERUJVRyAiVFggRW50cnkgJTJkIGF0ICVwLCBCdWYgYXQgJXBcbiIsIGksCgkgICAgICAgJmxhbmNlZGF0YS0+dHhfcmluZ1tpXSwgbGFuY2VkYXRhLT50eF9idWZmW2ldKTsKI2VuZGlmCiAgICB9CgogICAgLyogU2V0IHVwIFJYIFJpbmcgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgewoJdm9sYXRpbGUgc3RydWN0IFJEUkUgKnIgPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOwoJci0+Uk1EMCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9idWZmW2ldKSk7CglyLT5STUQxID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9idWZmW2ldKSkgfAoJCSAgUkZfT1dOOwoJci0+Uk1EMiA9IHN3YXB3KCh1X3Nob3J0KS1QS1RfQlVGX1NJWkUpOwoJci0+Uk1EMyA9IDB4MDAwMDsKCXByaXYtPnJ4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOwoJcHJpdi0+cnhfYnVmZltpXSA9IGxhbmNlZGF0YS0+cnhfYnVmZltpXTsKI2lmIDAKCXByaW50ayhLRVJOX0RFQlVHICJSWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKCSAgICAgICAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldLCBsYW5jZWRhdGEtPnJ4X2J1ZmZbaV0pOwojZW5kaWYKICAgIH0KfQoKCnN0YXRpYyBpbnQgYXJpYWRuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKCiAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CgogICAgbGFuY2UtPlJBUCA9IENTUjExMjsJLyogTWlzc2VkIEZyYW1lIENvdW50ICovCiAgICBwcml2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gc3dhcHcobGFuY2UtPlJEUCk7CiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwoKICAgIGlmIChhcmlhZG5lX2RlYnVnID4gMSkgewoJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCgkgICAgICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKCXByaW50ayhLRVJOX0RFQlVHICIlczogJWx1IHBhY2tldHMgbWlzc2VkXG4iLCBkZXYtPm5hbWUsCgkgICAgICAgcHJpdi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyk7CiAgICB9CgogICAgLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMgbWVtb3J5IGlmIHdlIGRvbid0LiAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CgogICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOwoKICAgIHJldHVybiAwOwp9CgoKc3RhdGljIGlubGluZSB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwoKICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KICAgIGxhbmNlLT5SRFAgPSBTVE9QOwogICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlQ7CiAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOwp9CgoKc3RhdGljIGlycXJldHVybl90IGFyaWFkbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdjsKICAgIGludCBjc3IwLCBib2d1c2NudDsKICAgIGludCBoYW5kbGVkID0gMDsKCiAgICBpZiAoZGV2ID09IE5VTEwpIHsKCXByaW50ayhLRVJOX1dBUk5JTkcgImFyaWFkbmVfaW50ZXJydXB0KCk6IGlycSBmb3IgdW5rbm93biBkZXZpY2UuXG4iKTsKCXJldHVybiBJUlFfTk9ORTsKICAgIH0KCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KCiAgICBpZiAoIShsYW5jZS0+UkRQICYgSU5UUikpCQkvKiBDaGVjayBpZiBhbnkgaW50ZXJydXB0IGhhcyBiZWVuICovCglyZXR1cm4gSVJRX05PTkU7CQkvKiBnZW5lcmF0ZWQgYnkgdGhlIGJvYXJkLiAqLwoKICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwoKICAgIGJvZ3VzY250ID0gMTA7CiAgICB3aGlsZSAoKGNzcjAgPSBsYW5jZS0+UkRQKSAmIChFUlJ8UklOVHxUSU5UKSAmJiAtLWJvZ3VzY250ID49IDApIHsKCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLwoJbGFuY2UtPlJEUCA9IGNzcjAgJiB+KElORUF8VERNRHxTVE9QfFNUUlR8SU5JVCk7CgojaWYgMAoJaWYgKGFyaWFkbmVfZGVidWcgPiA1KSB7CgkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JSMyLjJ4IG5ldyBjc3I9JSMyLjJ4LiIsCgkJICAgZGV2LT5uYW1lLCBjc3IwLCBsYW5jZS0+UkRQKTsKCSAgICBwcmludGsoIlsiKTsKCSAgICBpZiAoY3NyMCAmIElOVFIpCgkJcHJpbnRrKCIgSU5UUiIpOwoJICAgIGlmIChjc3IwICYgSU5FQSkKCQlwcmludGsoIiBJTkVBIik7CgkgICAgaWYgKGNzcjAgJiBSWE9OKQoJCXByaW50aygiIFJYT04iKTsKCSAgICBpZiAoY3NyMCAmIFRYT04pCgkJcHJpbnRrKCIgVFhPTiIpOwoJICAgIGlmIChjc3IwICYgVERNRCkKCQlwcmludGsoIiBURE1EIik7CgkgICAgaWYgKGNzcjAgJiBTVE9QKQoJCXByaW50aygiIFNUT1AiKTsKCSAgICBpZiAoY3NyMCAmIFNUUlQpCgkJcHJpbnRrKCIgU1RSVCIpOwoJICAgIGlmIChjc3IwICYgSU5JVCkKCQlwcmludGsoIiBJTklUIik7CgkgICAgaWYgKGNzcjAgJiBFUlIpCgkJcHJpbnRrKCIgRVJSIik7CgkgICAgaWYgKGNzcjAgJiBCQUJMKQoJCXByaW50aygiIEJBQkwiKTsKCSAgICBpZiAoY3NyMCAmIENFUlIpCgkJcHJpbnRrKCIgQ0VSUiIpOwoJICAgIGlmIChjc3IwICYgTUlTUykKCQlwcmludGsoIiBNSVNTIik7CgkgICAgaWYgKGNzcjAgJiBNRVJSKQoJCXByaW50aygiIE1FUlIiKTsKCSAgICBpZiAoY3NyMCAmIFJJTlQpCgkJcHJpbnRrKCIgUklOVCIpOwoJICAgIGlmIChjc3IwICYgVElOVCkKCQlwcmludGsoIiBUSU5UIik7CgkgICAgaWYgKGNzcjAgJiBJRE9OKQoJCXByaW50aygiIElET04iKTsKCSAgICBwcmludGsoIiBdXG4iKTsKCX0KI2VuZGlmCgoJaWYgKGNzcjAgJiBSSU5UKSB7CS8qIFJ4IGludGVycnVwdCAqLwoJICAgIGhhbmRsZWQgPSAxOwoJICAgIGFyaWFkbmVfcngoZGV2KTsKCX0KCglpZiAoY3NyMCAmIFRJTlQpIHsJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KCSAgICBpbnQgZGlydHlfdHggPSBwcml2LT5kaXJ0eV90eDsKCgkgICAgaGFuZGxlZCA9IDE7CgkgICAgd2hpbGUgKGRpcnR5X3R4IDwgcHJpdi0+Y3VyX3R4KSB7CgkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CgkJaW50IHN0YXR1cyA9IGxvd2IocHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEpOwoKCQlpZiAoc3RhdHVzICYgVEZfT1dOKQoJCSAgICBicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLwoKCQlwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSAmPSAweGZmMDA7CgoJCWlmIChzdGF0dXMgJiBURl9FUlIpIHsKCQkgICAgLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCgkJICAgIGludCBlcnJfc3RhdHVzID0gcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDM7CgkJICAgIHByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwoJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX1JUUlkpCgkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CgkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENBUikKCQkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9MQ09MKQoJCQlwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CgkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfVUZMTykgewoJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKCQkJLyogUmVtb3ZlIHRoaXMgdmVyYm9zaXR5IGxhdGVyISAqLwoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBGSUZPIGVycm9yISBTdGF0dXMgJTQuNHguXG4iLAoJCQkgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KCQkJbGFuY2UtPlJEUCA9IFNUUlQ7CgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICBpZiAoc3RhdHVzICYgKFRGX01PUkV8VEZfT05FKSkKCQkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucysrOwoJCSAgICBwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CgkJfQoJCWRpcnR5X3R4Kys7CgkgICAgfQoKI2lmbmRlZiBmaW5hbF92ZXJzaW9uCgkgICAgaWYgKHByaXYtPmN1cl90eCAtIGRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgewoJCXByaW50ayhLRVJOX0VSUiAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCAiCgkJICAgICAgICJmdWxsPSVkLlxuIiwgZGlydHlfdHgsIHByaXYtPmN1cl90eCwgcHJpdi0+dHhfZnVsbCk7CgkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOwoJICAgIH0KI2VuZGlmCgoJICAgIGlmIChwcml2LT50eF9mdWxsICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgoJCWRpcnR5X3R4ID4gcHJpdi0+Y3VyX3R4IC0gVFhfUklOR19TSVpFICsgMikgewoJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLiAqLwoJCXByaXYtPnR4X2Z1bGwgPSAwOwoJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKCSAgICB9CgoJICAgIHByaXYtPmRpcnR5X3R4ID0gZGlydHlfdHg7Cgl9CgoJLyogTG9nIG1pc2MgZXJyb3JzLiAqLwoJaWYgKGNzcjAgJiBCQUJMKSB7CgkgICAgaGFuZGxlZCA9IDE7CgkgICAgcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CS8qIFR4IGJhYmJsZS4gKi8KCX0KCWlmIChjc3IwICYgTUlTUykgewoJICAgIGhhbmRsZWQgPSAxOwoJICAgIHByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KCX0KCWlmIChjc3IwICYgTUVSUikgewoJICAgIGhhbmRsZWQgPSAxOwoJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICIKCQkgICAiJTQuNHguXG4iLCBkZXYtPm5hbWUsIGNzcjApOwoJICAgIC8qIFJlc3RhcnQgdGhlIGNoaXAuICovCgkgICAgbGFuY2UtPlJEUCA9IFNUUlQ7Cgl9CiAgICB9CgogICAgLyogQ2xlYXIgYW55IG90aGVyIGludGVycnVwdCwgYW5kIHNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLwogICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KICAgIGxhbmNlLT5SRFAgPSBJTkVBfEJBQkx8Q0VSUnxNSVNTfE1FUlJ8SURPTjsKCiNpZiAwCiAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDQpCglwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3IlZD0lIzQuNHguXG4iLCBkZXYtPm5hbWUsCgkgICAgICAgbGFuY2UtPlJBUCwgbGFuY2UtPlJEUCk7CiNlbmRpZgogICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cn0KCgpzdGF0aWMgdm9pZCBhcmlhZG5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwoKICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU0LjR4LCByZXNldHRpbmcuXG4iLAoJICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKICAgIGFyaWFkbmVfcmVzZXQoZGV2KTsKICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKfQoKCnN0YXRpYyBpbnQgYXJpYWRuZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwogICAgaW50IGVudHJ5OwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgIGludCBsZW4gPSBza2ItPmxlbjsKCiNpZiAwCiAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDMpIHsKCWxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KCXByaW50ayhLRVJOX0RFQlVHICIlczogYXJpYWRuZV9zdGFydF94bWl0KCkgY2FsbGVkLCBjc3IwICU0LjR4LlxuIiwKCSAgICAgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOwoJbGFuY2UtPlJEUCA9IDB4MDAwMDsKICAgIH0KI2VuZGlmCgogICAgLyogRklYTUU6IGlzIHRoZSA3OUM5NjAgbmV3IGVub3VnaCB0byBkbyBpdHMgb3duIHBhZGRpbmcgcmlnaHQgPyAqLwogICAgaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pCiAgICB7CiAgICAJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKICAgIAkgICAgcmV0dXJuIDA7CiAgICAJbGVuID0gRVRIX1pMRU47CiAgICB9CgogICAgLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KCiNpZiAwCiAgICBwcmludGsoS0VSTl9ERUJVRyAiVFggcGt0IHR5cGUgMHglMDR4IGZyb20gIiwgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSk7CiAgICB7CglpbnQgaTsKCXVfY2hhciAqcHRyID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XTsKCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCgkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKICAgIH0KICAgIHByaW50aygiIHRvICIpOwogICAgewoJaW50IGk7Cgl1X2NoYXIgKnB0ciA9ICh1X2NoYXIgKilza2ItPmRhdGE7Cglmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CiAgICB9CiAgICBwcmludGsoIiBkYXRhIDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKI2VuZGlmCgogICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoKICAgIGVudHJ5ID0gcHJpdi0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOwoKICAgIC8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBiYXNlIGFkZHJlc3Mgd2l0aAoJCXRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCgogICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDIgPSBzd2FwdygodV9zaG9ydCktc2tiLT5sZW4pOwogICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDMgPSAweDAwMDA7CiAgICBtZW1jcHl3KHByaXYtPnR4X2J1ZmZbZW50cnldLCAodV9zaG9ydCAqKXNrYi0+ZGF0YSwgbGVuKTsKCiNpZiAwCiAgICB7CglpbnQgaSwgbGVuOwoKCWxlbiA9IHNrYi0+bGVuID4gNjQgPyA2NCA6IHNrYi0+bGVuOwoJbGVuID4+PSAxOwoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7CgkgICAgaW50IGo7CgkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwNHg6IiwgaSk7CgkgICAgZm9yIChqID0gMDsgKGogPCA4KSAmJiAoKGkraikgPCBsZW4pOyBqKyspIHsKCQlpZiAoIShqICYgMSkpCgkJICAgIHByaW50aygiICIpOwoJCXByaW50aygiJTA0eCIsIHByaXYtPnR4X2J1ZmZbZW50cnldW2kral0pOwoJICAgIH0KCSAgICBwcmludGsoIlxuIik7Cgl9CiAgICB9CiNlbmRpZgoKICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxID0gKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxJjB4ZmYwMCl8VEZfT1dOfFRGX1NUUHxURl9FTlA7CgogICAgZGV2X2tmcmVlX3NrYihza2IpOwoKICAgIHByaXYtPmN1cl90eCsrOwogICAgaWYgKChwcml2LT5jdXJfdHggPj0gVFhfUklOR19TSVpFKSAmJiAocHJpdi0+ZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSkgewoKI2lmIDAKCXByaW50ayhLRVJOX0RFQlVHICIqKiogU3VidHJhY3RpbmcgVFhfUklOR19TSVpFIGZyb20gY3VyX3R4ICglZCkgYW5kICIKCSAgICAgICAiZGlydHlfdHggKCVkKVxuIiwgcHJpdi0+Y3VyX3R4LCBwcml2LT5kaXJ0eV90eCk7CiNlbmRpZgoKCXByaXYtPmN1cl90eCAtPSBUWF9SSU5HX1NJWkU7Cglwcml2LT5kaXJ0eV90eCAtPSBUWF9SSU5HX1NJWkU7CiAgICB9CgogICAgLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLwogICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KICAgIGxhbmNlLT5SRFAgPSBJTkVBfFRETUQ7CgogICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CgogICAgaWYgKGxvd2IocHJpdi0+dHhfcmluZ1soZW50cnkrMSkgJSBUWF9SSU5HX1NJWkVdLT5UTUQxKSAhPSAwKSB7CgluZXRpZl9zdG9wX3F1ZXVlKGRldik7Cglwcml2LT50eF9mdWxsID0gMTsKICAgIH0KICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgYXJpYWRuZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIGludCBlbnRyeSA9IHByaXYtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKICAgIGludCBpOwoKICAgIC8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCiAgICB3aGlsZSAoIShsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKSAmIFJGX09XTikpIHsKCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKTsKCglpZiAoc3RhdHVzICE9IChSRl9TVFB8UkZfRU5QKSkgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCgkgICAgLyogVGhlcmUgaXMgYSB0cmlja3kgZXJyb3Igbm90ZWQgYnkgSm9obiBNdXJwaHksCgkJPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKCQlidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCgkJYnVmZmVycywgd2l0aCBvbmx5IHRoZSBsYXN0IGNvcnJlY3RseSBub3RpbmcgdGhlIGVycm9yLiAqLwoJICAgIGlmIChzdGF0dXMgJiBSRl9FTlApCgkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlIGVuZCBvZiBhIHBhY2tldC4qLwoJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwoJICAgIGlmIChzdGF0dXMgJiBSRl9GUkFNKQoJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwoJICAgIGlmIChzdGF0dXMgJiBSRl9PRkxPKQoJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CgkgICAgaWYgKHN0YXR1cyAmIFJGX0NSQykKCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CgkgICAgaWYgKHN0YXR1cyAmIFJGX0JVRkYpCgkJcHJpdi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKCSAgICBwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSAmPSAweGZmMDB8UkZfU1RQfFJGX0VOUDsKCX0gZWxzZSB7CgkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMy4gKi8KCSAgICBzaG9ydCBwa3RfbGVuID0gc3dhcHcocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDMpOwoJICAgIHN0cnVjdCBza19idWZmICpza2I7CgoJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKCSAgICBpZiAoc2tiID09IE5VTEwpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAoJCSAgICAgICBkZXYtPm5hbWUpOwoJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKCQkgICAgaWYgKGxvd2IocHJpdi0+cnhfcmluZ1soZW50cnkraSkgJSBSWF9SSU5HX1NJWkVdLT5STUQxKSAmIFJGX09XTikKCQkJYnJlYWs7CgoJCWlmIChpID4gUlhfUklOR19TSVpFLTIpIHsKCQkgICAgcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwoJCSAgICBwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047CgkJICAgIHByaXYtPmN1cl9yeCsrOwoJCX0KCQlicmVhazsKCSAgICB9CgoKCSAgICBza2ItPmRldiA9IGRldjsKCSAgICBza2JfcmVzZXJ2ZShza2IsMik7CQkvKiAxNiBieXRlIGFsaWduICovCgkgICAgc2tiX3B1dChza2IscGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwoJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCAoY2hhciAqKXByaXYtPnJ4X2J1ZmZbZW50cnldLCBwa3RfbGVuLDApOwoJICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CiNpZiAwCgkgICAgcHJpbnRrKEtFUk5fREVCVUcgIlJYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsCgkJICAgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSk7CgkgICAgewoJCWludCBpOwoJCXVfY2hhciAqcHRyID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XTsKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOwoJICAgIH0KCSAgICBwcmludGsoIiB0byAiKTsKCSAgICB7CgkJaW50IGk7CgkJdV9jaGFyICpwdHIgPSAodV9jaGFyICopc2tiLT5kYXRhOwoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCgkJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CgkgICAgfQoJICAgIHByaW50aygiIGRhdGEgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4pOwojZW5kaWYKCgkgICAgbmV0aWZfcngoc2tiKTsKCSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwoJICAgIHByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKCSAgICBwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwoJfQoKCXByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxIHw9IFJGX09XTjsKCWVudHJ5ID0gKCsrcHJpdi0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKICAgIH0KCiAgICBwcml2LT5jdXJfcnggPSBwcml2LT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CgogICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoYXQgYXQgbGVhc3QgdHdvIHJpbmcgZW50cmllcyBhcmUgZnJlZS4JIElmIG5vdCwKICAgICAgIHdlIHNob3VsZCBmcmVlIG9uZSBhbmQgbWFyayBzdGF0cy0+cnhfZHJvcHBlZCsrLiAqLwoKICAgIHJldHVybiAwOwp9CgoKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmlhZG5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKICAgIHNob3J0IHNhdmVkX2FkZHI7CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwoKICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKICAgIHNhdmVkX2FkZHIgPSBsYW5jZS0+UkFQOwogICAgbGFuY2UtPlJBUCA9IENTUjExMjsJCS8qIE1pc3NlZCBGcmFtZSBDb3VudCAqLwogICAgcHJpdi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IHN3YXB3KGxhbmNlLT5SRFApOwogICAgbGFuY2UtPlJBUCA9IHNhdmVkX2FkZHI7CiAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgogICAgcmV0dXJuICZwcml2LT5zdGF0czsKfQoKCi8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgogICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKICAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAogICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbwoJCQliZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCiAqLwpzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwoKICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKQoJcmV0dXJuOwoKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICAvKiBXZSB0YWtlIHRoZSBzaW1wbGUgd2F5IG91dCBhbmQgYWx3YXlzIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLwogICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCiAgICBsYW5jZS0+UkRQID0gU1RPUDsJCQkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBsYW5jZS4gKi8KICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7CgogICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewoJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwoJbGFuY2UtPlJEUCA9IFBST007CQkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwogICAgfSBlbHNlIHsKCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKCWludCBudW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OwoJaW50IGk7CgkvKiBXZSBkb24ndCB1c2UgdGhlIG11bHRpY2FzdCB0YWJsZSwgYnV0IHJlbHkgb24gdXBwZXItbGF5ZXIgZmlsdGVyaW5nLiAqLwoJbWVtc2V0KG11bHRpY2FzdF90YWJsZSwgKG51bV9hZGRycyA9PSAwKSA/IDAgOiAtMSwKCSAgICAgICBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7Cglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkgICAgbGFuY2UtPlJBUCA9IENTUjgrKGk8PDgpOwkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyICovCgkgICAgbGFuY2UtPlJEUCA9IHN3YXB3KG11bHRpY2FzdF90YWJsZVtpXSk7Cgl9CglsYW5jZS0+UkFQID0gQ1NSMTU7CQkvKiBNb2RlIFJlZ2lzdGVyICovCglsYW5jZS0+UkRQID0gMHgwMDAwOwkJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwogICAgfQoKICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVHxJRE9OOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KCiAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cn0KCgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXJpYWRuZV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKCiAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5iYXNlX2FkZHIpLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7CiAgICByZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPm1lbV9zdGFydCksIEFSSUFETkVfUkFNX1NJWkUpOwogICAgZnJlZV9uZXRkZXYoZGV2KTsKfQoKc3RhdGljIGludCBfX2luaXQgYXJpYWRuZV9pbml0X21vZHVsZSh2b2lkKQp7CiAgICByZXR1cm4gem9ycm9fcmVnaXN0ZXJfZHJpdmVyKCZhcmlhZG5lX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhcmlhZG5lX2NsZWFudXBfbW9kdWxlKHZvaWQpCnsKICAgIHpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZhcmlhZG5lX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KGFyaWFkbmVfaW5pdF9tb2R1bGUpOwptb2R1bGVfZXhpdChhcmlhZG5lX2NsZWFudXBfbW9kdWxlKTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK