LyoKICogIGxpbnV4L2RyaXZlcnMvY2hhci9zZXJpYWwuYwogKgogKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogKiAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAKICogCQkxOTk4LCAxOTk5ICBUaGVvZG9yZSBUcydvCiAqCiAqICBFeHRlbnNpdmVseSByZXdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgOC8xNi85MiAtLSA5LzE0LzkyLiAgTm93CiAqICBtdWNoIG1vcmUgZXh0ZW5zaWJsZSB0byBzdXBwb3J0IG90aGVyIHNlcmlhbCBjYXJkcyBiYXNlZCBvbiB0aGUKICogIDE2NDUwLzE2NTUwQSBVQVJUJ3MuICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQVNUIEZvdXJQb3J0IGFuZCB0aGUKICogIEFjY2VudCBBc3luYyBib2FyZC4gIAogKgogKiAgc2V0X3NlcmlhbF9pbmZvIGZpeGVkIHRvIHNldCB0aGUgZmxhZ3MsIGN1c3RvbSBkaXZpc29yLCBhbmQgdWFydAogKiAJdHlwZSBmaWVsZHMuICBGaXggc3VnZ2VzdGVkIGJ5IE1pY2hhZWwgSy4gSm9obnNvbiAxMi8xMi85Mi4KICoKICogIDExLzk1OiBUSU9DTUlXQUlULCBUSU9DR0lDT1VOVCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KICoKICogIDAzLzk2OiBNb2R1bGFyaXNlZCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KICoKICogIHJzX3NldF90ZXJtaW9zIGZpeGVkIHRvIGxvb2sgYWxzbyBmb3IgY2hhbmdlcyBvZiB0aGUgaW5wdXQKICogICAgICBmbGFncyBJTlBDSywgQlJLSU5ULCBQQVJNUkssIElHTlBBUiBhbmQgSUdOQlJLLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVybmQgQW5o5HVwbCAwNS8xNy85Ni4KICoKICogIDEvOTc6ICBFeHRlbmRlZCBkdW1iIHNlcmlhbCBwb3J0cyBhcmUgYSBjb25maWcgb3B0aW9uIG5vdy4gIAogKiAgICAgICAgIFNhdmVzIDRrLiAgIE1pY2hhZWwgQS4gR3JpZmZpdGggPGdyaWZAYWNtLm9yZz4KICogCiAqICA4Lzk3OiBGaXggYnVnIGluIHJzX3NldF90ZXJtaW9zIHdpdGggUlRTCiAqICAgICAgICBTdGFuaXNsYXYgVi4gVm9yb255aSA8c3Rhc0B1YW5ldC5raGFya292LnVhPgogKgogKiAgMy85ODogQ2hhbmdlIHRoZSBJUlEgZGV0ZWN0aW9uLCB1c2Ugb2YgcHJvYmVfaXJxX28qKCksCiAqCSAgc3VwcHJlc3MgVElPQ1NFUkdXSUxEIGFuZCBUSU9DU0VSU1dJTEQKICoJICBFdGllbm5lIExvcnJhaW4gPGV0aWVubmUubG9ycmFpbkBpYm0ubmV0PgogKgogKiAgNC85ODogQWRkZWQgY2hhbmdlcyB0byBzdXBwb3J0IHRoZSBBUk0gYXJjaGl0ZWN0dXJlIHByb3Bvc2VkIGJ5CiAqIAkgIFJ1c3NlbGwgS2luZwogKgogKiAgNS85OTogVXBkYXRlZCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBYUjE2Qzg1MCBhbmQgU1QxNkM2NTQKICogICAgICAgIHVhcnRzLiAgU3R1YXJ0IE1hY0RvbmFsZCA8c3R1YXJ0bUBjb25uZWN0dGVjaC5jb20+CiAqCiAqICA4Lzk5OiBHZW5lcmFsaXplZCBQQ0kgc3VwcG9ydCBhZGRlZC4gIFRoZW9kb3JlIFRzJ28KICogCiAqICAzLzAwOiBSaWQgY2lyY3VsYXIgYnVmZmVyIG9mIHJlZHVuZGFudCB4bWl0X2NudC4gIEZpeCBhCiAqCSAgZmV3IHJhY2VzIG9uIGZyZWVpbmcgYnVmZmVycyB0b28uCiAqCSAgQWxhbiBNb2RyYSA8YWxhbkBsaW51eGNhcmUuY29tPgogKgogKiAgNS8wMDogU3VwcG9ydCBmb3IgdGhlIFJTQS1EViBJSS9TIGNhcmQgYWRkZWQuCiAqCSAgS2l5b2thenUgU1VUTyA8c3V0b0Brcy1hbmQta3MubmUuanA+CiAqIAogKiAgNi8wMDogUmVtb3ZlIG9sZC1zdHlsZSB0aW1lciwgdXNlIHRpbWVyX2xpc3QKICogICAgICAgIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KICoKICogIDcvMDA6IFN1cHBvcnQgVGltZWRpYS9TdW5peC9FeHN5cyBQQ0kgY2FyZHMKICoKICogIDcvMDA6IGZpeCBzb21lIHJldHVybnMgb24gZmFpbHVyZSBub3QgdXNpbmcgTU9EX0RFQ19VU0VfQ09VTlQuCiAqCSAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqCiAqIDEwLzAwOiBhZGQgaW4gb3B0aW9uYWwgc29mdHdhcmUgZmxvdyBjb250cm9sIGZvciBzZXJpYWwgY29uc29sZS4KICoJICBLYW5vaiBTYXJjYXIgPGthbm9qQHNnaS5jb20+ICAoTW9kaWZpZWQgYnkgVGhlb2RvcmUgVHMnbykKICoKICogMDIvMDI6IEZpeCBmb3IgQU1EIEVsYW4gYnVnIGluIHRyYW5zbWl0IGlycSByb3V0aW5lLCBieQogKiAgICAgICAgQ2hyaXN0ZXIgV2VpbmlnZWwgPHdpbmdlbEBob2cuY3RybC1jLmxpdS5zZT4sCiAqICAgICAgICBSb2JlcnQgU2Nod2ViZWwgPHJvYmVydEBzY2h3ZWJlbC5kZT4sCiAqICAgICAgICBKdWVyZ2VuIEJlaXNlcnQgPGpiZWlzZXJ0QGV1cm9kc24uZGU+LAogKiAgICAgICAgVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KICovCgpzdGF0aWMgY2hhciAqc2VyaWFsX3ZlcnNpb24gPSAiNS4wNWMiOwpzdGF0aWMgY2hhciAqc2VyaWFsX3JldmRhdGUgPSAiMjAwMS0wNy0wOCI7CgovKgogKiBTZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzIG9wdGlvbnM6CiAqCiAqIENPTkZJR19IVUI2CiAqCQlFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSB2ZW5lcmFibGUgQmVsbCBUZWNobm9sb2dpZXMKICoJCUhVQjYgY2FyZC4KICoKICogQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCiAqIAkJRW5hYmxlcyBzdXBwb3J0IGZvciBwb3J0cyBiZXlvbmQgdGhlIHN0YW5kYXJkLCBzdHVwaWQKICogCQlDT00gMS8yLzMvNC4KICoKICogQ09ORklHX1NFUklBTF9NVUxUSVBPUlQKICogCQlFbmFibGVzIHN1cHBvcnQgZm9yIHNwZWNpYWwgbXVsdGlwb3J0IGJvYXJkIHN1cHBvcnQuCiAqCiAqIENPTkZJR19TRVJJQUxfU0hBUkVfSVJRCiAqIAkJRW5hYmxlcyBzdXBwb3J0IGZvciBtdWx0aXBsZSBzZXJpYWwgcG9ydHMgb24gb25lIElSUQogKgogKiBDT05GSUdfU0VSSUFMX0RFVEVDVF9JUlEKICoJCUVuYWJsZSB0aGUgYXV0b2RldGVjdGlvbiBvZiBJUlEgb24gc3RhbmRhcnQgcG9ydHMKICoKICogU0VSSUFMX1BBUkFOT0lBX0NIRUNLCiAqIAkJQ2hlY2sgdGhlIG1hZ2ljIG51bWJlciBmb3IgdGhlIGFzeW5jX3N0cnVjdHVyZSB3aGVyZQogKiAJCWV2ZXIgcG9zc2libGUuCiAqCiAqIENPTkZJR19TRVJJQUxfQUNQSQogKgkJRW5hYmxlIHN1cHBvcnQgZm9yIHNlcmlhbCBjb25zb2xlIHBvcnQgYW5kIHNlcmlhbCAKICoJCWRlYnVnIHBvcnQgYXMgZGVmaW5lZCBieSB0aGUgU1BDUiBhbmQgREJHUCB0YWJsZXMgaW4gCiAqCQlBQ1BJIDIuMC4KICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CgojdW5kZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCiNkZWZpbmUgQ09ORklHX1NFUklBTF9OT1BBVVNFX0lPCiNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKCiNpZiAwCi8qIFRoZXNlIGRlZmluZXMgYXJlIG5vcm1hbGx5IGNvbnRyb2xsZWQgYnkgdGhlIGF1dG9jb25mLmggKi8KI2RlZmluZSBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKI2RlZmluZSBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQojZGVmaW5lIENPTkZJR19TRVJJQUxfREVURUNUX0lSUQojZGVmaW5lIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCiNkZWZpbmUgQ09ORklHX0hVQjYKI2VuZGlmCgojaWZkZWYgQ09ORklHX1BDSQojZGVmaW5lIEVOQUJMRV9TRVJJQUxfUENJCiNpZm5kZWYgQ09ORklHX1NFUklBTF9TSEFSRV9JUlEKI2RlZmluZSBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQojZW5kaWYKI2lmbmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKI2RlZmluZSBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIENPTkZJR19TRVJJQUxfQUNQSQojZGVmaW5lIEVOQUJMRV9TRVJJQUxfQUNQSQojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19JU0FQTlApfHwgKGRlZmluZWQoQ09ORklHX0lTQVBOUF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKI2lmbmRlZiBFTkFCTEVfU0VSSUFMX1BOUAojZGVmaW5lIEVOQUJMRV9TRVJJQUxfUE5QCiNlbmRpZgojZW5kaWYKCi8qIFNldCBvZiBkZWJ1Z2dpbmcgZGVmaW5lcyAqLwoKI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCiN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgojdW5kZWYgU0VSSUFMX0RFQlVHX0ZMT1cKI3VuZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKI3VuZGVmIFNFUklBTF9ERUJVR19QQ0kKI3VuZGVmIFNFUklBTF9ERUJVR19BVVRPQ09ORgoKLyogU2FuaXR5IGNoZWNrcyAqLwoKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCiNpZm5kZWYgQ09ORklHX1NFUklBTF9TSEFSRV9JUlEKI2RlZmluZSBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQojZW5kaWYKI2VuZGlmCgojaWZkZWYgQ09ORklHX0hVQjYKI2lmbmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKI2RlZmluZSBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKI2VuZGlmCiNpZm5kZWYgQ09ORklHX1NFUklBTF9TSEFSRV9JUlEKI2RlZmluZSBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQojZW5kaWYKI2VuZGlmCgojaWZkZWYgTU9EVUxFCiN1bmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKI2VuZGlmCgojZGVmaW5lIENPTkZJR19TRVJJQUxfUlNBCgojZGVmaW5lIFJTX1NUUk9CRV9USU1FICgxMCpIWikKI2RlZmluZSBSU19JU1JfUEFTU19MSU1JVCAyNTYKCiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAoZGVmaW5lZChDT05GSUdfTTM4NikgfHwgZGVmaW5lZChDT05GSUdfTTQ4NikpCiNkZWZpbmUgU0VSSUFMX0lOTElORQojZW5kaWYKICAKLyoKICogRW5kIG9mIHNlcmlhbCBkcml2ZXIgY29uZmlndXJhdGlvbiBzZWN0aW9uLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaWZkZWYgTE9DQUxfSEVBREVSUwojaW5jbHVkZSAic2VyaWFsX2xvY2FsLmgiCiNlbHNlCiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KI2RlZmluZSBMT0NBTF9WRVJTVFJJTkcgIiIKI2VuZGlmCgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgojaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gMTMxMzQzKQojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojZW5kaWYKI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gMTMxMzM2KQojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCiNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiNlbmRpZgojaWZkZWYgRU5BQkxFX1NFUklBTF9QQ0kKI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojZW5kaWYKI2lmZGVmIEVOQUJMRV9TRVJJQUxfUE5QCiNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CiNlbmRpZgoKLyoKICogQWxsIG9mIHRoZSBjb21wYXRpYmlsdHkgY29kZSBzbyB3ZSBjYW4gY29tcGlsZSBzZXJpYWwuYyBhZ2FpbnN0CiAqIG9sZGVyIGtlcm5lbHMgaXMgaGlkZGVuIGluIHNlcmlhbF9jb21wYXQuaAogKi8KI2lmIGRlZmluZWQoTE9DQUxfSEVBREVSUykgfHwgKExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwMzE3KSAvKiAyLjMuMjMgKi8KI2luY2x1ZGUgInNlcmlhbF9jb21wYXQuaCIKI2VuZGlmCgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaWYgZGVmaW5lZChDT05GSUdfTUFDX1NFUklBTCkKI2RlZmluZSBTRVJJQUxfREVWX09GRlNFVAkoKF9tYWNoaW5lID09IF9NQUNIX3ByZXAgfHwgX21hY2hpbmUgPT0gX01BQ0hfY2hycCkgPyAwIDogMikKI2Vsc2UKI2RlZmluZSBTRVJJQUxfREVWX09GRlNFVAkwCiNlbmRpZgoKI2lmZGVmIFNFUklBTF9JTkxJTkUKI2RlZmluZSBfSU5MSU5FXyBpbmxpbmUKI2Vsc2UKI2RlZmluZSBfSU5MSU5FXwojZW5kaWYKCnN0YXRpYyBjaGFyICpzZXJpYWxfbmFtZSA9ICJTZXJpYWwgZHJpdmVyIjsKCnN0YXRpYyBERUNMQVJFX1RBU0tfUVVFVUUodHFfc2VyaWFsKTsKCnN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciBzZXJpYWxfZHJpdmVyLCBjYWxsb3V0X2RyaXZlcjsKc3RhdGljIGludCBzZXJpYWxfcmVmY291bnQ7CgpzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2VyaWFsX3RpbWVyOwoKLyogc2VyaWFsIHN1YnR5cGUgZGVmaW5pdGlvbnMgKi8KI2lmbmRlZiBTRVJJQUxfVFlQRV9OT1JNQUwKI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwJMQojZGVmaW5lIFNFUklBTF9UWVBFX0NBTExPVVQJMgojZW5kaWYKCi8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLwojZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKCi8qCiAqIElSUV90aW1lb3V0CQktIEhvdyBsb25nIHRoZSB0aW1lb3V0IHNob3VsZCBiZSBmb3IgZWFjaCBJUlEKICogCQkJCXNob3VsZCBiZSBhZnRlciB0aGUgSVJRIGhhcyBiZWVuIGFjdGl2ZS4KICovCgpzdGF0aWMgc3RydWN0IGFzeW5jX3N0cnVjdCAqSVJRX3BvcnRzW05SX0lSUVNdOwojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQKc3RhdGljIHN0cnVjdCByc19tdWx0aXBvcnRfc3RydWN0IHJzX211bHRpcG9ydFtOUl9JUlFTXTsKI2VuZGlmCnN0YXRpYyBpbnQgSVJRX3RpbWVvdXRbTlJfSVJRU107CiNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnM7CnN0YXRpYyBpbnQgbHNyX2JyZWFrX2ZsYWc7CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQpzdGF0aWMgdW5zaWduZWQgbG9uZyBicmVha19wcmVzc2VkOyAvKiBicmVhaywgcmVhbGx5IC4uLiAqLwojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBkZXRlY3RfdWFydF9pcnEgKHN0cnVjdCBzZXJpYWxfc3RhdGUgKiBzdGF0ZSk7CnN0YXRpYyB2b2lkIGF1dG9jb25maWcoc3RydWN0IHNlcmlhbF9zdGF0ZSAqIHN0YXRlKTsKc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sIHN0cnVjdCB0ZXJtaW9zICpvbGQpOwpzdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwoKLyoKICogSGVyZSB3ZSBkZWZpbmUgdGhlIGRlZmF1bHQgeG1pdCBmaWZvIHNpemUgdXNlZCBmb3IgZWFjaCB0eXBlIG9mCiAqIFVBUlQKICovCnN0YXRpYyBzdHJ1Y3Qgc2VyaWFsX3VhcnRfY29uZmlnIHVhcnRfY29uZmlnW10gPSB7Cgl7ICJ1bmtub3duIiwgMSwgMCB9LCAKCXsgIjgyNTAiLCAxLCAwIH0sIAoJeyAiMTY0NTAiLCAxLCAwIH0sIAoJeyAiMTY1NTAiLCAxLCAwIH0sIAoJeyAiMTY1NTBBIiwgMTYsIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfSwgCgl7ICJjaXJydXMiLCAxLCAwIH0sIAkvKiB1c3VycGVkIGJ5IGN5Y2xhZGVzLmMgKi8KCXsgIlNUMTY2NTAiLCAxLCBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1NUQVJURUNIIH0sIAoJeyAiU1QxNjY1MFYyIiwgMzIsIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfAoJCSAgVUFSVF9TVEFSVEVDSCB9LCAKCXsgIlRJMTY3NTAiLCA2NCwgVUFSVF9DTEVBUl9GSUZPIHwgVUFSVF9VU0VfRklGT30sCgl7ICJTdGFydGVjaCIsIDEsIDB9LAkvKiB1c3VycGVkIGJ5IGN5Y2xhZGVzLmMgKi8KCXsgIjE2Qzk1MC85NTQiLCAxMjgsIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk99LAoJeyAiU1QxNjY1NCIsIDY0LCBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1VTRV9GSUZPIHwKCQkgIFVBUlRfU1RBUlRFQ0ggfSwgCgl7ICJYUjE2ODUwIiwgMTI4LCBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1VTRV9GSUZPIHwKCQkgIFVBUlRfU1RBUlRFQ0ggfSwKCXsgIlJTQSIsIDIwNDgsIFVBUlRfQ0xFQVJfRklGTyB8IFVBUlRfVVNFX0ZJRk8gfSwgCgl7IDAsIDB9Cn07CgojaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1JTQSkgJiYgZGVmaW5lZChNT0RVTEUpCgojZGVmaW5lIFBPUlRfUlNBX01BWCA0CnN0YXRpYyBpbnQgcHJvYmVfcnNhW1BPUlRfUlNBX01BWF07CnN0YXRpYyBpbnQgZm9yY2VfcnNhW1BPUlRfUlNBX01BWF07CgpNT0RVTEVfUEFSTShwcm9iZV9yc2EsICIxLSIgX19NT0RVTEVfU1RSSU5HKFBPUlRfUlNBX01BWCkgImkiKTsKTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9yc2EsICJQcm9iZSBJL08gcG9ydHMgZm9yIFJTQSIpOwpNT0RVTEVfUEFSTShmb3JjZV9yc2EsICIxLSIgX19NT0RVTEVfU1RSSU5HKFBPUlRfUlNBX01BWCkgImkiKTsKTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9yc2EsICJGb3JjZSBJL08gcG9ydHMgZm9yIFJTQSIpOwojZW5kaWYgLyogQ09ORklHX1NFUklBTF9SU0EgICovCgpzdHJ1Y3Qgc2VyaWFsX3N0YXRlIHJzX3RhYmxlW1JTX1RBQkxFX1NJWkVdID0gewoJU0VSSUFMX1BPUlRfREZOUwkvKiBEZWZpbmVkIGluIHNlcmlhbC5oICovCn07CgojZGVmaW5lIE5SX1BPUlRTCShzaXplb2YocnNfdGFibGUpL3NpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0YXRlKSkKaW50IHNlcmlhbF9ucl9wb3J0cyA9IE5SX1BPUlRTOwoKI2lmIChkZWZpbmVkKEVOQUJMRV9TRVJJQUxfUENJKSB8fCBkZWZpbmVkKEVOQUJMRV9TRVJJQUxfUE5QKSkKI2RlZmluZSBOUl9QQ0lfQk9BUkRTCTgKCnN0YXRpYyBzdHJ1Y3QgcGNpX2JvYXJkX2luc3QJc2VyaWFsX3BjaV9ib2FyZFtOUl9QQ0lfQk9BUkRTXTsKCiNpZm5kZWYgSVNfUENJX1JFR0lPTl9JT1BPUlQKI2RlZmluZSBJU19QQ0lfUkVHSU9OX0lPUE9SVChkZXYsIHIpIChwY2lfcmVzb3VyY2VfZmxhZ3MoKGRldiksIChyKSkgJiBcCgkJCQkgICAgICBJT1JFU09VUkNFX0lPKQojZW5kaWYKI2lmbmRlZiBJU19QQ0lfUkVHSU9OX0lPTUVNCiNkZWZpbmUgSVNfUENJX1JFR0lPTl9JT01FTShkZXYsIHIpIChwY2lfcmVzb3VyY2VfZmxhZ3MoKGRldiksIChyKSkgJiBcCgkJCQkgICAgICBJT1JFU09VUkNFX01FTSkKI2VuZGlmCiNpZm5kZWYgUENJX0lSUV9SRVNPVVJDRQojZGVmaW5lIFBDSV9JUlFfUkVTT1VSQ0UoZGV2LCByKSAoKGRldiktPmlycV9yZXNvdXJjZVtyXS5zdGFydCkKI2VuZGlmCiNpZm5kZWYgcGNpX2dldF9zdWJ2ZW5kb3IKI2RlZmluZSBwY2lfZ2V0X3N1YnZlbmRvcihkZXYpICgoZGV2KS0+c3Vic3lzdGVtX3ZlbmRvcikKI2RlZmluZSBwY2lfZ2V0X3N1YmRldmljZShkZXYpICAoKGRldiktPnN1YnN5c3RlbV9kZXZpY2UpCiNlbmRpZgojZW5kaWYJLyogRU5BQkxFX1NFUklBTF9QQ0kgfHwgRU5BQkxFX1NFUklBTF9QTlAgICovCgojaWZuZGVmIFBSRVBBUkVfRlVOQwojZGVmaW5lIFBSRVBBUkVfRlVOQyhkZXYpICAoZGV2LT5wcmVwYXJlKQojZGVmaW5lIEFDVElWQVRFX0ZVTkMoZGV2KSAgKGRldi0+YWN0aXZhdGUpCiNkZWZpbmUgREVBQ1RJVkFURV9GVU5DKGRldikgIChkZXYtPmRlYWN0aXZhdGUpCiNlbmRpZgoKI2RlZmluZSBISUdIX0JJVFNfT0ZGU0VUICgoc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpKSo4KQoKc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICpzZXJpYWxfdGFibGVbTlJfUE9SVFNdOwpzdGF0aWMgc3RydWN0IHRlcm1pb3MgKnNlcmlhbF90ZXJtaW9zW05SX1BPUlRTXTsKc3RhdGljIHN0cnVjdCB0ZXJtaW9zICpzZXJpYWxfdGVybWlvc19sb2NrZWRbTlJfUE9SVFNdOwoKCiNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChTRVJJQUxfREVCVUdfTUNPVU5UKQojZGVmaW5lIERCR19DTlQocykgcHJpbnRrKCIoJXMpOiBbJXhdIHJlZmM9JWQsIHNlcmM9JWQsIHR0eWM9JWQgLT4gJXNcbiIsIFwKIGtkZXZuYW1lKHR0eS0+ZGV2aWNlKSwgKGluZm8tPmZsYWdzKSwgc2VyaWFsX3JlZmNvdW50LGluZm8tPmNvdW50LHR0eS0+Y291bnQscykKI2Vsc2UKI2RlZmluZSBEQkdfQ05UKHMpCiNlbmRpZgoKLyoKICogdG1wX2J1ZiBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBieSBzZXJpYWxfd3JpdGUuICBXZSBuZWVkIHRvCiAqIGxvY2sgaXQgaW4gY2FzZSB0aGUgY29weV9mcm9tX3VzZXIgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKICogYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbSB0cmllcyB0byBkbyBhIHNlcmlhbCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgogKiBTaW5jZSB0aGUgbG9jayB3aWxsIG9ubHkgY29tZSB1bmRlciBjb250ZW50aW9uIHdoZW4gdGhlIHN5c3RlbSBpcwogKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQogKiBidWZmZXIgYWNyb3NzIGFsbCB0aGUgc2VyaWFsIHBvcnRzLCBzaW5jZSBpdCBzaWduaWZpY2FudGx5IHNhdmVzCiAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICovCnN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwojaWZkZWYgREVDTEFSRV9NVVRFWApzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiNlbHNlCnN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIHRtcF9idWZfc2VtID0gTVVURVg7CiNlbmRpZgoKCnN0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvLAoJCQkJCWtkZXZfdCBkZXZpY2UsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCnsKI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSwoJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KCQkiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3Igc2VyaWFsIHN0cnVjdCAoJXMpIGluICVzXG4iOwoJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQoJCSJXYXJuaW5nOiBudWxsIGFzeW5jX3N0cnVjdCBmb3IgKCVzKSBpbiAlc1xuIjsKCglpZiAoIWluZm8pIHsKCQlwcmludGsoYmFkaW5mbywga2Rldm5hbWUoZGV2aWNlKSwgcm91dGluZSk7CgkJcmV0dXJuIDE7Cgl9CglpZiAoaW5mby0+bWFnaWMgIT0gU0VSSUFMX01BR0lDKSB7CgkJcHJpbnRrKGJhZG1hZ2ljLCBrZGV2bmFtZShkZXZpY2UpLCByb3V0aW5lKTsKCQlyZXR1cm4gMTsKCX0KI2VuZGlmCglyZXR1cm4gMDsKfQoKc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgaW50IG9mZnNldCkKewoJc3dpdGNoIChpbmZvLT5pb190eXBlKSB7CiNpZmRlZiBDT05GSUdfSFVCNgoJY2FzZSBTRVJJQUxfSU9fSFVCNjoKCQlvdXRiKGluZm8tPmh1YjYgLSAxICsgb2Zmc2V0LCBpbmZvLT5wb3J0KTsKCQlyZXR1cm4gaW5iKGluZm8tPnBvcnQrMSk7CiNlbmRpZgoJY2FzZSBTRVJJQUxfSU9fTUVNOgoJCXJldHVybiByZWFkYigodW5zaWduZWQgbG9uZykgaW5mby0+aW9tZW1fYmFzZSArCgkJCSAgICAgKG9mZnNldDw8aW5mby0+aW9tZW1fcmVnX3NoaWZ0KSk7CglkZWZhdWx0OgoJCXJldHVybiBpbmIoaW5mby0+cG9ydCArIG9mZnNldCk7Cgl9Cn0KCnN0YXRpYyBfSU5MSU5FXyB2b2lkIHNlcmlhbF9vdXQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgaW50IG9mZnNldCwKCQkJCWludCB2YWx1ZSkKewoJc3dpdGNoIChpbmZvLT5pb190eXBlKSB7CiNpZmRlZiBDT05GSUdfSFVCNgoJY2FzZSBTRVJJQUxfSU9fSFVCNjoKCQlvdXRiKGluZm8tPmh1YjYgLSAxICsgb2Zmc2V0LCBpbmZvLT5wb3J0KTsKCQlvdXRiKHZhbHVlLCBpbmZvLT5wb3J0KzEpOwoJCWJyZWFrOwojZW5kaWYKCWNhc2UgU0VSSUFMX0lPX01FTToKCQl3cml0ZWIodmFsdWUsICh1bnNpZ25lZCBsb25nKSBpbmZvLT5pb21lbV9iYXNlICsKCQkJICAgICAgKG9mZnNldDw8aW5mby0+aW9tZW1fcmVnX3NoaWZ0KSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCW91dGIodmFsdWUsIGluZm8tPnBvcnQrb2Zmc2V0KTsKCX0KfQoKLyoKICogV2UgdXNlZCB0byBzdXBwb3J0IHVzaW5nIHBhdXNlIEkvTyBmb3IgY2VydGFpbiBtYWNoaW5lcy4gIFdlCiAqIGhhdmVuJ3Qgc3VwcG9ydGVkIHRoaXMgZm9yIGEgd2hpbGUsIGJ1dCBqdXN0IGluIGNhc2UgaXQncyBiYWRseQogKiBuZWVkZWQgZm9yIGNlcnRhaW4gb2xkIDM4NiBtYWNoaW5lcywgSSd2ZSBsZWZ0IHRoZXNlICNkZWZpbmUncwogKiBpbi4uLi4KICovCiNkZWZpbmUgc2VyaWFsX2lucChpbmZvLCBvZmZzZXQpCQlzZXJpYWxfaW4oaW5mbywgb2Zmc2V0KQojZGVmaW5lIHNlcmlhbF9vdXRwKGluZm8sIG9mZnNldCwgdmFsdWUpCXNlcmlhbF9vdXQoaW5mbywgb2Zmc2V0LCB2YWx1ZSkKCgovKgogKiBGb3IgdGhlIDE2Qzk1MAogKi8Kdm9pZCBzZXJpYWxfaWNyX3dyaXRlKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sIGludCBvZmZzZXQsIGludCAgdmFsdWUpCnsKCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9TQ1IsIG9mZnNldCk7CglzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUNSLCB2YWx1ZSk7Cn0KCnVuc2lnbmVkIGludCBzZXJpYWxfaWNyX3JlYWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgaW50IG9mZnNldCkKewoJaW50CXZhbHVlOwoKCXNlcmlhbF9pY3Jfd3JpdGUoaW5mbywgVUFSVF9BQ1IsIGluZm8tPkFDUiB8IFVBUlRfQUNSX0lDUlJEKTsKCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9TQ1IsIG9mZnNldCk7Cgl2YWx1ZSA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0lDUik7CglzZXJpYWxfaWNyX3dyaXRlKGluZm8sIFVBUlRfQUNSLCBpbmZvLT5BQ1IpOwoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcnNfc3RvcCgpIGFuZCByc19zdGFydCgpCiAqCiAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgogKiBUaGV5IGVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyIGludGVycnVwdHMsIGFzIG5lY2Vzc2FyeS4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgdm9pZCByc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19zdG9wIikpCgkJcmV0dXJuOwoJCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglpZiAoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkgewoJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCBpbmZvLT5JRVIpOwoJfQoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfMTZDOTUwKSB7CgkJaW5mby0+QUNSIHw9IFVBUlRfQUNSX1RYRElTOwoJCXNlcmlhbF9pY3Jfd3JpdGUoaW5mbywgVUFSVF9BQ1IsIGluZm8tPkFDUik7Cgl9CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKfQoKc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKewoJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19zdGFydCIpKQoJCXJldHVybjsKCQoJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwoJaWYgKGluZm8tPnhtaXQuaGVhZCAhPSBpbmZvLT54bWl0LnRhaWwKCSAgICAmJiBpbmZvLT54bWl0LmJ1ZgoJICAgICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCBpbmZvLT5JRVIpOwoJfQoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfMTZDOTUwKSB7CgkJaW5mby0+QUNSICY9IH5VQVJUX0FDUl9UWERJUzsKCQlzZXJpYWxfaWNyX3dyaXRlKGluZm8sIFVBUlRfQUNSLCBpbmZvLT5BQ1IpOwoJfQoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cn0KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogSGVyZSBzdGFydHMgdGhlIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcy4gIEFsbCBvZiB0aGUgZm9sbG93aW5nCiAqIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQgaW50bwogKiByc19pbnRlcnJ1cHQoKS4gIFRoZXkgd2VyZSBzZXBhcmF0ZWQgb3V0IGZvciByZWFkYWJpbGl0eSdzIHNha2UuCiAqCiAqIE5vdGU6IHJzX2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAogKiBydW5zIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAgUGVvcGxlIHdobyBtYXkgd2FudCB0byBtb2RpZnkKICogcnNfaW50ZXJydXB0KCkgc2hvdWxkIHRyeSB0byBrZWVwIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhcyBmYXN0IGFzCiAqIHBvc3NpYmxlLiAgQWZ0ZXIgeW91IGFyZSBkb25lIG1ha2luZyBtb2RpZmljYXRpb25zLCBpdCBpcyBub3QgYSBiYWQKICogaWRlYSB0byBkbzoKICogCiAqIGdjYyAtUyAtREtFUk5FTCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciBzZXJpYWwuYwogKgogKiBhbmQgbG9vayBhdCB0aGUgcmVzdWx0aW5nIGFzc2VtYmxlIGNvZGUgaW4gc2VyaWFsLnMuCiAqCiAqIAkJCQktIFRlZCBUcydvICh0eXRzb0BtaXQuZWR1KSwgNy1NYXItOTMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKICogcHJvY2Vzc2luZyBpbiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHBvcnRpb24gb2YgdGhlIGRyaXZlci4KICovCnN0YXRpYyBfSU5MSU5FXyB2b2lkIHJzX3NjaGVkX2V2ZW50KHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sCgkJCQkgIGludCBldmVudCkKewoJaW5mby0+ZXZlbnQgfD0gMSA8PCBldmVudDsKCXF1ZXVlX3Rhc2soJmluZm8tPnRxdWV1ZSwgJnRxX3NlcmlhbCk7CgltYXJrX2JoKFNFUklBTF9CSCk7Cn0KCnN0YXRpYyBfSU5MSU5FXyB2b2lkIHJlY2VpdmVfY2hhcnMoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKCQkJCSBpbnQgKnN0YXR1cywgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQp7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OwoJdW5zaWduZWQgY2hhciBjaDsKCXN0cnVjdAlhc3luY19pY291bnQgKmljb3VudDsKCWludAltYXhfY291bnQgPSAyNTY7CgoJaWNvdW50ID0gJmluZm8tPnN0YXRlLT5pY291bnQ7CglkbyB7CgkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CgkJCXR0eS0+ZmxpcC50cXVldWUucm91dGluZSgodm9pZCAqKSB0dHkpOwoJCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkJCS8qIG5vIHJvb20gaW4gZmxpcCBidWZmZXIsIGRpc2NhcmQgcnggRklGTyBjb250ZW50cyB0byBjbGVhciBJUlEKCQkJCSAqICpGSVhNRSogSGFyZHdhcmUgd2l0aCBhdXRvIGZsb3cgY29udHJvbAoJCQkJICogd291bGQgYmVuZWZpdCBmcm9tIGxlYXZpbmcgdGhlIGRhdGEgaW4gdGhlIEZJRk8gYW5kCgkJCQkgKiBkaXNhYmxpbmcgdGhlIHJ4IElSUSB1bnRpbCBzcGFjZSBiZWNvbWVzIGF2YWlsYWJsZS4KCQkJCSAqLwoJCQkJZG8gewoJCQkJCXNlcmlhbF9pbnAoaW5mbywgVUFSVF9SWCk7CgkJCQkJaWNvdW50LT5vdmVycnVuKys7CgkJCQkJKnN0YXR1cyA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9MU1IpOwoJCQkJfSB3aGlsZSAoKCpzdGF0dXMgJiBVQVJUX0xTUl9EUikgJiYgKG1heF9jb3VudC0tID4gMCkpOwoJCQkJcmV0dXJuOwkJLy8gaWYgVFRZX0RPTlRfRkxJUCBpcyBzZXQKCQkJfQoJCX0KCQljaCA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9SWCk7CgkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKCQlpY291bnQtPnJ4Kys7CgkJCiNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgoJCXByaW50aygiRFIlMDJ4OiUwMnguLi4iLCBjaCwgKnN0YXR1cyk7CiNlbmRpZgoJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKCQlpZiAoKnN0YXR1cyAmIChVQVJUX0xTUl9CSSB8IFVBUlRfTFNSX1BFIHwKCQkJICAgICAgIFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfT0UpKSB7CgkJCS8qCgkJCSAqIEZvciBzdGF0aXN0aWNzIG9ubHkKCQkJICovCgkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpIHsKCQkJCSpzdGF0dXMgJj0gfihVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFKTsKCQkJCWljb3VudC0+YnJrKys7CgkJCQkvKgoJCQkJICogV2UgZG8gdGhlIFN5c1JRIGFuZCBTQUsgY2hlY2tpbmcKCQkJCSAqIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGJyZWFrCgkJCQkgKiBtYXkgZ2V0IG1hc2tlZCBieSBpZ25vcmVfc3RhdHVzX21hc2sKCQkJCSAqIG9yIHJlYWRfc3RhdHVzX21hc2suCgkJCQkgKi8KI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKCQkJCWlmIChpbmZvLT5saW5lID09IHNlcmNvbnMuaW5kZXgpIHsKCQkJCQlpZiAoIWJyZWFrX3ByZXNzZWQpIHsKCQkJCQkJYnJlYWtfcHJlc3NlZCA9IGppZmZpZXM7CgkJCQkJCWdvdG8gaWdub3JlX2NoYXI7CgkJCQkJfQoJCQkJCWJyZWFrX3ByZXNzZWQgPSAwOwoJCQkJfQojZW5kaWYKCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKCQkJCQlkb19TQUsodHR5KTsKCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfUEUpCgkJCQlpY291bnQtPnBhcml0eSsrOwoJCQllbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpCgkJCQlpY291bnQtPmZyYW1lKys7CgkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpCgkJCQlpY291bnQtPm92ZXJydW4rKzsKCgkJCS8qCgkJCSAqIE1hc2sgb2ZmIGNvbmRpdGlvbnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuCgkJCSAqLwoJCQkqc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CgojaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCgkJCWlmIChpbmZvLT5saW5lID09IHNlcmNvbnMuaW5kZXgpIHsKCQkJCS8qIFJlY292ZXIgdGhlIGJyZWFrIGZsYWcgZnJvbSBjb25zb2xlIHhtaXQgKi8KCQkJCSpzdGF0dXMgfD0gbHNyX2JyZWFrX2ZsYWc7CgkJCQlsc3JfYnJlYWtfZmxhZyA9IDA7CgkJCX0KI2VuZGlmCgkJCWlmICgqc3RhdHVzICYgKFVBUlRfTFNSX0JJKSkgewojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCQkJCXByaW50aygiaGFuZGxpbmcgYnJlYWsuLi4uIik7CiNlbmRpZgoJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CgkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1BFKQoJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOwoJCQllbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpCgkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKCQl9CiNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCgkJaWYgKGJyZWFrX3ByZXNzZWQgJiYgaW5mby0+bGluZSA9PSBzZXJjb25zLmluZGV4KSB7CgkJCWlmIChjaCAhPSAwICYmCgkJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBicmVha19wcmVzc2VkICsgSFoqNSkpIHsKCQkJCWhhbmRsZV9zeXNycShjaCwgcmVncywgTlVMTCwgTlVMTCk7CgkJCQlicmVha19wcmVzc2VkID0gMDsKCQkJCWdvdG8gaWdub3JlX2NoYXI7CgkJCX0KCQkJYnJlYWtfcHJlc3NlZCA9IDA7CgkJfQojZW5kaWYKCQlpZiAoKCpzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwoJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CgkJCXR0eS0+ZmxpcC5jb3VudCsrOwoJCX0KCQlpZiAoKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgJiYKCQkgICAgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpKSB7CgkJCS8qCgkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAoJCQkgKiBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50CgkJCSAqIGNoYXJhY3RlcgoJCQkgKi8KCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKCQkJdHR5LT5mbGlwLmNvdW50Kys7CgkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwoJCX0KI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKCWlnbm9yZV9jaGFyOgojZW5kaWYKCQkqc3RhdHVzID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0xTUik7Cgl9IHdoaWxlICgoKnN0YXR1cyAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7CiNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gMTMxMzk0KSAvKiAyLjEuNjYgKi8KCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiNlbHNlCglxdWV1ZV90YXNrX2lycV9vZmYoJnR0eS0+ZmxpcC50cXVldWUsICZ0cV90aW1lcik7CiNlbmRpZgkKfQoKc3RhdGljIF9JTkxJTkVfIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgaW50ICppbnRyX2RvbmUpCnsKCWludCBjb3VudDsKCglpZiAoaW5mby0+eF9jaGFyKSB7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9UWCwgaW5mby0+eF9jaGFyKTsKCQlpbmZvLT5zdGF0ZS0+aWNvdW50LnR4Kys7CgkJaW5mby0+eF9jaGFyID0gMDsKCQlpZiAoaW50cl9kb25lKQoJCQkqaW50cl9kb25lID0gMDsKCQlyZXR1cm47Cgl9CglpZiAoaW5mby0+eG1pdC5oZWFkID09IGluZm8tPnhtaXQudGFpbAoJICAgIHx8IGluZm8tPnR0eS0+c3RvcHBlZAoJICAgIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgewoJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCBpbmZvLT5JRVIpOwoJCXJldHVybjsKCX0KCQoJY291bnQgPSBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKCWRvIHsKCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfVFgsIGluZm8tPnhtaXQuYnVmW2luZm8tPnhtaXQudGFpbF0pOwoJCWluZm8tPnhtaXQudGFpbCA9IChpbmZvLT54bWl0LnRhaWwgKyAxKSAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOwoJCWluZm8tPnN0YXRlLT5pY291bnQudHgrKzsKCQlpZiAoaW5mby0+eG1pdC5oZWFkID09IGluZm8tPnhtaXQudGFpbCkKCQkJYnJlYWs7Cgl9IHdoaWxlICgtLWNvdW50ID4gMCk7CgkKCWlmIChDSVJDX0NOVChpbmZvLT54bWl0LmhlYWQsCgkJICAgICBpbmZvLT54bWl0LnRhaWwsCgkJICAgICBTRVJJQUxfWE1JVF9TSVpFKSA8IFdBS0VVUF9DSEFSUykKCQlyc19zY2hlZF9ldmVudChpbmZvLCBSU19FVkVOVF9XUklURV9XQUtFVVApOwoKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCglwcmludGsoIlRIUkUuLi4iKTsKI2VuZGlmCglpZiAoaW50cl9kb25lKQoJCSppbnRyX2RvbmUgPSAwOwoKCWlmIChpbmZvLT54bWl0LmhlYWQgPT0gaW5mby0+eG1pdC50YWlsKSB7CgkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwoJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7Cgl9Cn0KCnN0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQp7CglpbnQJc3RhdHVzOwoJc3RydWN0CWFzeW5jX2ljb3VudCAqaWNvdW50OwoJCglzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9NU1IpOwoKCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpIHsKCQlpY291bnQgPSAmaW5mby0+c3RhdGUtPmljb3VudDsKCQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLwoJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQoJCQlpY291bnQtPnJuZysrOwoJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQoJCQlpY291bnQtPmRzcisrOwoJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKSB7CgkJCWljb3VudC0+ZGNkKys7CiNpZmRlZiBDT05GSUdfSEFSRF9QUFMKCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0hBUkRQUFNfQ0QpICYmCgkJCSAgICAoc3RhdHVzICYgVUFSVF9NU1JfRENEKSkKCQkJCWhhcmRwcHMoKTsKI2VuZGlmCgkJfQoJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQoJCQlpY291bnQtPmN0cysrOwoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwoJfQoKCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpKSB7CiNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfT1BFTikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikpCgkJcHJpbnRrKCJ0dHlzJWQgQ0Qgbm93ICVzLi4uIiwgaW5mby0+bGluZSwKCQkgICAgICAgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkgPyAib24iIDogIm9mZiIpOwojZW5kaWYJCQoJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCgkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKCQllbHNlIGlmICghKChpbmZvLT5mbGFncyAmIEFTWU5DX0NBTExPVVRfQUNUSVZFKSAmJgoJCQkgICAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DQUxMT1VUX05PSFVQKSkpIHsKI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCgkJCXByaW50aygiZG9pbmcgc2VyaWFsIGhhbmd1cC4uLiIpOwojZW5kaWYKCQkJaWYgKGluZm8tPnR0eSkKCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKCQl9Cgl9CglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgewoJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgewojaWYgKGRlZmluZWQoU0VSSUFMX0RFQlVHX0lOVFIpIHx8IGRlZmluZWQoU0VSSUFMX0RFQlVHX0ZMT1cpKQoJCQkJcHJpbnRrKCJDVFMgdHggc3RhcnQuLi4iKTsKI2VuZGlmCgkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOwoJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CgkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCBpbmZvLT5JRVIpOwoJCQkJcnNfc2NoZWRfZXZlbnQoaW5mbywgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKCQkJCXJldHVybjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKI2lmIChkZWZpbmVkKFNFUklBTF9ERUJVR19JTlRSKSB8fCBkZWZpbmVkKFNFUklBTF9ERUJVR19GTE9XKSkKCQkJCXByaW50aygiQ1RTIHR4IHN0b3AuLi4iKTsKI2VuZGlmCgkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOwoJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwoJCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0lFUiwgaW5mby0+SUVSKTsKCQkJfQoJCX0KCX0KfQoKI2lmZGVmIENPTkZJR19TRVJJQUxfU0hBUkVfSVJRCi8qCiAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBnZW5lcmljIGludGVycnVwdCByb3V0aW5lCiAqLwpzdGF0aWMgdm9pZCByc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCnsKCWludCBzdGF0dXMsIGlpcjsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvOwoJaW50IHBhc3NfY291bnRlciA9IDA7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICplbmRfbWFyayA9IDA7CiNpZmRlZiBDT05GSUdfU0VSSUFMX01VTFRJUE9SVAkKCWludCBmaXJzdF9tdWx0aSA9IDA7CglzdHJ1Y3QgcnNfbXVsdGlwb3J0X3N0cnVjdCAqbXVsdGk7CiNlbmRpZgoKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCglwcmludGsoInJzX2ludGVycnVwdCglZCkuLi4iLCBpcnEpOwojZW5kaWYKCglpbmZvID0gSVJRX3BvcnRzW2lycV07CglpZiAoIWluZm8pCgkJcmV0dXJuOwoKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCQoJbXVsdGkgPSAmcnNfbXVsdGlwb3J0W2lycV07CglpZiAobXVsdGktPnBvcnRfbW9uaXRvcikKCQlmaXJzdF9tdWx0aSA9IGluYihtdWx0aS0+cG9ydF9tb25pdG9yKTsKI2VuZGlmCgoJZG8gewoJCWlmICghaW5mby0+dHR5IHx8CgkJICAgICgoaWlyPXNlcmlhbF9pbihpbmZvLCBVQVJUX0lJUikpICYgVUFSVF9JSVJfTk9fSU5UKSkgewoJCQlpZiAoIWVuZF9tYXJrKQoJCQkJZW5kX21hcmsgPSBpbmZvOwoJCQlnb3RvIG5leHQ7CgkJfQojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCQlwcmludGsoIklJUiA9ICV4Li4uIiwgc2VyaWFsX2luKGluZm8sIFVBUlRfSUlSKSk7CiNlbmRpZgoJCWVuZF9tYXJrID0gMDsKCgkJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwoKCQlzdGF0dXMgPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfTFNSKTsKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCgkJcHJpbnRrKCJzdGF0dXMgPSAleC4uLiIsIHN0YXR1cyk7CiNlbmRpZgoJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9EUikKCQkJcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzLCByZWdzKTsKCQljaGVja19tb2RlbV9zdGF0dXMoaW5mbyk7CiNpZmRlZiBDT05GSUdfTUVMQU4KCQlpZiAoKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHx8CgkJCS8qIGZvciBidWdneSBFTEFOIHByb2Nlc3NvcnMgKi8KCQkJKChpaXIgJiBVQVJUX0lJUl9JRCkgPT0gVUFSVF9JSVJfVEhSSSkpCgkJCXRyYW5zbWl0X2NoYXJzKGluZm8sIDApOwojZWxzZQoJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQoJCQl0cmFuc21pdF9jaGFycyhpbmZvLCAwKTsKI2VuZGlmCgoJbmV4dDoKCQlpbmZvID0gaW5mby0+bmV4dF9wb3J0OwoJCWlmICghaW5mbykgewoJCQlpbmZvID0gSVJRX3BvcnRzW2lycV07CgkJCWlmIChwYXNzX2NvdW50ZXIrKyA+IFJTX0lTUl9QQVNTX0xJTUlUKSB7CiNpZiAwCgkJCQlwcmludGsoInJzIGxvb3AgYnJlYWtcbiIpOwojZW5kaWYKCQkJCWJyZWFrOyAJLyogUHJldmVudCBpbmZpbml0ZSBsb29wcyAqLwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCX0gd2hpbGUgKGVuZF9tYXJrICE9IGluZm8pOwojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQJCglpZiAobXVsdGktPnBvcnRfbW9uaXRvcikKCQlwcmludGsoInJzIHBvcnQgbW9uaXRvciAobm9ybWFsKSBpcnEgJWQ6IDB4JXgsIDB4JXhcbiIsCgkJICAgICAgIGluZm8tPnN0YXRlLT5pcnEsIGZpcnN0X211bHRpLAoJCSAgICAgICBpbmIobXVsdGktPnBvcnRfbW9uaXRvcikpOwojZW5kaWYKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCglwcmludGsoImVuZC5cbiIpOwojZW5kaWYKfQojZW5kaWYgLyogI2lmZGVmIENPTkZJR19TRVJJQUxfU0hBUkVfSVJRICovCgoKLyoKICogVGhpcyBpcyB0aGUgc2VyaWFsIGRyaXZlcidzIGludGVycnVwdCByb3V0aW5lIGZvciBhIHNpbmdsZSBwb3J0CiAqLwpzdGF0aWMgdm9pZCByc19pbnRlcnJ1cHRfc2luZ2xlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQp7CglpbnQgc3RhdHVzLCBpaXI7CglpbnQgcGFzc19jb3VudGVyID0gMDsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvOwojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQJCglpbnQgZmlyc3RfbXVsdGkgPSAwOwoJc3RydWN0IHJzX211bHRpcG9ydF9zdHJ1Y3QgKm11bHRpOwojZW5kaWYKCQojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCXByaW50aygicnNfaW50ZXJydXB0X3NpbmdsZSglZCkuLi4iLCBpcnEpOwojZW5kaWYKCglpbmZvID0gSVJRX3BvcnRzW2lycV07CglpZiAoIWluZm8gfHwgIWluZm8tPnR0eSkKCQlyZXR1cm47CgojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQJCgltdWx0aSA9ICZyc19tdWx0aXBvcnRbaXJxXTsKCWlmIChtdWx0aS0+cG9ydF9tb25pdG9yKQoJCWZpcnN0X211bHRpID0gaW5iKG11bHRpLT5wb3J0X21vbml0b3IpOwojZW5kaWYKCglpaXIgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9JSVIpOwoJZG8gewoJCXN0YXR1cyA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9MU1IpOwojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCQlwcmludGsoInN0YXR1cyA9ICV4Li4uIiwgc3RhdHVzKTsKI2VuZGlmCgkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0RSKQoJCQlyZWNlaXZlX2NoYXJzKGluZm8sICZzdGF0dXMsIHJlZ3MpOwoJCWNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKI2lmZGVmIENPTkZJR19NRUxBTgoJCWlmICgoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkgfHwKCQkgICAgLyogRm9yIGJ1Z2d5IEVMQU4gcHJvY2Vzc29ycyAqLwoJCSAgICAoKGlpciAmIFVBUlRfSUlSX0lEKSA9PSBVQVJUX0lJUl9USFJJKSkKCQkJdHJhbnNtaXRfY2hhcnMoaW5mbywgMCk7CiNlbHNlCgkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpCgkJCXRyYW5zbWl0X2NoYXJzKGluZm8sIDApOwojZW5kaWYKCQlpZiAocGFzc19jb3VudGVyKysgPiBSU19JU1JfUEFTU19MSU1JVCkgewojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCQkJcHJpbnRrKCJyc19zaW5nbGUgbG9vcCBicmVhay5cbiIpOwojZW5kaWYKCQkJYnJlYWs7CgkJfQoJCWlpciA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0lJUik7CiNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgoJCXByaW50aygiSUlSID0gJXguLi4iLCBpaXIpOwojZW5kaWYKCX0gd2hpbGUgKChpaXIgJiBVQVJUX0lJUl9OT19JTlQpID09IDApOwoJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQJCglpZiAobXVsdGktPnBvcnRfbW9uaXRvcikKCQlwcmludGsoInJzIHBvcnQgbW9uaXRvciAoc2luZ2xlKSBpcnEgJWQ6IDB4JXgsIDB4JXhcbiIsCgkJICAgICAgIGluZm8tPnN0YXRlLT5pcnEsIGZpcnN0X211bHRpLAoJCSAgICAgICBpbmIobXVsdGktPnBvcnRfbW9uaXRvcikpOwojZW5kaWYKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCglwcmludGsoImVuZC5cbiIpOwojZW5kaWYKfQoKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCQovKgogKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZm9yIG11bHRpcG9ydCBib2FyZHMKICovCnN0YXRpYyB2b2lkIHJzX2ludGVycnVwdF9tdWx0aShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKewoJaW50IHN0YXR1czsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvOwoJaW50IHBhc3NfY291bnRlciA9IDA7CglpbnQgZmlyc3RfbXVsdGk9IDA7CglzdHJ1Y3QgcnNfbXVsdGlwb3J0X3N0cnVjdCAqbXVsdGk7CgojaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKCXByaW50aygicnNfaW50ZXJydXB0X211bHRpKCVkKS4uLiIsIGlycSk7CiNlbmRpZgoKCWluZm8gPSBJUlFfcG9ydHNbaXJxXTsKCWlmICghaW5mbykKCQlyZXR1cm47CgltdWx0aSA9ICZyc19tdWx0aXBvcnRbaXJxXTsKCWlmICghbXVsdGktPnBvcnQxKSB7CgkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwoJCXByaW50aygicnNfaW50ZXJydXB0X211bHRpOiBOVUxMIHBvcnQxIVxuIik7CgkJcmV0dXJuOwoJfQoJaWYgKG11bHRpLT5wb3J0X21vbml0b3IpCgkJZmlyc3RfbXVsdGkgPSBpbmIobXVsdGktPnBvcnRfbW9uaXRvcik7CgkKCXdoaWxlICgxKSB7CgkJaWYgKCFpbmZvLT50dHkgfHwKCQkgICAgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0lJUikgJiBVQVJUX0lJUl9OT19JTlQpKQoJCQlnb3RvIG5leHQ7CgoJCWluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKCgkJc3RhdHVzID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0xTUik7CiNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgoJCXByaW50aygic3RhdHVzID0gJXguLi4iLCBzdGF0dXMpOwojZW5kaWYKCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCgkJCXJlY2VpdmVfY2hhcnMoaW5mbywgJnN0YXR1cywgcmVncyk7CgkJY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8pOwoJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQoJCQl0cmFuc21pdF9jaGFycyhpbmZvLCAwKTsKCgluZXh0OgoJCWluZm8gPSBpbmZvLT5uZXh0X3BvcnQ7CgkJaWYgKGluZm8pCgkJCWNvbnRpbnVlOwoKCQlpbmZvID0gSVJRX3BvcnRzW2lycV07CgkJLyoKCQkgKiBUaGUgdXNlciB3YXMgYSBib25laGVhZCwgYW5kIG1pc2NvbmZpZ3VyZWQgdGhlaXIKCQkgKiBtdWx0aXBvcnQgaW5mby4gIFJhdGhlciB0aGFuIGxvY2sgdXAgdGhlIGtlcm5lbAoJCSAqIGluIGFuIGluZmluaXRlIGxvb3AsIGlmIHdlIGxvb3AgdG9vIG1hbnkgdGltZXMsCgkJICogcHJpbnQgYSBtZXNzYWdlIGFuZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCgkJICovCgkJaWYgKHBhc3NfY291bnRlcisrID4gUlNfSVNSX1BBU1NfTElNSVQpIHsKCQkJcHJpbnRrKCJNaXNjb25maWd1cmVkIG11bHRpcG9ydCBzZXJpYWwgaW5mbyAiCgkJCSAgICAgICAiZm9yIGlycSAlZC4gIEJyZWFraW5nIG91dCBpcnEgbG9vcFxuIiwgaXJxKTsKCQkJYnJlYWs7IAoJCX0KCQlpZiAobXVsdGktPnBvcnRfbW9uaXRvcikKCQkJcHJpbnRrKCJycyBwb3J0IG1vbml0b3IgaXJxICVkOiAweCV4LCAweCV4XG4iLAoJCQkgICAgICAgaW5mby0+c3RhdGUtPmlycSwgZmlyc3RfbXVsdGksCgkJCSAgICAgICBpbmIobXVsdGktPnBvcnRfbW9uaXRvcikpOwoJCWlmICgoaW5iKG11bHRpLT5wb3J0MSkgJiBtdWx0aS0+bWFzazEpICE9IG11bHRpLT5tYXRjaDEpCgkJCWNvbnRpbnVlOwoJCWlmICghbXVsdGktPnBvcnQyKQoJCQlicmVhazsKCQlpZiAoKGluYihtdWx0aS0+cG9ydDIpICYgbXVsdGktPm1hc2syKSAhPSBtdWx0aS0+bWF0Y2gyKQoJCQljb250aW51ZTsKCQlpZiAoIW11bHRpLT5wb3J0MykKCQkJYnJlYWs7CgkJaWYgKChpbmIobXVsdGktPnBvcnQzKSAmIG11bHRpLT5tYXNrMykgIT0gbXVsdGktPm1hdGNoMykKCQkJY29udGludWU7CgkJaWYgKCFtdWx0aS0+cG9ydDQpCgkJCWJyZWFrOwoJCWlmICgoaW5iKG11bHRpLT5wb3J0NCkgJiBtdWx0aS0+bWFzazQpICE9IG11bHRpLT5tYXRjaDQpCgkJCWNvbnRpbnVlOwoJCWJyZWFrOwoJfSAKI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCglwcmludGsoImVuZC5cbiIpOwojZW5kaWYKfQojZW5kaWYKCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogSGVyZSBlbmRzIHRoZSBzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmVzLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQogKiBzZXJpYWwgZHJpdmVyLCBrbm93biBhbHNvIHRoZSAic29mdHdhcmUgaW50ZXJydXB0IiBwcm9jZXNzaW5nLgogKiBUaGlzIHByb2Nlc3NpbmcgaXMgZG9uZSBhdCB0aGUga2VybmVsIGludGVycnVwdCBsZXZlbCwgYWZ0ZXIgdGhlCiAqIHJzX2ludGVycnVwdCgpIGhhcyByZXR1cm5lZCwgQlVUIFdJVEggSU5URVJSVVBUUyBUVVJORUQgT04uICBUaGlzCiAqIGlzIHdoZXJlIHRpbWUtY29uc3VtaW5nIGFjdGl2aXRpZXMgd2hpY2ggY2FuIG5vdCBiZSBkb25lIGluIHRoZQogKiBpbnRlcnJ1cHQgZHJpdmVyIHByb3BlciBhcmUgZG9uZTsgdGhlIGludGVycnVwdCBkcml2ZXIgc2NoZWR1bGVzCiAqIHRoZW0gdXNpbmcgcnNfc2NoZWRfZXZlbnQoKSwgYW5kIHRoZXkgZ2V0IGRvbmUgaGVyZS4KICovCnN0YXRpYyB2b2lkIGRvX3NlcmlhbF9iaCh2b2lkKQp7CglydW5fdGFza19xdWV1ZSgmdHFfc2VyaWFsKTsKfQoKc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKewoJc3RydWN0IGFzeW5jX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopIHByaXZhdGVfOwoJc3RydWN0IHR0eV9zdHJ1Y3QgICAgICAgKnR0eTsKCgl0dHkgPSBpbmZvLT50dHk7CglpZiAoIXR0eSkKCQlyZXR1cm47CgoJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSU19FVkVOVF9XUklURV9XQUtFVVAsICZpbmZvLT5ldmVudCkpIHsKCQl0dHlfd2FrZXVwKHR0eSk7CgkJCiNpZmRlZiBTRVJJQUxfSEFWRV9QT0xMX1dBSVQKCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKI2VuZGlmCgl9Cn0KCi8qCiAqIFRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgUlNfVElNRVIgZ29lcyBvZmYuICBJdCBpcyB1c2VkCiAqIGJ5IHRoZSBzZXJpYWwgZHJpdmVyIHRvIGhhbmRsZSBwb3J0cyB0aGF0IGRvIG5vdCBoYXZlIGFuIGludGVycnVwdAogKiAoaXJxPTApLiAgVGhpcyBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIGZvciAxNjQ1MCdzLCBidXQgZ2l2ZXMgYmFyZWx5CiAqIHBhc3NhYmxlIHJlc3VsdHMgZm9yIGEgMTY1NTBBLiAgKEFsdGhvdWdoIGF0IHRoZSBleHBlbnNlIG9mIG11Y2gKICogQ1BVIG92ZXJoZWFkKS4KICovCnN0YXRpYyB2b2lkIHJzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZHVtbXkpCnsKCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfc3Ryb2JlOwoJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbzsKCXVuc2lnbmVkIGludAlpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAoKGppZmZpZXMgLSBsYXN0X3N0cm9iZSkgPj0gUlNfU1RST0JFX1RJTUUpIHsKCQlmb3IgKGk9MDsgaSA8IE5SX0lSUVM7IGkrKykgewoJCQlpbmZvID0gSVJRX3BvcnRzW2ldOwoJCQlpZiAoIWluZm8pCgkJCQljb250aW51ZTsKCQkJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwojaWZkZWYgQ09ORklHX1NFUklBTF9TSEFSRV9JUlEKCQkJaWYgKGluZm8tPm5leHRfcG9ydCkgewoJCQkJZG8gewoJCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIDApOwoJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwoJCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7CgkJCQkJaW5mbyA9IGluZm8tPm5leHRfcG9ydDsKCQkJCX0gd2hpbGUgKGluZm8pOwojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQKCQkJCWlmIChyc19tdWx0aXBvcnRbaV0ucG9ydDEpCgkJCQkJcnNfaW50ZXJydXB0X211bHRpKGksIE5VTEwsIE5VTEwpOwoJCQkJZWxzZQojZW5kaWYKCQkJCQlyc19pbnRlcnJ1cHQoaSwgTlVMTCwgTlVMTCk7CgkJCX0gZWxzZQojZW5kaWYgLyogQ09ORklHX1NFUklBTF9TSEFSRV9JUlEgKi8KCQkJCXJzX2ludGVycnVwdF9zaW5nbGUoaSwgTlVMTCwgTlVMTCk7CgkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCX0KCX0KCWxhc3Rfc3Ryb2JlID0gamlmZmllczsKCW1vZF90aW1lcigmc2VyaWFsX3RpbWVyLCBqaWZmaWVzICsgUlNfU1RST0JFX1RJTUUpOwoKCWlmIChJUlFfcG9ydHNbMF0pIHsKCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CiNpZmRlZiBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQoJCXJzX2ludGVycnVwdCgwLCBOVUxMLCBOVUxMKTsKI2Vsc2UKCQlyc19pbnRlcnJ1cHRfc2luZ2xlKDAsIE5VTEwsIE5VTEwpOwojZW5kaWYKCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCgkJbW9kX3RpbWVyKCZzZXJpYWxfdGltZXIsIGppZmZpZXMgKyBJUlFfdGltZW91dFswXSk7Cgl9Cn0KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBMb3cgbGV2ZWwgdXRpbGl0eSBzdWJyb3V0aW5lcyBmb3IgdGhlIHNlcmlhbCBkcml2ZXI6ICByb3V0aW5lcyB0bwogKiBmaWd1cmUgb3V0IHRoZSBhcHByb3ByaWF0ZSB0aW1lb3V0IGZvciBhbiBpbnRlcnJ1cHQgY2hhaW4sIHJvdXRpbmVzCiAqIHRvIGluaXRpYWxpemUgYW5kIHN0YXJ0dXAgYSBzZXJpYWwgcG9ydCwgYW5kIHJvdXRpbmVzIHRvIHNodXRkb3duIGEKICogc2VyaWFsIHBvcnQuICBVc2VmdWwgc3R1ZmYgbGlrZSB0aGF0LgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBUaGlzIHJvdXRpbmUgZmlndXJlcyBvdXQgdGhlIGNvcnJlY3QgdGltZW91dCBmb3IgYSBwYXJ0aWN1bGFyIElSUS4KICogSXQgdXNlcyB0aGUgc21hbGxlc3QgdGltZW91dCBvZiBhbGwgb2YgdGhlIHNlcmlhbCBwb3J0cyBpbiBhCiAqIHBhcnRpY3VsYXIgaW50ZXJydXB0IGNoYWluLiAgTm93IG9ubHkgdXNlZCBmb3IgSVJRIDAuLi4uCiAqLwpzdGF0aWMgdm9pZCBmaWd1cmVfSVJRX3RpbWVvdXQoaW50IGlycSkKewoJc3RydWN0CWFzeW5jX3N0cnVjdAkqaW5mbzsKCWludAl0aW1lb3V0ID0gNjAqSFo7CS8qIDYwIHNlY29uZHMgPT09IGEgbG9uZyB0aW1lIDotKSAqLwoKCWluZm8gPSBJUlFfcG9ydHNbaXJxXTsKCWlmICghaW5mbykgewoJCUlSUV90aW1lb3V0W2lycV0gPSA2MCpIWjsKCQlyZXR1cm47Cgl9Cgl3aGlsZSAoaW5mbykgewoJCWlmIChpbmZvLT50aW1lb3V0IDwgdGltZW91dCkKCQkJdGltZW91dCA9IGluZm8tPnRpbWVvdXQ7CgkJaW5mbyA9IGluZm8tPm5leHRfcG9ydDsKCX0KCWlmICghaXJxKQoJCXRpbWVvdXQgPSB0aW1lb3V0IC8gMjsKCUlSUV90aW1lb3V0W2lycV0gPSAodGltZW91dCA+IDMpID8gdGltZW91dC0yIDogMTsKfQoKI2lmZGVmIENPTkZJR19TRVJJQUxfUlNBCi8qIEF0dGVtcHRzIHRvIHR1cm4gb24gdGhlIFJTQSBGSUZPLiAgUmV0dXJucyB6ZXJvIG9uIGZhaWx1cmUgKi8Kc3RhdGljIGludCBlbmFibGVfcnNhKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCnsKCXVuc2lnbmVkIGNoYXIgbW9kZTsKCWludCByZXN1bHQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCW1vZGUgPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfUlNBX01TUik7CglyZXN1bHQgPSBtb2RlICYgVUFSVF9SU0FfTVNSX0ZJRk87CgoJaWYgKCFyZXN1bHQpIHsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX1JTQV9NU1IsIG1vZGUgfCBVQVJUX1JTQV9NU1JfRklGTyk7CgkJbW9kZSA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9SU0FfTVNSKTsKCQlyZXN1bHQgPSBtb2RlICYgVUFSVF9SU0FfTVNSX0ZJRk87Cgl9CgoJcmVzdG9yZV9mbGFncyhmbGFncyk7CglyZXR1cm4gcmVzdWx0Owp9CgovKiBBdHRlbXB0cyB0byB0dXJuIG9mZiB0aGUgUlNBIEZJRk8uICBSZXR1cm5zIHplcm8gb24gZmFpbHVyZSAqLwpzdGF0aWMgaW50IGRpc2FibGVfcnNhKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCnsKCXVuc2lnbmVkIGNoYXIgbW9kZTsKCWludCByZXN1bHQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCW1vZGUgPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfUlNBX01TUik7CglyZXN1bHQgPSAhKG1vZGUgJiBVQVJUX1JTQV9NU1JfRklGTyk7CgoJaWYgKCFyZXN1bHQpIHsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX1JTQV9NU1IsIG1vZGUgJiB+VUFSVF9SU0FfTVNSX0ZJRk8pOwoJCW1vZGUgPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfUlNBX01TUik7CgkJcmVzdWx0ID0gIShtb2RlICYgVUFSVF9SU0FfTVNSX0ZJRk8pOwoJfQoKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJcmV0dXJuIHJlc3VsdDsKfQojZW5kaWYgLyogQ09ORklHX1NFUklBTF9SU0EgKi8KCnN0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludAlyZXR2YWw9MDsKCXZvaWQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CglzdHJ1Y3Qgc2VyaWFsX3N0YXRlICpzdGF0ZT0gaW5mby0+c3RhdGU7Cgl1bnNpZ25lZCBsb25nIHBhZ2U7CiNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKCXVuc2lnbmVkIHNob3J0IElDUDsKI2VuZGlmCgoJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKCWlmICghcGFnZSkKCQlyZXR1cm4gLUVOT01FTTsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CgoJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKCQlmcmVlX3BhZ2UocGFnZSk7CgkJZ290byBlcnJvdXQ7Cgl9CgoJaWYgKCFDT05GSUdVUkVEX1NFUklBTF9QT1JUKHN0YXRlKSB8fCAhc3RhdGUtPnR5cGUpIHsKCQlpZiAoaW5mby0+dHR5KQoJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwoJCWZyZWVfcGFnZShwYWdlKTsKCQlnb3RvIGVycm91dDsKCX0KCWlmIChpbmZvLT54bWl0LmJ1ZikKCQlmcmVlX3BhZ2UocGFnZSk7CgllbHNlCgkJaW5mby0+eG1pdC5idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwoKI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCglwcmludGsoInN0YXJ0aW5nIHVwIHR0eXMlZCAoaXJxICVkKS4uLiIsIGluZm8tPmxpbmUsIHN0YXRlLT5pcnEpOwojZW5kaWYKCglpZiAodWFydF9jb25maWdbc3RhdGUtPnR5cGVdLmZsYWdzICYgVUFSVF9TVEFSVEVDSCkgewoJCS8qIFdha2UgdXAgVUFSVCAqLwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCAweEJGKTsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0VGUiwgVUFSVF9FRlJfRUNCKTsKCQkvKgoJCSAqIFR1cm4gb2ZmIExDUiA9PSAweEJGIHNvIHdlIGFjdHVhbGx5IHNldCB0aGUgSUVSCgkJICogcmVnaXN0ZXIgb24gdGhlIFhSMTZDODUwCgkJICovCgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDApOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfSUVSLCAwKTsKCQkvKgoJCSAqIE5vdyByZXNldCBMQ1Igc28gd2UgY2FuIHR1cm4gb2ZmIHRoZSBFQ0IgYml0CgkJICovCgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDB4QkYpOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRUZSLCAwKTsKCQkvKgoJCSAqIEZvciBhIFhSMTZDODUwLCB3ZSBuZWVkIHRvIHNldCB0aGUgdHJpZ2dlciBsZXZlbHMKCQkgKi8KCQlpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF8xNjg1MCkgewoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0ZDVFIsIFVBUlRfRkNUUl9UUkdEIHwKCQkJCQlVQVJUX0ZDVFJfUlgpOwoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX1RSRywgVUFSVF9UUkdfOTYpOwoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0ZDVFIsIFVBUlRfRkNUUl9UUkdEIHwKCQkJCQlVQVJUX0ZDVFJfVFgpOwoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX1RSRywgVUFSVF9UUkdfOTYpOwoJCX0KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMCk7Cgl9CgoJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfMTY3NTApIHsKCQkvKiBXYWtlIHVwIFVBUlQgKi8KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgMCk7Cgl9CgoJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfMTZDOTUwKSB7CgkJLyogV2FrZSB1cCBhbmQgaW5pdGlhbGl6ZSBVQVJUICovCgkJaW5mby0+QUNSID0gMDsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMHhCRik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9JRVIsIDApOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCAwKTsKCQlzZXJpYWxfaWNyX3dyaXRlKGluZm8sIFVBUlRfQ1NSLCAwKTsgLyogUmVzZXQgdGhlIFVBUlQgKi8KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMHhCRik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDApOwoJfQoKI2lmZGVmIENPTkZJR19TRVJJQUxfUlNBCgkvKgoJICogSWYgdGhpcyBpcyBhbiBSU0EgcG9ydCwgc2VlIGlmIHdlIGNhbiBraWNrIGl0IHVwIHRvIHRoZQoJICogaGlnaGVyIHNwZWVkIGNsb2NrLgoJICovCglpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF9SU0EpIHsKCQlpZiAoc3RhdGUtPmJhdWRfYmFzZSAhPSBTRVJJQUxfUlNBX0JBVURfQkFTRSAmJgoJCSAgICBlbmFibGVfcnNhKGluZm8pKQoJCQlzdGF0ZS0+YmF1ZF9iYXNlID0gU0VSSUFMX1JTQV9CQVVEX0JBU0U7CgkJaWYgKHN0YXRlLT5iYXVkX2Jhc2UgPT0gU0VSSUFMX1JTQV9CQVVEX0JBU0UpCgkJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfUlNBX0ZSUiwgMCk7Cgl9CiNlbmRpZgoKCS8qCgkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KCSAqICh0aGV5IHdpbGwgYmUgcmVlbmFibGVkIGluIGNoYW5nZV9zcGVlZCgpKQoJICovCglpZiAodWFydF9jb25maWdbc3RhdGUtPnR5cGVdLmZsYWdzICYgVUFSVF9DTEVBUl9GSUZPKSB7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0ZDUiwgKFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKCQkJCQkgICAgIFVBUlRfRkNSX0NMRUFSX1JDVlIgfAoJCQkJCSAgICAgVUFSVF9GQ1JfQ0xFQVJfWE1JVCkpOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLCAwKTsKCX0KCgkvKgoJICogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMuCgkgKi8KCSh2b2lkKSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfTFNSKTsKCSh2b2lkKSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfUlgpOwoJKHZvaWQpIHNlcmlhbF9pbnAoaW5mbywgVUFSVF9JSVIpOwoJKHZvaWQpIHNlcmlhbF9pbnAoaW5mbywgVUFSVF9NU1IpOwoKCS8qCgkgKiBBdCB0aGlzIHBvaW50IHRoZXJlJ3Mgbm8gd2F5IHRoZSBMU1IgY291bGQgc3RpbGwgYmUgMHhGRjsKCSAqIGlmIGl0IGlzLCB0aGVuIGJhaWwgb3V0LCBiZWNhdXNlIHRoZXJlJ3MgbGlrZWx5IG5vIFVBUlQKCSAqIGhlcmUuCgkgKi8KCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQlVHR1lfVUFSVCkgJiYKCSAgICAoc2VyaWFsX2lucChpbmZvLCBVQVJUX0xTUikgPT0gMHhmZikpIHsKCQlwcmludGsoInR0eVMlZDogTFNSIHNhZmV0eSBjaGVjayBlbmdhZ2VkIVxuIiwgc3RhdGUtPmxpbmUpOwoJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJCWlmIChpbmZvLT50dHkpCgkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwoJCX0gZWxzZQoJCQlyZXR2YWwgPSAtRU5PREVWOwoJCWdvdG8gZXJyb3V0OwoJfQoJCgkvKgoJICogQWxsb2NhdGUgdGhlIElSUSBpZiBuZWNlc3NhcnkKCSAqLwoJaWYgKHN0YXRlLT5pcnEgJiYgKCFJUlFfcG9ydHNbc3RhdGUtPmlycV0gfHwKCQkJICAhSVJRX3BvcnRzW3N0YXRlLT5pcnFdLT5uZXh0X3BvcnQpKSB7CgkJaWYgKElSUV9wb3J0c1tzdGF0ZS0+aXJxXSkgewojaWZkZWYgQ09ORklHX1NFUklBTF9TSEFSRV9JUlEKCQkJZnJlZV9pcnEoc3RhdGUtPmlycSwgJklSUV9wb3J0c1tzdGF0ZS0+aXJxXSk7CiNpZmRlZiBDT05GSUdfU0VSSUFMX01VTFRJUE9SVAkJCQkKCQkJaWYgKHJzX211bHRpcG9ydFtzdGF0ZS0+aXJxXS5wb3J0MSkKCQkJCWhhbmRsZXIgPSByc19pbnRlcnJ1cHRfbXVsdGk7CgkJCWVsc2UKI2VuZGlmCgkJCQloYW5kbGVyID0gcnNfaW50ZXJydXB0OwojZWxzZQoJCQlyZXR2YWwgPSAtRUJVU1k7CgkJCWdvdG8gZXJyb3V0OwojZW5kaWYgLyogQ09ORklHX1NFUklBTF9TSEFSRV9JUlEgKi8KCQl9IGVsc2UgCgkJCWhhbmRsZXIgPSByc19pbnRlcnJ1cHRfc2luZ2xlOwoKCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzdGF0ZS0+aXJxLCBoYW5kbGVyLCBTQV9TSElSUSwKCQkJCSAgICAgInNlcmlhbCIsICZJUlFfcG9ydHNbc3RhdGUtPmlycV0pOwoJCWlmIChyZXR2YWwpIHsKCQkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKCQkJCWlmIChpbmZvLT50dHkpCgkJCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsCgkJCQkJCSZpbmZvLT50dHktPmZsYWdzKTsKCQkJCXJldHZhbCA9IDA7CgkJCX0KCQkJZ290byBlcnJvdXQ7CgkJfQoJfQoKCS8qCgkgKiBJbnNlcnQgc2VyaWFsIHBvcnQgaW50byBJUlEgY2hhaW4uCgkgKi8KCWluZm8tPnByZXZfcG9ydCA9IDA7CglpbmZvLT5uZXh0X3BvcnQgPSBJUlFfcG9ydHNbc3RhdGUtPmlycV07CglpZiAoaW5mby0+bmV4dF9wb3J0KQoJCWluZm8tPm5leHRfcG9ydC0+cHJldl9wb3J0ID0gaW5mbzsKCUlSUV9wb3J0c1tzdGF0ZS0+aXJxXSA9IGluZm87CglmaWd1cmVfSVJRX3RpbWVvdXQoc3RhdGUtPmlycSk7CgoJLyoKCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgVUFSVCAKCSAqLwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsJLyogcmVzZXQgRExBQiAqLwoKCWluZm8tPk1DUiA9IDA7CglpZiAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCgkJaW5mby0+TUNSID0gVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTOwojaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19GT1VSUE9SVCkgewoJCWlmIChzdGF0ZS0+aXJxID09IDApCgkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9PVVQxOwoJfSBlbHNlCiNlbmRpZgoJewoJCWlmIChzdGF0ZS0+aXJxICE9IDApCgkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9PVVQyOwoJfQoJaW5mby0+TUNSIHw9IEFMUEhBX0tMVURHRV9NQ1I7IAkJLyogRG9uJ3QgYXNrICovCglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX01DUiwgaW5mby0+TUNSKTsKCQoJLyoKCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCgkgKi8KCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgaW5mby0+SUVSKTsJLyogZW5hYmxlIGludGVycnVwdHMgKi8KCQojaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19GT1VSUE9SVCkgewoJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBBU1QgRm91cnBvcnQgYm9hcmQgKi8KCQlJQ1AgPSAoaW5mby0+cG9ydCAmIDB4RkUwKSB8IDB4MDFGOwoJCW91dGJfcCgweDgwLCBJQ1ApOwoJCSh2b2lkKSBpbmJfcChJQ1ApOwoJfQojZW5kaWYKCgkvKgoJICogQW5kIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFnYWluIGZvciBsdWNrLgoJICovCgkodm9pZClzZXJpYWxfaW5wKGluZm8sIFVBUlRfTFNSKTsKCSh2b2lkKXNlcmlhbF9pbnAoaW5mbywgVUFSVF9SWCk7Cgkodm9pZClzZXJpYWxfaW5wKGluZm8sIFVBUlRfSUlSKTsKCSh2b2lkKXNlcmlhbF9pbnAoaW5mbywgVUFSVF9NU1IpOwoKCWlmIChpbmZvLT50dHkpCgkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwoJaW5mby0+eG1pdC5oZWFkID0gaW5mby0+eG1pdC50YWlsID0gMDsKCgkvKgoJICogU2V0IHVwIHNlcmlhbCB0aW1lcnMuLi4KCSAqLwoJbW9kX3RpbWVyKCZzZXJpYWxfdGltZXIsIGppZmZpZXMgKyAyKkhaLzEwMCk7CgoJLyoKCSAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCgkgKi8KI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gMTMxMzk0KSAvKiBMaW51eCAyLjEuNjYgKi8KCWlmIChpbmZvLT50dHkpIHsKCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCgkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOwoJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7CgkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7Cgl9CiNlbmRpZgoJCgkvKgoJICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0CgkgKi8KCWNoYW5nZV9zcGVlZChpbmZvLCAwKTsKCglpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJcmV0dXJuIDA7CgkKZXJyb3V0OgoJcmVzdG9yZV9mbGFncyhmbGFncyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKgogKiBUaGlzIHJvdXRpbmUgd2lsbCBzaHV0ZG93biBhIHNlcmlhbCBwb3J0OyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgYW5kCiAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCiAqLwpzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbykKewoJdW5zaWduZWQgbG9uZwlmbGFnczsKCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlOwoJaW50CQlyZXR2YWw7CgoJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCgkJcmV0dXJuOwoKCXN0YXRlID0gaW5mby0+c3RhdGU7CgojaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KCXByaW50aygiU2h1dHRpbmcgZG93biBzZXJpYWwgcG9ydCAlZCAoaXJxICVkKS4uLi4iLCBpbmZvLT5saW5lLAoJICAgICAgIHN0YXRlLT5pcnEpOwojZW5kaWYKCQoJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOyAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCgkvKgoJICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCgkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAoJICovCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKCQoJLyoKCSAqIEZpcnN0IHVubGluayB0aGUgc2VyaWFsIHBvcnQgZnJvbSB0aGUgSVJRIGNoYWluLi4uCgkgKi8KCWlmIChpbmZvLT5uZXh0X3BvcnQpCgkJaW5mby0+bmV4dF9wb3J0LT5wcmV2X3BvcnQgPSBpbmZvLT5wcmV2X3BvcnQ7CglpZiAoaW5mby0+cHJldl9wb3J0KQoJCWluZm8tPnByZXZfcG9ydC0+bmV4dF9wb3J0ID0gaW5mby0+bmV4dF9wb3J0OwoJZWxzZQoJCUlSUV9wb3J0c1tzdGF0ZS0+aXJxXSA9IGluZm8tPm5leHRfcG9ydDsKCWZpZ3VyZV9JUlFfdGltZW91dChzdGF0ZS0+aXJxKTsKCQoJLyoKCSAqIEZyZWUgdGhlIElSUSwgaWYgbmVjZXNzYXJ5CgkgKi8KCWlmIChzdGF0ZS0+aXJxICYmICghSVJRX3BvcnRzW3N0YXRlLT5pcnFdIHx8CgkJCSAgIUlSUV9wb3J0c1tzdGF0ZS0+aXJxXS0+bmV4dF9wb3J0KSkgewoJCWlmIChJUlFfcG9ydHNbc3RhdGUtPmlycV0pIHsKCQkJZnJlZV9pcnEoc3RhdGUtPmlycSwgJklSUV9wb3J0c1tzdGF0ZS0+aXJxXSk7CgkJCXJldHZhbCA9IHJlcXVlc3RfaXJxKHN0YXRlLT5pcnEsIHJzX2ludGVycnVwdF9zaW5nbGUsCgkJCQkJICAgICBTQV9TSElSUSwgInNlcmlhbCIsCgkJCQkJICAgICAmSVJRX3BvcnRzW3N0YXRlLT5pcnFdKTsKCQkJCgkJCWlmIChyZXR2YWwpCgkJCQlwcmludGsoInNlcmlhbCBzaHV0ZG93bjogcmVxdWVzdF9pcnE6IGVycm9yICVkIgoJCQkJICAgICAgICIgIENvdWxkbid0IHJlYWNxdWlyZSBJUlEuXG4iLCByZXR2YWwpOwoJCX0gZWxzZQoJCQlmcmVlX2lycShzdGF0ZS0+aXJxLCAmSVJRX3BvcnRzW3N0YXRlLT5pcnFdKTsKCX0KCglpZiAoaW5mby0+eG1pdC5idWYpIHsKCQl1bnNpZ25lZCBsb25nIHBnID0gKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXQuYnVmOwoJCWluZm8tPnhtaXQuYnVmID0gMDsKCQlmcmVlX3BhZ2UocGcpOwoJfQoKCWluZm8tPklFUiA9IDA7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgMHgwMCk7CS8qIGRpc2FibGUgYWxsIGludHJzICovCiNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0ZPVVJQT1JUKSB7CgkJLyogcmVzZXQgaW50ZXJydXB0cyBvbiB0aGUgQVNUIEZvdXJwb3J0IGJvYXJkICovCgkJKHZvaWQpIGluYigoaW5mby0+cG9ydCAmIDB4RkUwKSB8IDB4MDFGKTsKCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfT1VUMTsKCX0gZWxzZQojZW5kaWYKCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX09VVDI7CglpbmZvLT5NQ1IgfD0gQUxQSEFfS0xVREdFX01DUjsgCQkvKiBEb24ndCBhc2sgKi8KCQoJLyogZGlzYWJsZSBicmVhayBjb25kaXRpb24gKi8KCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9MQ1IsIHNlcmlhbF9pbnAoaW5mbywgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQyk7CgkKCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpCgkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX01DUiwgaW5mby0+TUNSKTsKCgkvKiBkaXNhYmxlIEZJRk8ncyAqLwkKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLCAoVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAoJCQkJICAgICBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKCQkJCSAgICAgVUFSVF9GQ1JfQ0xFQVJfWE1JVCkpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIDApOwoKI2lmZGVmIENPTkZJR19TRVJJQUxfUlNBCgkvKgoJICogUmVzZXQgdGhlIFJTQSBib2FyZCBiYWNrIHRvIDExNWticHMgY29tcGF0IG1vZGUuCgkgKi8KCWlmICgoc3RhdGUtPnR5cGUgPT0gUE9SVF9SU0EpICYmCgkgICAgKHN0YXRlLT5iYXVkX2Jhc2UgPT0gU0VSSUFMX1JTQV9CQVVEX0JBU0UgJiYKCSAgICAgZGlzYWJsZV9yc2EoaW5mbykpKQoJCXN0YXRlLT5iYXVkX2Jhc2UgPSBTRVJJQUxfUlNBX0JBVURfQkFTRV9MTzsKI2VuZGlmCgkKCgkodm9pZClzZXJpYWxfaW4oaW5mbywgVUFSVF9SWCk7ICAgIC8qIHJlYWQgZGF0YSBwb3J0IHRvIHJlc2V0IHRoaW5ncyAqLwoJCglpZiAoaW5mby0+dHR5KQoJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CgoJaWYgKHVhcnRfY29uZmlnW2luZm8tPnN0YXRlLT50eXBlXS5mbGFncyAmIFVBUlRfU1RBUlRFQ0gpIHsKCQkvKiBBcnJhbmdlIHRvIGVudGVyIHNsZWVwIG1vZGUgKi8KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMHhCRik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDApOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfSUVSLCBVQVJUX0lFUlhfU0xFRVApOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCAweEJGKTsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0VGUiwgMCk7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDApOwoJfQoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfMTY3NTApIHsKCQkvKiBBcnJhbmdlIHRvIGVudGVyIHNsZWVwIG1vZGUgKi8KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgVUFSVF9JRVJYX1NMRUVQKTsKCX0KCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwp9CgojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IDEzMTM5NCkgLyogTGludXggMi4xLjY2ICovCnN0YXRpYyBpbnQgYmF1ZF90YWJsZVtdID0gewoJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwKCTYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsCgkzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDAgfTsKCnN0YXRpYyBpbnQgdHR5X2dldF9iYXVkX3JhdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKewoJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Cgl1bnNpZ25lZCBpbnQgY2ZsYWcsIGk7CgoJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CgoJaSA9IGNmbGFnICYgQ0JBVUQ7CglpZiAoaSAmIENCQVVERVgpIHsKCQlpICY9IH5DQkFVREVYOwoJCWlmIChpIDwgMSB8fCBpID4gMikgCgkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKCQllbHNlCgkJCWkgKz0gMTU7Cgl9CglpZiAoaSA9PSAxNSkgewoJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQoJCQlpICs9IDE7CgkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQoJCQlpICs9IDI7Cgl9CglyZXR1cm4gYmF1ZF90YWJsZVtpXTsKfQojZW5kaWYKCi8qCiAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCiAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgogKi8Kc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sCgkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCnsKCWludAlxdW90ID0gMCwgYmF1ZF9iYXNlLCBiYXVkOwoJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjciA9IDA7CglpbnQJYml0czsKCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CgoJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKCQlyZXR1cm47CgljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKCWlmICghQ09ORklHVVJFRF9TRVJJQUxfUE9SVChpbmZvKSkKCQlyZXR1cm47CgoJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewoJICAgICAgY2FzZSBDUzU6IGN2YWwgPSAweDAwOyBiaXRzID0gNzsgYnJlYWs7CgkgICAgICBjYXNlIENTNjogY3ZhbCA9IDB4MDE7IGJpdHMgPSA4OyBicmVhazsKCSAgICAgIGNhc2UgQ1M3OiBjdmFsID0gMHgwMjsgYml0cyA9IDk7IGJyZWFrOwoJICAgICAgY2FzZSBDUzg6IGN2YWwgPSAweDAzOyBiaXRzID0gMTA7IGJyZWFrOwoJICAgICAgLyogTmV2ZXIgaGFwcGVucywgYnV0IEdDQyBpcyB0b28gZHVtYiB0byBmaWd1cmUgaXQgb3V0ICovCgkgICAgICBkZWZhdWx0OiAgY3ZhbCA9IDB4MDA7IGJpdHMgPSA3OyBicmVhazsKCSAgICAgIH0KCWlmIChjZmxhZyAmIENTVE9QQikgewoJCWN2YWwgfD0gMHgwNDsKCQliaXRzKys7Cgl9CglpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKCQliaXRzKys7Cgl9CglpZiAoIShjZmxhZyAmIFBBUk9ERCkpCgkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwojaWZkZWYgQ01TUEFSCglpZiAoY2ZsYWcgJiBDTVNQQVIpCgkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOwojZW5kaWYKCgkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOwoJaWYgKCFiYXVkKQoJCWJhdWQgPSA5NjAwOwkvKiBCMCB0cmFuc2l0aW9uIGhhbmRsZWQgaW4gcnNfc2V0X3Rlcm1pb3MgKi8KI2lmZGVmIENPTkZJR19TRVJJQUxfUlNBCglpZiAoKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfUlNBKSAmJgoJICAgIChpbmZvLT5zdGF0ZS0+YmF1ZF9iYXNlICE9IFNFUklBTF9SU0FfQkFVRF9CQVNFKSAmJgoJICAgIGVuYWJsZV9yc2EoaW5mbykpCgkJaW5mby0+c3RhdGUtPmJhdWRfYmFzZSA9IFNFUklBTF9SU0FfQkFVRF9CQVNFOwojZW5kaWYKCWJhdWRfYmFzZSA9IGluZm8tPnN0YXRlLT5iYXVkX2Jhc2U7CglpZiAoaW5mby0+c3RhdGUtPnR5cGUgPT0gUE9SVF8xNkM5NTApIHsKCQlpZiAoYmF1ZCA8PSBiYXVkX2Jhc2UpCgkJCXNlcmlhbF9pY3Jfd3JpdGUoaW5mbywgVUFSVF9UQ1IsIDApOwoJCWVsc2UgaWYgKGJhdWQgPD0gMipiYXVkX2Jhc2UpIHsKCQkJc2VyaWFsX2ljcl93cml0ZShpbmZvLCBVQVJUX1RDUiwgMHg4KTsKCQkJYmF1ZF9iYXNlID0gYmF1ZF9iYXNlICogMjsKCQl9IGVsc2UgaWYgKGJhdWQgPD0gNCpiYXVkX2Jhc2UpIHsKCQkJc2VyaWFsX2ljcl93cml0ZShpbmZvLCBVQVJUX1RDUiwgMHg0KTsKCQkJYmF1ZF9iYXNlID0gYmF1ZF9iYXNlICogNDsKCQl9IGVsc2UKCQkJc2VyaWFsX2ljcl93cml0ZShpbmZvLCBVQVJUX1RDUiwgMCk7Cgl9CglpZiAoYmF1ZCA9PSAzODQwMCAmJgoJICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKQoJCXF1b3QgPSBpbmZvLT5zdGF0ZS0+Y3VzdG9tX2Rpdmlzb3I7CgllbHNlIHsKCQlpZiAoYmF1ZCA9PSAxMzQpCgkJCS8qIFNwZWNpYWwgY2FzZSBzaW5jZSAxMzQgaXMgcmVhbGx5IDEzNC41ICovCgkJCXF1b3QgPSAoMipiYXVkX2Jhc2UgLyAyNjkpOwoJCWVsc2UgaWYgKGJhdWQpCgkJCXF1b3QgPSBiYXVkX2Jhc2UgLyBiYXVkOwoJfQoJLyogSWYgdGhlIHF1b3RpZW50IGlzIHplcm8gcmVmdXNlIHRoZSBjaGFuZ2UgKi8KCWlmICghcXVvdCAmJiBvbGRfdGVybWlvcykgewoJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CgkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKTsKCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKCQlpZiAoIWJhdWQpCgkJCWJhdWQgPSA5NjAwOwoJCWlmIChiYXVkID09IDM4NDAwICYmCgkJICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKQoJCQlxdW90ID0gaW5mby0+c3RhdGUtPmN1c3RvbV9kaXZpc29yOwoJCWVsc2UgewoJCQlpZiAoYmF1ZCA9PSAxMzQpCgkJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLwoJCQkJcXVvdCA9ICgyKmJhdWRfYmFzZSAvIDI2OSk7CgkJCWVsc2UgaWYgKGJhdWQpCgkJCQlxdW90ID0gYmF1ZF9iYXNlIC8gYmF1ZDsKCQl9Cgl9CgkvKiBBcyBhIGxhc3QgcmVzb3J0LCBpZiB0aGUgcXVvdGllbnQgaXMgemVybywgZGVmYXVsdCB0byA5NjAwIGJwcyAqLwoJaWYgKCFxdW90KQoJCXF1b3QgPSBiYXVkX2Jhc2UgLyA5NjAwOwoJLyoKCSAqIFdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSBPeGZvcmQgU2VtaWNvbmR1Y3RvciA5NTIgcmV2IEIKCSAqIGNoaXAgd2hpY2ggY2F1c2VzIGl0IHRvIHNlcmlvdXNseSBtaXNjYWxjdWxhdGUgYmF1ZCByYXRlcwoJICogd2hlbiBETEwgaXMgMC4KCSAqLwoJaWYgKCgocXVvdCAmIDB4RkYpID09IDApICYmIChpbmZvLT5zdGF0ZS0+dHlwZSA9PSBQT1JUXzE2Qzk1MCkgJiYKCSAgICAoaW5mby0+c3RhdGUtPnJldmlzaW9uID09IDB4NTIwMSkpCgkJcXVvdCsrOwoJCglpbmZvLT5xdW90ID0gcXVvdDsKCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKmJpdHMqcXVvdCkgLyBiYXVkX2Jhc2UpOwoJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCgoJLyogU2V0IHVwIEZJRk8ncyAqLwoJaWYgKHVhcnRfY29uZmlnW2luZm8tPnN0YXRlLT50eXBlXS5mbGFncyAmIFVBUlRfVVNFX0ZJRk8pIHsKCQlpZiAoKGluZm8tPnN0YXRlLT5iYXVkX2Jhc2UgLyBxdW90KSA8IDI0MDApCgkJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfVFJJR0dFUl8xOwojaWZkZWYgQ09ORklHX1NFUklBTF9SU0EKCQllbHNlIGlmIChpbmZvLT5zdGF0ZS0+dHlwZSA9PSBQT1JUX1JTQSkKCQkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9UUklHR0VSXzE0OwojZW5kaWYKCQllbHNlCgkJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfVFJJR0dFUl84OwoJfQoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfMTY3NTApCgkJZmNyIHw9IFVBUlRfRkNSN182NEJZVEU7CgkKCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfTVNJOwoJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSEFSRFBQU19DRCkKCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOwoJaWYgKGNmbGFnICYgQ1JUU0NUUykgewoJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOwoJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7Cgl9IGVsc2UKCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CglpZiAoY2ZsYWcgJiBDTE9DQUwpCgkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOwoJZWxzZSB7CgkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CgkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKCX0KCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7CgoJLyoKCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwoJICovCiNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQoKCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCgkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwoJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwoJCgkvKgoJICogQ2hhcmFjdGVycyB0byBpZ25vcmUKCSAqLwoJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQoJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwoJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CgkJLyoKCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCgkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KCQkgKi8KCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FOwoJfQoJLyoKCSAqICEhISBpZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgbm90IHNldAoJICovCglpZiAoKGNmbGFnICYgQ1JFQUQpID09IDApCgkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0RSOwoJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwoJaWYgKHVhcnRfY29uZmlnW2luZm8tPnN0YXRlLT50eXBlXS5mbGFncyAmIFVBUlRfU1RBUlRFQ0gpIHsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMHhCRik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9FRlIsCgkJCSAgICAoY2ZsYWcgJiBDUlRTQ1RTKSA/IFVBUlRfRUZSX0NUUyA6IDApOwoJfQoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIGN2YWwgfCBVQVJUX0xDUl9ETEFCKTsJLyogc2V0IERMQUIgKi8KCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExMLCBxdW90ICYgMHhmZik7CS8qIExTIG9mIGRpdmlzb3IgKi8KCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExNLCBxdW90ID4+IDgpOwkJLyogTVMgb2YgZGl2aXNvciAqLwoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfMTY3NTApCgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIGZjcik7IAkvKiBzZXQgZmNyICovCglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgY3ZhbCk7CQkvKiByZXNldCBETEFCICovCglpbmZvLT5MQ1IgPSBjdmFsOwkJCQkvKiBTYXZlIExDUiAqLwogCWlmIChpbmZvLT5zdGF0ZS0+dHlwZSAhPSBQT1JUXzE2NzUwKSB7CiAJCWlmIChmY3IgJiBVQVJUX0ZDUl9FTkFCTEVfRklGTykgewogCQkJLyogZW11bGF0ZWQgVUFSVHMgKEx1Y2VudCBWZW51cyAxNjd4KSBuZWVkIHR3byBzdGVwcyAqLwogCQkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKIAkJfQoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLCBmY3IpOyAJLyogc2V0IGZjciAqLwoJfQoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cn0KCnN0YXRpYyB2b2lkIHJzX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm87Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWlmICghdHR5KQoJCXJldHVybjsKCQoJaW5mbyA9ICAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CgkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19wdXRfY2hhciIpKQoJCXJldHVybjsKCglpZiAoIWluZm8tPnhtaXQuYnVmKQoJCXJldHVybjsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglpZiAoQ0lSQ19TUEFDRShpbmZvLT54bWl0LmhlYWQsCgkJICAgICAgIGluZm8tPnhtaXQudGFpbCwKCQkgICAgICAgU0VSSUFMX1hNSVRfU0laRSkgPT0gMCkgewoJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCXJldHVybjsKCX0KCglpbmZvLT54bWl0LmJ1ZltpbmZvLT54bWl0LmhlYWRdID0gY2g7CglpbmZvLT54bWl0LmhlYWQgPSAoaW5mby0+eG1pdC5oZWFkICsgMSkgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwp9CgpzdGF0aWMgdm9pZCByc19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQp7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQkJCQoJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPmRldmljZSwgInJzX2ZsdXNoX2NoYXJzIikpCgkJcmV0dXJuOwoKCWlmIChpbmZvLT54bWl0LmhlYWQgPT0gaW5mby0+eG1pdC50YWlsCgkgICAgfHwgdHR5LT5zdG9wcGVkCgkgICAgfHwgdHR5LT5od19zdG9wcGVkCgkgICAgfHwgIWluZm8tPnhtaXQuYnVmKQoJCXJldHVybjsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKfQoKc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgaW50IGZyb21fdXNlciwKCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCnsKCWludAljLCByZXQgPSAwOwoJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbzsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkJCQkKCWlmICghdHR5KQoJCXJldHVybiAwOwoKCWluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CgkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc193cml0ZSIpKQoJCXJldHVybiAwOwoKCWlmICghaW5mby0+eG1pdC5idWYgfHwgIXRtcF9idWYpCgkJcmV0dXJuIDA7CgoJc2F2ZV9mbGFncyhmbGFncyk7CglpZiAoZnJvbV91c2VyKSB7CgkJZG93bigmdG1wX2J1Zl9zZW0pOwoJCXdoaWxlICgxKSB7CgkJCWludCBjMTsKCQkJYyA9IENJUkNfU1BBQ0VfVE9fRU5EKGluZm8tPnhtaXQuaGVhZCwKCQkJCQkgICAgICBpbmZvLT54bWl0LnRhaWwsCgkJCQkJICAgICAgU0VSSUFMX1hNSVRfU0laRSk7CgkJCWlmIChjb3VudCA8IGMpCgkJCQljID0gY291bnQ7CgkJCWlmIChjIDw9IDApCgkJCQlicmVhazsKCgkJCWMgLT0gY29weV9mcm9tX3VzZXIodG1wX2J1ZiwgYnVmLCBjKTsKCQkJaWYgKCFjKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2xpKCk7CgkJCWMxID0gQ0lSQ19TUEFDRV9UT19FTkQoaW5mby0+eG1pdC5oZWFkLAoJCQkJCSAgICAgICBpbmZvLT54bWl0LnRhaWwsCgkJCQkJICAgICAgIFNFUklBTF9YTUlUX1NJWkUpOwoJCQlpZiAoYzEgPCBjKQoJCQkJYyA9IGMxOwoJCQltZW1jcHkoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LmhlYWQsIHRtcF9idWYsIGMpOwoJCQlpbmZvLT54bWl0LmhlYWQgPSAoKGluZm8tPnhtaXQuaGVhZCArIGMpICYKCQkJCQkgICAoU0VSSUFMX1hNSVRfU0laRS0xKSk7CgkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCQlidWYgKz0gYzsKCQkJY291bnQgLT0gYzsKCQkJcmV0ICs9IGM7CgkJfQoJCXVwKCZ0bXBfYnVmX3NlbSk7Cgl9IGVsc2UgewoJCWNsaSgpOwoJCXdoaWxlICgxKSB7CgkJCWMgPSBDSVJDX1NQQUNFX1RPX0VORChpbmZvLT54bWl0LmhlYWQsCgkJCQkJICAgICAgaW5mby0+eG1pdC50YWlsLAoJCQkJCSAgICAgIFNFUklBTF9YTUlUX1NJWkUpOwoJCQlpZiAoY291bnQgPCBjKQoJCQkJYyA9IGNvdW50OwoJCQlpZiAoYyA8PSAwKSB7CgkJCQlicmVhazsKCQkJfQoJCQltZW1jcHkoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LmhlYWQsIGJ1ZiwgYyk7CgkJCWluZm8tPnhtaXQuaGVhZCA9ICgoaW5mby0+eG1pdC5oZWFkICsgYykgJgoJCQkJCSAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKCQkJYnVmICs9IGM7CgkJCWNvdW50IC09IGM7CgkJCXJldCArPSBjOwoJCX0KCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCX0KCWlmIChpbmZvLT54bWl0LmhlYWQgIT0gaW5mby0+eG1pdC50YWlsCgkgICAgJiYgIXR0eS0+c3RvcHBlZAoJICAgICYmICF0dHktPmh3X3N0b3BwZWQKCSAgICAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CgkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX0lFUiwgaW5mby0+SUVSKTsKCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQp7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc193cml0ZV9yb29tIikpCgkJcmV0dXJuIDA7CglyZXR1cm4gQ0lSQ19TUEFDRShpbmZvLT54bWl0LmhlYWQsIGluZm8tPnhtaXQudGFpbCwgU0VSSUFMX1hNSVRfU0laRSk7Cn0KCnN0YXRpYyBpbnQgcnNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CgkJCQkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19jaGFyc19pbl9idWZmZXIiKSkKCQlyZXR1cm4gMDsKCXJldHVybiBDSVJDX0NOVChpbmZvLT54bWl0LmhlYWQsIGluZm8tPnhtaXQudGFpbCwgU0VSSUFMX1hNSVRfU0laRSk7Cn0KCnN0YXRpYyB2b2lkIHJzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQp7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQoJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPmRldmljZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQoJCXJldHVybjsKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCWluZm8tPnhtaXQuaGVhZCA9IGluZm8tPnhtaXQudGFpbCA9IDA7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKI2lmZGVmIFNFUklBTF9IQVZFX1BPTExfV0FJVAoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CiNlbmRpZgoJdHR5X3dha2V1cCh0dHkpOwp9CgovKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCiAqIHRoZSBkZXZpY2UKICovCnN0YXRpYyB2b2lkIHJzX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKewoJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKCglpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+ZGV2aWNlLCAicnNfc2VuZF9jaGFyIikpCgkJcmV0dXJuOwoKCWluZm8tPnhfY2hhciA9IGNoOwoJaWYgKGNoKSB7CgkJLyogTWFrZSBzdXJlIHRyYW5zbWl0IGludGVycnVwdHMgYXJlIG9uICovCgkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX0lFUiwgaW5mby0+SUVSKTsKCX0KfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJzX3Rocm90dGxlKCkKICogCiAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAogKiBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZvaWQgcnNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwojaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCgljaGFyCWJ1Zls2NF07CgkKCXByaW50aygidGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAoJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOwojZW5kaWYKCglpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+ZGV2aWNlLCAicnNfdGhyb3R0bGUiKSkKCQlyZXR1cm47CgkKCWlmIChJX0lYT0ZGKHR0eSkpCgkJcnNfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKCglpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglzZXJpYWxfb3V0KGluZm8sIFVBUlRfTUNSLCBpbmZvLT5NQ1IpOwoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cn0KCnN0YXRpYyB2b2lkIHJzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwojaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCgljaGFyCWJ1Zls2NF07CgkKCXByaW50aygidW50aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCgkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CiNlbmRpZgoKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc191bnRocm90dGxlIikpCgkJcmV0dXJuOwoJCglpZiAoSV9JWE9GRih0dHkpKSB7CgkJaWYgKGluZm8tPnhfY2hhcikKCQkJaW5mby0+eF9jaGFyID0gMDsKCQllbHNlCgkJCXJzX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOwoJfQoJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCgkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9NQ1IsIGluZm8tPk1DUik7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJzX2lvY3RsKCkgYW5kIGZyaWVuZHMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sCgkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogcmV0aW5mbykKewoJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwoJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUgPSBpbmZvLT5zdGF0ZTsKICAgCglpZiAoIXJldGluZm8pCgkJcmV0dXJuIC1FRkFVTFQ7CgltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwoJdG1wLnR5cGUgPSBzdGF0ZS0+dHlwZTsKCXRtcC5saW5lID0gc3RhdGUtPmxpbmU7Cgl0bXAucG9ydCA9IHN0YXRlLT5wb3J0OwoJaWYgKEhJR0hfQklUU19PRkZTRVQpCgkJdG1wLnBvcnRfaGlnaCA9IHN0YXRlLT5wb3J0ID4+IEhJR0hfQklUU19PRkZTRVQ7CgllbHNlCgkJdG1wLnBvcnRfaGlnaCA9IDA7Cgl0bXAuaXJxID0gc3RhdGUtPmlycTsKCXRtcC5mbGFncyA9IHN0YXRlLT5mbGFnczsKCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IHN0YXRlLT54bWl0X2ZpZm9fc2l6ZTsKCXRtcC5iYXVkX2Jhc2UgPSBzdGF0ZS0+YmF1ZF9iYXNlOwoJdG1wLmNsb3NlX2RlbGF5ID0gc3RhdGUtPmNsb3NlX2RlbGF5OwoJdG1wLmNsb3Npbmdfd2FpdCA9IHN0YXRlLT5jbG9zaW5nX3dhaXQ7Cgl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3I7Cgl0bXAuaHViNiA9IHN0YXRlLT5odWI2OwoJdG1wLmlvX3R5cGUgPSBzdGF0ZS0+aW9fdHlwZTsKCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywmdG1wLHNpemVvZigqcmV0aW5mbykpKQoJCXJldHVybiAtRUZBVUxUOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvLAoJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIG5ld19pbmZvKQp7CglzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwogCXN0cnVjdCBzZXJpYWxfc3RhdGUgb2xkX3N0YXRlLCAqc3RhdGU7Cgl1bnNpZ25lZCBpbnQJCWksY2hhbmdlX2lycSxjaGFuZ2VfcG9ydDsKCWludCAJCQlyZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZwkJbmV3X3BvcnQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLG5ld19pbmZvLHNpemVvZihuZXdfc2VyaWFsKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglzdGF0ZSA9IGluZm8tPnN0YXRlOwoJb2xkX3N0YXRlID0gKnN0YXRlOwoKCW5ld19wb3J0ID0gbmV3X3NlcmlhbC5wb3J0OwoJaWYgKEhJR0hfQklUU19PRkZTRVQpCgkJbmV3X3BvcnQgKz0gKHVuc2lnbmVkIGxvbmcpIG5ld19zZXJpYWwucG9ydF9oaWdoIDw8IEhJR0hfQklUU19PRkZTRVQ7CgoJY2hhbmdlX2lycSA9IG5ld19zZXJpYWwuaXJxICE9IHN0YXRlLT5pcnE7CgljaGFuZ2VfcG9ydCA9IChuZXdfcG9ydCAhPSAoKGludCkgc3RhdGUtPnBvcnQpKSB8fAoJCShuZXdfc2VyaWFsLmh1YjYgIT0gc3RhdGUtPmh1YjYpOwogIAoJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJaWYgKGNoYW5nZV9pcnEgfHwgY2hhbmdlX3BvcnQgfHwKCQkgICAgKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IHN0YXRlLT5iYXVkX2Jhc2UpIHx8CgkJICAgIChuZXdfc2VyaWFsLnR5cGUgIT0gc3RhdGUtPnR5cGUpIHx8CgkJICAgIChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IHN0YXRlLT5jbG9zZV9kZWxheSkgfHwKCQkgICAgKG5ld19zZXJpYWwueG1pdF9maWZvX3NpemUgIT0gc3RhdGUtPnhtaXRfZmlmb19zaXplKSB8fAoJCSAgICAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CgkJICAgICAoc3RhdGUtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCgkJCXJldHVybiAtRVBFUk07CgkJc3RhdGUtPmZsYWdzID0gKChzdGF0ZS0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKCQlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwoJCWdvdG8gY2hlY2tfYW5kX2V4aXQ7Cgl9CgoJbmV3X3NlcmlhbC5pcnEgPSBpcnFfY2Fubm9uaWNhbGl6ZShuZXdfc2VyaWFsLmlycSk7CgoJaWYgKChuZXdfc2VyaWFsLmlycSA+PSBOUl9JUlFTKSB8fCAobmV3X3NlcmlhbC5pcnEgPCAwKSB8fCAKCSAgICAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgPCA5NjAwKXx8IChuZXdfc2VyaWFsLnR5cGUgPCBQT1JUX1VOS05PV04pIHx8CgkgICAgKG5ld19zZXJpYWwudHlwZSA+IFBPUlRfTUFYKSB8fCAobmV3X3NlcmlhbC50eXBlID09IFBPUlRfQ0lSUlVTKSB8fAoJICAgIChuZXdfc2VyaWFsLnR5cGUgPT0gUE9SVF9TVEFSVEVDSCkpIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglpZiAoKG5ld19zZXJpYWwudHlwZSAhPSBzdGF0ZS0+dHlwZSkgfHwKCSAgICAobmV3X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSA8PSAwKSkKCQluZXdfc2VyaWFsLnhtaXRfZmlmb19zaXplID0KCQkJdWFydF9jb25maWdbbmV3X3NlcmlhbC50eXBlXS5kZmxfeG1pdF9maWZvX3NpemU7CgoJLyogTWFrZSBzdXJlIGFkZHJlc3MgaXMgbm90IGFscmVhZHkgaW4gdXNlICovCglpZiAobmV3X3NlcmlhbC50eXBlKSB7CgkJZm9yIChpID0gMCA7IGkgPCBOUl9QT1JUUzsgaSsrKQoJCQlpZiAoKHN0YXRlICE9ICZyc190YWJsZVtpXSkgJiYKCQkJICAgIChyc190YWJsZVtpXS5pb190eXBlID09IFNFUklBTF9JT19QT1JUKSAmJgoJCQkgICAgKHJzX3RhYmxlW2ldLnBvcnQgPT0gbmV3X3BvcnQpICYmCgkJCSAgICByc190YWJsZVtpXS50eXBlKQoJCQkJcmV0dXJuIC1FQUREUklOVVNFOwoJfQoKCWlmICgoY2hhbmdlX3BvcnQgfHwgY2hhbmdlX2lycSkgJiYgKHN0YXRlLT5jb3VudCA+IDEpKQoJCXJldHVybiAtRUJVU1k7CgoJLyoKCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KCSAqLwoKCXN0YXRlLT5iYXVkX2Jhc2UgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKCXN0YXRlLT5mbGFncyA9ICgoc3RhdGUtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CgkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKCWluZm8tPmZsYWdzID0gKChzdGF0ZS0+ZmxhZ3MgJiB+QVNZTkNfSU5URVJOQUxfRkxBR1MpIHwKCQkgICAgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5URVJOQUxfRkxBR1MpKTsKCXN0YXRlLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CglzdGF0ZS0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFovMTAwOwoJc3RhdGUtPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOwojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAxMDApCglpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CiNlbmRpZgoJaW5mby0+eG1pdF9maWZvX3NpemUgPSBzdGF0ZS0+eG1pdF9maWZvX3NpemUgPQoJCW5ld19zZXJpYWwueG1pdF9maWZvX3NpemU7CgoJaWYgKChzdGF0ZS0+dHlwZSAhPSBQT1JUX1VOS05PV04pICYmIHN0YXRlLT5wb3J0KSB7CiNpZmRlZiBDT05GSUdfU0VSSUFMX1JTQQoJCWlmIChvbGRfc3RhdGUudHlwZSA9PSBQT1JUX1JTQSkKCQkJcmVsZWFzZV9yZWdpb24oc3RhdGUtPnBvcnQgKyBVQVJUX1JTQV9CQVNFLCAxNik7CgkJZWxzZQojZW5kaWYKCQlyZWxlYXNlX3JlZ2lvbihzdGF0ZS0+cG9ydCw4KTsKCX0KCXN0YXRlLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOwoJaWYgKGNoYW5nZV9wb3J0IHx8IGNoYW5nZV9pcnEpIHsKCQkvKgoJCSAqIFdlIG5lZWQgdG8gc2h1dGRvd24gdGhlIHNlcmlhbCBwb3J0IGF0IHRoZSBvbGQKCQkgKiBwb3J0L2lycSBjb21iaW5hdGlvbi4KCQkgKi8KCQlzaHV0ZG93bihpbmZvKTsKCQlzdGF0ZS0+aXJxID0gbmV3X3NlcmlhbC5pcnE7CgkJaW5mby0+cG9ydCA9IHN0YXRlLT5wb3J0ID0gbmV3X3BvcnQ7CgkJaW5mby0+aHViNiA9IHN0YXRlLT5odWI2ID0gbmV3X3NlcmlhbC5odWI2OwoJCWlmIChpbmZvLT5odWI2KQoJCQlpbmZvLT5pb190eXBlID0gc3RhdGUtPmlvX3R5cGUgPSBTRVJJQUxfSU9fSFVCNjsKCQllbHNlIGlmIChpbmZvLT5pb190eXBlID09IFNFUklBTF9JT19IVUI2KQoJCQlpbmZvLT5pb190eXBlID0gc3RhdGUtPmlvX3R5cGUgPSBTRVJJQUxfSU9fUE9SVDsKCX0KCWlmICgoc3RhdGUtPnR5cGUgIT0gUE9SVF9VTktOT1dOKSAmJiBzdGF0ZS0+cG9ydCkgewojaWZkZWYgQ09ORklHX1NFUklBTF9SU0EKCQlpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF9SU0EpCgkJCXJlcXVlc3RfcmVnaW9uKHN0YXRlLT5wb3J0ICsgVUFSVF9SU0FfQkFTRSwKCQkJCSAgICAgICAxNiwgInNlcmlhbF9yc2Eoc2V0KSIpOwoJCWVsc2UKI2VuZGlmCgkJCXJlcXVlc3RfcmVnaW9uKHN0YXRlLT5wb3J0LDgsInNlcmlhbChzZXQpIik7Cgl9CgoJCmNoZWNrX2FuZF9leGl0OgoJaWYgKCghc3RhdGUtPnBvcnQgJiYgIXN0YXRlLT5pb21lbV9iYXNlKSB8fCAhc3RhdGUtPnR5cGUpCgkJcmV0dXJuIDA7CglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewoJCWlmICgoKG9sZF9zdGF0ZS5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSAhPQoJCSAgICAgKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKCQkgICAgKG9sZF9zdGF0ZS5jdXN0b21fZGl2aXNvciAhPSBzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IpKSB7CiNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IDEzMTM5NCkgLyogTGludXggMi4xLjY2ICovCgkJCWlmICgoc3RhdGUtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CgkJCWlmICgoc3RhdGUtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCgkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKCQkJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOwoJCQlpZiAoKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOwojZW5kaWYKCQkJY2hhbmdlX3NwZWVkKGluZm8sIDApOwoJCX0KCX0gZWxzZQoJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CglyZXR1cm4gcmV0dmFsOwp9CgoKLyoKICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KICoKICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQogKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKICogCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCiAqIAkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQogKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4gCiAqLwpzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywgdW5zaWduZWQgaW50ICp2YWx1ZSkKewoJdW5zaWduZWQgY2hhciBzdGF0dXM7Cgl1bnNpZ25lZCBpbnQgcmVzdWx0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9MU1IpOwoJcmVzdG9yZV9mbGFncyhmbGFncyk7CglyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7CgoJLyoKCSAqIElmIHdlJ3JlIGFib3V0IHRvIGxvYWQgc29tZXRoaW5nIGludG8gdGhlIHRyYW5zbWl0CgkgKiByZWdpc3Rlciwgd2UnbGwgcHJldGVuZCB0aGUgdHJhbnNtaXR0ZXIgaXNuJ3QgZW1wdHkgdG8KCSAqIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gKGRlcGVuZGluZyBvbiB3aGVuIHRoZSB0cmFuc21pdAoJICogaW50ZXJydXB0IGhhcHBlbnMpLgoJICovCglpZiAoaW5mby0+eF9jaGFyIHx8IAoJICAgICgoQ0lSQ19DTlQoaW5mby0+eG1pdC5oZWFkLCBpbmZvLT54bWl0LnRhaWwsCgkJICAgICAgIFNFUklBTF9YTUlUX1NJWkUpID4gMCkgJiYKCSAgICAgIWluZm8tPnR0eS0+c3RvcHBlZCAmJiAhaW5mby0+dHR5LT5od19zdG9wcGVkKSkKCQlyZXN1bHQgJj0gflRJT0NTRVJfVEVNVDsKCglpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgZ2V0X21vZGVtX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sIHVuc2lnbmVkIGludCAqdmFsdWUpCnsKCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOwoJdW5zaWduZWQgaW50IHJlc3VsdDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJY29udHJvbCA9IGluZm8tPk1DUjsKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCXN0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX01TUik7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCXJlc3VsdCA9ICAoKGNvbnRyb2wgJiBVQVJUX01DUl9SVFMpID8gVElPQ01fUlRTIDogMCkKCQl8ICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKQojaWZkZWYgVElPQ01fT1VUMQoJCXwgKChjb250cm9sICYgVUFSVF9NQ1JfT1VUMSkgPyBUSU9DTV9PVVQxIDogMCkKCQl8ICgoY29udHJvbCAmIFVBUlRfTUNSX09VVDIpID8gVElPQ01fT1VUMiA6IDApCiNlbmRpZgoJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApCgkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKQoJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApCgkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7CgoJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQoJCXJldHVybiAtRUZBVUxUOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2V0X21vZGVtX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sIHVuc2lnbmVkIGludCBjbWQsCgkJCSAgdW5zaWduZWQgaW50ICp2YWx1ZSkKewoJdW5zaWduZWQgaW50IGFyZzsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmcsIHZhbHVlLCBzaXplb2YoaW50KSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVElPQ01CSVM6IAoJCWlmIChhcmcgJiBUSU9DTV9SVFMpCgkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CgkJaWYgKGFyZyAmIFRJT0NNX0RUUikKCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKI2lmZGVmIFRJT0NNX09VVDEKCQlpZiAoYXJnICYgVElPQ01fT1VUMSkKCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX09VVDE7CgkJaWYgKGFyZyAmIFRJT0NNX09VVDIpCgkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9PVVQyOwojZW5kaWYKCQlpZiAoYXJnICYgVElPQ01fTE9PUCkKCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0xPT1A7CgkJYnJlYWs7CgljYXNlIFRJT0NNQklDOgoJCWlmIChhcmcgJiBUSU9DTV9SVFMpCgkJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOwoJCWlmIChhcmcgJiBUSU9DTV9EVFIpCgkJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOwojaWZkZWYgVElPQ01fT1VUMQoJCWlmIChhcmcgJiBUSU9DTV9PVVQxKQoJCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX09VVDE7CgkJaWYgKGFyZyAmIFRJT0NNX09VVDIpCgkJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfT1VUMjsKI2VuZGlmCgkJaWYgKGFyZyAmIFRJT0NNX0xPT1ApCgkJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfTE9PUDsKCQlicmVhazsKCWNhc2UgVElPQ01TRVQ6CgkJaW5mby0+TUNSID0gKChpbmZvLT5NQ1IgJiB+KFVBUlRfTUNSX1JUUyB8CiNpZmRlZiBUSU9DTV9PVVQxCgkJCQkJICAgIFVBUlRfTUNSX09VVDEgfAoJCQkJCSAgICBVQVJUX01DUl9PVVQyIHwKI2VuZGlmCgkJCQkJICAgIFVBUlRfTUNSX0xPT1AgfAoJCQkJCSAgICBVQVJUX01DUl9EVFIpKQoJCQkgICAgIHwgKChhcmcgJiBUSU9DTV9SVFMpID8gVUFSVF9NQ1JfUlRTIDogMCkKI2lmZGVmIFRJT0NNX09VVDEKCQkJICAgICB8ICgoYXJnICYgVElPQ01fT1VUMSkgPyBVQVJUX01DUl9PVVQxIDogMCkKCQkJICAgICB8ICgoYXJnICYgVElPQ01fT1VUMikgPyBVQVJUX01DUl9PVVQyIDogMCkKI2VuZGlmCgkJCSAgICAgfCAoKGFyZyAmIFRJT0NNX0xPT1ApID8gVUFSVF9NQ1JfTE9PUCA6IDApCgkJCSAgICAgfCAoKGFyZyAmIFRJT0NNX0RUUikgPyBVQVJUX01DUl9EVFIgOiAwKSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQoJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwoJaW5mby0+TUNSIHw9IEFMUEhBX0tMVURHRV9NQ1I7IAkJLyogRG9uJ3QgYXNrICovCglzZXJpYWxfb3V0KGluZm8sIFVBUlRfTUNSLCBpbmZvLT5NQ1IpOwoJcmVzdG9yZV9mbGFncyhmbGFncyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBkb19hdXRvY29uZmlnKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvKQp7CglpbnQgaXJxLCByZXR2YWw7CgkKCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKCQlyZXR1cm4gLUVQRVJNOwoJCglpZiAoaW5mby0+c3RhdGUtPmNvdW50ID4gMSkKCQlyZXR1cm4gLUVCVVNZOwoJCglzaHV0ZG93bihpbmZvKTsKCglhdXRvY29uZmlnKGluZm8tPnN0YXRlKTsKCWlmICgoaW5mby0+c3RhdGUtPmZsYWdzICYgQVNZTkNfQVVUT19JUlEpICYmCgkgICAgKGluZm8tPnN0YXRlLT5wb3J0ICE9IDAgIHx8IGluZm8tPnN0YXRlLT5pb21lbV9iYXNlICE9IDApICYmCgkgICAgKGluZm8tPnN0YXRlLT50eXBlICE9IFBPUlRfVU5LTk9XTikpIHsKCQlpcnEgPSBkZXRlY3RfdWFydF9pcnEoaW5mby0+c3RhdGUpOwoJCWlmIChpcnEgPiAwKQoJCQlpbmZvLT5zdGF0ZS0+aXJxID0gaXJxOwoJfQoKCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CglpZiAocmV0dmFsKQoJCXJldHVybiByZXR2YWw7CglyZXR1cm4gMDsKfQoKLyoKICogcnNfYnJlYWsoKSAtLS0gcm91dGluZSB3aGljaCB0dXJucyB0aGUgYnJlYWsgaGFuZGxpbmcgb24gb3Igb2ZmCiAqLwojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IDEzMTM5NCkgLyogTGludXggMi4xLjY2ICovCnN0YXRpYyB2b2lkIHNlbmRfYnJlYWsoCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvLCBpbnQgZHVyYXRpb24pCnsKCWlmICghQ09ORklHVVJFRF9TRVJJQUxfUE9SVChpbmZvKSkKCQlyZXR1cm47CgljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKCWN1cnJlbnQtPnRpbWVvdXQgPSBqaWZmaWVzICsgZHVyYXRpb247CgljbGkoKTsKCWluZm8tPkxDUiB8PSBVQVJUX0xDUl9TQkM7CglzZXJpYWxfb3V0KGluZm8sIFVBUlRfTENSLCBpbmZvLT5MQ1IpOwoJc2NoZWR1bGUoKTsKCWluZm8tPkxDUiAmPSB+VUFSVF9MQ1JfU0JDOwoJc2VyaWFsX291dChpbmZvLCBVQVJUX0xDUiwgaW5mby0+TENSKTsKCXN0aSgpOwp9CiNlbHNlCnN0YXRpYyB2b2lkIHJzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKewoJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+ZGV2aWNlLCAicnNfYnJlYWsiKSkKCQlyZXR1cm47CgoJaWYgKCFDT05GSUdVUkVEX1NFUklBTF9QT1JUKGluZm8pKQoJCXJldHVybjsKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCWlmIChicmVha19zdGF0ZSA9PSAtMSkKCQlpbmZvLT5MQ1IgfD0gVUFSVF9MQ1JfU0JDOwoJZWxzZQoJCWluZm8tPkxDUiAmPSB+VUFSVF9MQ1JfU0JDOwoJc2VyaWFsX291dChpbmZvLCBVQVJUX0xDUiwgaW5mby0+TENSKTsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwp9CiNlbmRpZgoKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCnN0YXRpYyBpbnQgZ2V0X211bHRpcG9ydF9zdHJ1Y3Qoc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sCgkJCQlzdHJ1Y3Qgc2VyaWFsX211bHRpcG9ydF9zdHJ1Y3QgKnJldGluZm8pCnsKCXN0cnVjdCBzZXJpYWxfbXVsdGlwb3J0X3N0cnVjdCByZXQ7CglzdHJ1Y3QgcnNfbXVsdGlwb3J0X3N0cnVjdCAqbXVsdGk7CgkKCW11bHRpID0gJnJzX211bHRpcG9ydFtpbmZvLT5zdGF0ZS0+aXJxXTsKCglyZXQucG9ydF9tb25pdG9yID0gbXVsdGktPnBvcnRfbW9uaXRvcjsKCQoJcmV0LnBvcnQxID0gbXVsdGktPnBvcnQxOwoJcmV0Lm1hc2sxID0gbXVsdGktPm1hc2sxOwoJcmV0Lm1hdGNoMSA9IG11bHRpLT5tYXRjaDE7CgkKCXJldC5wb3J0MiA9IG11bHRpLT5wb3J0MjsKCXJldC5tYXNrMiA9IG11bHRpLT5tYXNrMjsKCXJldC5tYXRjaDIgPSBtdWx0aS0+bWF0Y2gyOwoJCglyZXQucG9ydDMgPSBtdWx0aS0+cG9ydDM7CglyZXQubWFzazMgPSBtdWx0aS0+bWFzazM7CglyZXQubWF0Y2gzID0gbXVsdGktPm1hdGNoMzsKCQoJcmV0LnBvcnQ0ID0gbXVsdGktPnBvcnQ0OwoJcmV0Lm1hc2s0ID0gbXVsdGktPm1hc2s0OwoJcmV0Lm1hdGNoNCA9IG11bHRpLT5tYXRjaDQ7CgoJcmV0LmlycSA9IGluZm8tPnN0YXRlLT5pcnE7CgoJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZyZXQsc2l6ZW9mKCpyZXRpbmZvKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZXRfbXVsdGlwb3J0X3N0cnVjdChzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKCQkJCXN0cnVjdCBzZXJpYWxfbXVsdGlwb3J0X3N0cnVjdCAqaW5fbXVsdGkpCnsKCXN0cnVjdCBzZXJpYWxfbXVsdGlwb3J0X3N0cnVjdCBuZXdfbXVsdGk7CglzdHJ1Y3QgcnNfbXVsdGlwb3J0X3N0cnVjdCAqbXVsdGk7CglzdHJ1Y3Qgc2VyaWFsX3N0YXRlICpzdGF0ZTsKCWludAl3YXNfbXVsdGksIG5vd19tdWx0aTsKCWludAlyZXR2YWw7Cgl2b2lkICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwoKCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKCQlyZXR1cm4gLUVQRVJNOwoJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKCQoJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbXVsdGksIGluX211bHRpLAoJCQkgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9tdWx0aXBvcnRfc3RydWN0KSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgkKCWlmIChuZXdfbXVsdGkuaXJxICE9IHN0YXRlLT5pcnEgfHwgc3RhdGUtPmlycSA9PSAwIHx8CgkgICAgIUlSUV9wb3J0c1tzdGF0ZS0+aXJxXSkKCQlyZXR1cm4gLUVJTlZBTDsKCgltdWx0aSA9ICZyc19tdWx0aXBvcnRbc3RhdGUtPmlycV07Cgl3YXNfbXVsdGkgPSAobXVsdGktPnBvcnQxICE9IDApOwoJCgltdWx0aS0+cG9ydF9tb25pdG9yID0gbmV3X211bHRpLnBvcnRfbW9uaXRvcjsKCQoJaWYgKG11bHRpLT5wb3J0MSkKCQlyZWxlYXNlX3JlZ2lvbihtdWx0aS0+cG9ydDEsMSk7CgltdWx0aS0+cG9ydDEgPSBuZXdfbXVsdGkucG9ydDE7CgltdWx0aS0+bWFzazEgPSBuZXdfbXVsdGkubWFzazE7CgltdWx0aS0+bWF0Y2gxID0gbmV3X211bHRpLm1hdGNoMTsKCWlmIChtdWx0aS0+cG9ydDEpCgkJcmVxdWVzdF9yZWdpb24obXVsdGktPnBvcnQxLDEsInNlcmlhbChtdWx0aXBvcnQxKSIpOwoKCWlmIChtdWx0aS0+cG9ydDIpCgkJcmVsZWFzZV9yZWdpb24obXVsdGktPnBvcnQyLDEpOwoJbXVsdGktPnBvcnQyID0gbmV3X211bHRpLnBvcnQyOwoJbXVsdGktPm1hc2syID0gbmV3X211bHRpLm1hc2syOwoJbXVsdGktPm1hdGNoMiA9IG5ld19tdWx0aS5tYXRjaDI7CglpZiAobXVsdGktPnBvcnQyKQoJCXJlcXVlc3RfcmVnaW9uKG11bHRpLT5wb3J0MiwxLCJzZXJpYWwobXVsdGlwb3J0MikiKTsKCglpZiAobXVsdGktPnBvcnQzKQoJCXJlbGVhc2VfcmVnaW9uKG11bHRpLT5wb3J0MywxKTsKCW11bHRpLT5wb3J0MyA9IG5ld19tdWx0aS5wb3J0MzsKCW11bHRpLT5tYXNrMyA9IG5ld19tdWx0aS5tYXNrMzsKCW11bHRpLT5tYXRjaDMgPSBuZXdfbXVsdGkubWF0Y2gzOwoJaWYgKG11bHRpLT5wb3J0MykKCQlyZXF1ZXN0X3JlZ2lvbihtdWx0aS0+cG9ydDMsMSwic2VyaWFsKG11bHRpcG9ydDMpIik7CgoJaWYgKG11bHRpLT5wb3J0NCkKCQlyZWxlYXNlX3JlZ2lvbihtdWx0aS0+cG9ydDQsMSk7CgltdWx0aS0+cG9ydDQgPSBuZXdfbXVsdGkucG9ydDQ7CgltdWx0aS0+bWFzazQgPSBuZXdfbXVsdGkubWFzazQ7CgltdWx0aS0+bWF0Y2g0ID0gbmV3X211bHRpLm1hdGNoNDsKCWlmIChtdWx0aS0+cG9ydDQpCgkJcmVxdWVzdF9yZWdpb24obXVsdGktPnBvcnQ0LDEsInNlcmlhbChtdWx0aXBvcnQ0KSIpOwoKCW5vd19tdWx0aSA9IChtdWx0aS0+cG9ydDEgIT0gMCk7CgkKCWlmIChJUlFfcG9ydHNbc3RhdGUtPmlycV0tPm5leHRfcG9ydCAmJgoJICAgICh3YXNfbXVsdGkgIT0gbm93X211bHRpKSkgewoJCWZyZWVfaXJxKHN0YXRlLT5pcnEsICZJUlFfcG9ydHNbc3RhdGUtPmlycV0pOwoJCWlmIChub3dfbXVsdGkpCgkJCWhhbmRsZXIgPSByc19pbnRlcnJ1cHRfbXVsdGk7CgkJZWxzZQoJCQloYW5kbGVyID0gcnNfaW50ZXJydXB0OwoKCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzdGF0ZS0+aXJxLCBoYW5kbGVyLCBTQV9TSElSUSwKCQkJCSAgICAgInNlcmlhbCIsICZJUlFfcG9ydHNbc3RhdGUtPmlycV0pOwoJCWlmIChyZXR2YWwpIHsKCQkJcHJpbnRrKCJDb3VsZG4ndCByZWFsbG9jYXRlIHNlcmlhbCBpbnRlcnJ1cHQgIgoJCQkgICAgICAgImRyaXZlciEhXG4iKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYKCnN0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAoJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CglzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLwoJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCAxMzEzOTQpIC8qIExpbnV4IDIuMS42NiAqLwoJaW50IHJldHZhbCwgdG1wOwojZW5kaWYKCQoJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPmRldmljZSwgInJzX2lvY3RsIikpCgkJcmV0dXJuIC1FTk9ERVY7CgoJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCgkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgoJICAgIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCgkJICAgIHJldHVybiAtRUlPOwoJfQoJCglzd2l0Y2ggKGNtZCkgewojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IDEzMTM5NCkgLyogTGludXggMi4xLjY2ICovCgkJY2FzZSBUQ1NCUks6CS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLwoJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CgkJCWlmIChyZXR2YWwpCgkJCQlyZXR1cm4gcmV0dmFsOwoJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJCXJldHVybiAtRUlOVFI7CgkJCWlmICghYXJnKSB7CgkJCQlzZW5kX2JyZWFrKGluZm8sIEhaLzQpOwkvKiAxLzQgc2Vjb25kICovCgkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCQkJcmV0dXJuIC1FSU5UUjsKCQkJfQoJCQlyZXR1cm4gMDsKCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwoJCQlpZiAocmV0dmFsKQoJCQkJcmV0dXJuIHJldHZhbDsKCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCQlyZXR1cm4gLUVJTlRSOwoJCQlzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJCXJldHVybiAtRUlOVFI7CgkJCXJldHVybiAwOwoJCWNhc2UgVElPQ0dTT0ZUQ0FSOgoJCQl0bXAgPSBDX0NMT0NBTCh0dHkpID8gMSA6IDA7CgkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZ0bXAsIHNpemVvZihpbnQpKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlyZXR1cm4gMDsKCQljYXNlIFRJT0NTU09GVENBUjoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsICh2b2lkICopYXJnLCBzaXplb2YoaW50KSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCgkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CgkJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKCQkJCSAodG1wID8gQ0xPQ0FMIDogMCkpOwoJCQlyZXR1cm4gMDsKI2VuZGlmCgkJY2FzZSBUSU9DTUdFVDoKCQkJcmV0dXJuIGdldF9tb2RlbV9pbmZvKGluZm8sICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKCQljYXNlIFRJT0NNQklTOgoJCWNhc2UgVElPQ01CSUM6CgkJY2FzZSBUSU9DTVNFVDoKCQkJcmV0dXJuIHNldF9tb2RlbV9pbmZvKGluZm8sIGNtZCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOwoJCWNhc2UgVElPQ0dTRVJJQUw6CgkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywKCQkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CgkJY2FzZSBUSU9DU1NFUklBTDoKCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLAoJCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKCQljYXNlIFRJT0NTRVJDT05GSUc6CgkJCXJldHVybiBkb19hdXRvY29uZmlnKGluZm8pOwoKCQljYXNlIFRJT0NTRVJHRVRMU1I6IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLwoJCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGluZm8sICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKCgkJY2FzZSBUSU9DU0VSR1NUUlVDVDoKCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGFzeW5jX3N0cnVjdCAqKSBhcmcsCgkJCQkJIGluZm8sIHNpemVvZihzdHJ1Y3QgYXN5bmNfc3RydWN0KSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJcmV0dXJuIDA7CgkJCQkKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCgkJY2FzZSBUSU9DU0VSR0VUTVVMVEk6CgkJCXJldHVybiBnZXRfbXVsdGlwb3J0X3N0cnVjdChpbmZvLAoJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX211bHRpcG9ydF9zdHJ1Y3QgKikgYXJnKTsKCQljYXNlIFRJT0NTRVJTRVRNVUxUSToKCQkJcmV0dXJuIHNldF9tdWx0aXBvcnRfc3RydWN0KGluZm8sCgkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfbXVsdGlwb3J0X3N0cnVjdCAqKSBhcmcpOwojZW5kaWYKCQkJCgkJLyoKCQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCgkJICogLSBtYXNrIHBhc3NlZCBpbiBhcmcgZm9yIGxpbmVzIG9mIGludGVyZXN0CiAJCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQoJCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCgkJICovCgkJY2FzZSBUSU9DTUlXQUlUOgoJCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CgkJCS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCgkJCWNwcmV2ID0gaW5mby0+c3RhdGUtPmljb3VudDsKCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJCS8qIEZvcmNlIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzIG9uICovCgkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7CgkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7CgkJCXdoaWxlICgxKSB7CgkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CgkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCgkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCQkJCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCQkJCWNub3cgPSBpbmZvLT5zdGF0ZS0+aWNvdW50OyAvKiBhdG9taWMgY29weSAqLwoJCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJiAKCQkJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKQoJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KCQkJCWlmICggKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CgkJCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSApIHsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJCWNwcmV2ID0gY25vdzsKCQkJfQoJCQkvKiBOT1RSRUFDSEVEICovCgoJCS8qIAoJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQoJCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CgkJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCgkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgoJCSAqLwoJCWNhc2UgVElPQ0dJQ09VTlQ6CgkJCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCQkJY25vdyA9IGluZm8tPnN0YXRlLT5pY291bnQ7CgkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCQlpY291bnQuY3RzID0gY25vdy5jdHM7CgkJCWljb3VudC5kc3IgPSBjbm93LmRzcjsKCQkJaWNvdW50LnJuZyA9IGNub3cucm5nOwoJCQlpY291bnQuZGNkID0gY25vdy5kY2Q7CgkJCWljb3VudC5yeCA9IGNub3cucng7CgkJCWljb3VudC50eCA9IGNub3cudHg7CgkJCWljb3VudC5mcmFtZSA9IGNub3cuZnJhbWU7CgkJCWljb3VudC5vdmVycnVuID0gY25vdy5vdmVycnVuOwoJCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CgkJCWljb3VudC5icmsgPSBjbm93LmJyazsKCQkJaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKCQkJCgkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlyZXR1cm4gMDsKCQljYXNlIFRJT0NTRVJHV0lMRDoKCQljYXNlIFRJT0NTRVJTV0lMRDoKCQkJLyogInNldHNlcmlhbCAtVyIgaXMgY2FsbGVkIGluIERlYmlhbiBib290ICovCgkJCXByaW50ayAoIlRJT0NTRVI/V0lMRCBpb2N0bCBvYnNvbGV0ZSwgaWdub3JlZC5cbiIpOwoJCQlyZXR1cm4gMDsKCgkJZGVmYXVsdDoKCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKCQl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQp7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKCQoJaWYgKCAgIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQoJICByZXR1cm47CgoJY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKCgkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKCSAgICAhKGNmbGFnICYgQ0JBVUQpKSB7CgkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7CgkJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOwoJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9NQ1IsIGluZm8tPk1DUik7CgkJcmVzdG9yZV9mbGFncyhmbGFncyk7Cgl9CgkKCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCgkgICAgKGNmbGFnICYgQ0JBVUQpKSB7CgkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKCQlpZiAoISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fCAKCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgewoJCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwoJCX0KCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX01DUiwgaW5mby0+TUNSKTsKCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCX0KCQoJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgoJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKCQl0dHktPmh3X3N0b3BwZWQgPSAwOwoJCXJzX3N0YXJ0KHR0eSk7Cgl9CgojaWYgMAoJLyoKCSAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CgkgKiBzYW1wbGUgdGhlIENMT0NBTCBmbGFnIG9uY2UsIGFuZCBkb24ndCByZWNoZWNrIGl0LgoJICogWFhYICBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoZSBjdXJyZW50IGJlaGF2aW9yIGlzIGNvcnJlY3QKCSAqIG9yIG5vdC4gIEhlbmNlLCB0aGlzIG1heSBjaGFuZ2UuLi4uLgoJICovCglpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKCSAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CiNlbmRpZgp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcnNfY2xvc2UoKQogKiAKICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQogKiB3YWl0IGZvciB0aGUgbGFzdCByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50LiAgVGhlbiwgd2UgdW5saW5rIGl0cwogKiBhc3luYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW50ZXJydXB0IGNoYWluIGlmIG5lY2Vzc2FyeSwgYW5kIHdlIGZyZWUKICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19jbG9zZSIpKQoJCXJldHVybjsKCglzdGF0ZSA9IGluZm8tPnN0YXRlOwoJCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CgkKCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CgkJREJHX0NOVCgiYmVmb3JlIERFQy1odW5nIik7CgkJTU9EX0RFQ19VU0VfQ09VTlQ7CgkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJcmV0dXJuOwoJfQoJCiNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgoJcHJpbnRrKCJyc19jbG9zZSB0dHlzJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CiNlbmRpZgoJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChzdGF0ZS0+Y291bnQgIT0gMSkpIHsKCQkvKgoJCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5CgkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBzdGF0ZS0+Y291bnQgc2hvdWxkIGFsd2F5cwoJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KCQkgKi8KCQlwcmludGsoInJzX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIgoJCSAgICAgICAic3RhdGUtPmNvdW50IGlzICVkXG4iLCBzdGF0ZS0+Y291bnQpOwoJCXN0YXRlLT5jb3VudCA9IDE7Cgl9CglpZiAoLS1zdGF0ZS0+Y291bnQgPCAwKSB7CgkJcHJpbnRrKCJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLAoJCSAgICAgICBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOwoJCXN0YXRlLT5jb3VudCA9IDA7Cgl9CglpZiAoc3RhdGUtPmNvdW50KSB7CgkJREJHX0NOVCgiYmVmb3JlIERFQy0yIik7CgkJTU9EX0RFQ19VU0VfQ09VTlQ7CgkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJcmV0dXJuOwoJfQoJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJLyoKCSAqIFNhdmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLCBzaW5jZSB0aGlzIHBvcnQgbWF5IGhhdmUKCSAqIHNlcGFyYXRlIHRlcm1pb3MgZm9yIGNhbGxvdXQgYW5kIGRpYWxpbi4KCSAqLwoJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKCQlpbmZvLT5zdGF0ZS0+bm9ybWFsX3Rlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOwoJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0FMTE9VVF9BQ1RJVkUpCgkJaW5mby0+c3RhdGUtPmNhbGxvdXRfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CgkvKgoJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCgkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgoJICovCgl0dHktPmNsb3NpbmcgPSAxOwoJaWYgKHN0YXRlLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCgkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHN0YXRlLT5jbG9zaW5nX3dhaXQpOwoJLyoKCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQoJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCgkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KCSAqLwoJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOwoJaW5mby0+cmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7CglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewoJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIGluZm8tPklFUik7CgkJLyoKCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgoJCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQoJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCgkJICovCgkJcnNfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7Cgl9CglzaHV0ZG93bihpbmZvKTsKCWlmICh0dHktPmRyaXZlci5mbHVzaF9idWZmZXIpCgkJdHR5LT5kcml2ZXIuZmx1c2hfYnVmZmVyKHR0eSk7Cgl0dHlfbGRpc2NfZmx1c2godHR5KTsKCXR0eS0+Y2xvc2luZyA9IDA7CglpbmZvLT5ldmVudCA9IDA7CglpbmZvLT50dHkgPSAwOwoJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewoJCWlmIChzdGF0ZS0+Y2xvc2VfZGVsYXkpIHsKCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQkJc2NoZWR1bGVfdGltZW91dChzdGF0ZS0+Y2xvc2VfZGVsYXkpOwoJCX0KCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cgl9CglpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0FMTE9VVF9BQ1RJVkV8CgkJCSBBU1lOQ19DTE9TSU5HKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CglNT0RfREVDX1VTRV9DT1VOVDsKfQoKLyoKICogcnNfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CiAqLwpzdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwoJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKCWludCBsc3I7CgkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc193YWl0X3VudGlsX3NlbnQiKSkKCQlyZXR1cm47CgoJaWYgKGluZm8tPnN0YXRlLT50eXBlID09IFBPUlRfVU5LTk9XTikKCQlyZXR1cm47CgoJaWYgKGluZm8tPnhtaXRfZmlmb19zaXplID09IDApCgkJcmV0dXJuOyAvKiBKdXN0IGluIGNhc2UuLi4uICovCgoJb3JpZ19qaWZmaWVzID0gamlmZmllczsKCS8qCgkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KCSAqIHNlbmQgYSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiAgVGhlIGNoZWNrCgkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCgkgKiAKCSAqIE5vdGU6IHdlIGhhdmUgdG8gdXNlIHByZXR0eSB0aWdodCB0aW1pbmdzIGhlcmUgdG8gc2F0aXNmeQoJICogdGhlIE5JU1QtUENUUy4KCSAqLwoJY2hhcl90aW1lID0gKGluZm8tPnRpbWVvdXQgLSBIWi81MCkgLyBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKCWNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7CglpZiAoY2hhcl90aW1lID09IDApCgkJY2hhcl90aW1lID0gMTsKCWlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPCBjaGFyX3RpbWUpCgkJY2hhcl90aW1lID0gdGltZW91dDsKCS8qCgkgKiBJZiB0aGUgdHJhbnNtaXR0ZXIgaGFzbid0IGNsZWFyZWQgaW4gdHdpY2UgdGhlIGFwcHJveGltYXRlCgkgKiBhbW91bnQgb2YgdGltZSB0byBzZW5kIHRoZSBlbnRpcmUgRklGTywgaXQgcHJvYmFibHkgd29uJ3QKCSAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdwoJICogY29udHJvbCwgd2hpY2ggaXMgY3VycmVudGx5IHRoZSBjYXNlLiAgSGVuY2UsIGlmIGl0IGV2ZXIKCSAqIHRha2VzIGxvbmdlciB0aGFuIGluZm8tPnRpbWVvdXQsIHRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEKCSAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKCSAqIDIqaW5mby0+dGltZW91dC4KCSAqLwoJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCgkJdGltZW91dCA9IDIqaW5mby0+dGltZW91dDsKI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKCXByaW50aygiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLCB0aW1lb3V0LCBjaGFyX3RpbWUpOwoJcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwojZW5kaWYKCXdoaWxlICghKChsc3IgPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfTFNSKSkgJiBVQVJUX0xTUl9URU1UKSkgewojaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAoJCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CiNlbmRpZgoJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJc2NoZWR1bGVfdGltZW91dChjaGFyX3RpbWUpOwoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJYnJlYWs7CgkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKCQkJYnJlYWs7Cgl9CiNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCglwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi5kb25lXG4iLCBsc3IsIGppZmZpZXMpOwojZW5kaWYKfQoKLyoKICogcnNfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KICovCnN0YXRpYyB2b2lkIHJzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQp7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gaW5mby0+c3RhdGU7CgkKCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5kZXZpY2UsICJyc19oYW5ndXAiKSkKCQlyZXR1cm47CgoJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKCQoJcnNfZmx1c2hfYnVmZmVyKHR0eSk7CglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQoJCXJldHVybjsKCXNodXRkb3duKGluZm8pOwoJaW5mby0+ZXZlbnQgPSAwOwoJc3RhdGUtPmNvdW50ID0gMDsKCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DQUxMT1VUX0FDVElWRSk7CglpbmZvLT50dHkgPSAwOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcnNfb3BlbigpIGFuZCBmcmllbmRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAoJCQkgICBzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQp7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gaW5mby0+c3RhdGU7CglpbnQJCXJldHZhbDsKCWludAkJZG9fY2xvY2FsID0gMCwgZXh0cmFfY291bnQgPSAwOwoJdW5zaWduZWQgbG9uZwlmbGFnczsKCgkvKgoJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jawoJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCgkgKi8KCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CgkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQoJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCgkJcmV0dXJuICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CgkJCS1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOwojZWxzZQoJCXJldHVybiAtRUFHQUlOOwojZW5kaWYKCX0KCgkvKgoJICogSWYgdGhpcyBpcyBhIGNhbGxvdXQgZGV2aWNlLCB0aGVuIGp1c3QgbWFrZSBzdXJlIHRoZSBub3JtYWwKCSAqIGRldmljZSBpc24ndCBiZWluZyB1c2VkLgoJICovCglpZiAodHR5LT5kcml2ZXIuc3VidHlwZSA9PSBTRVJJQUxfVFlQRV9DQUxMT1VUKSB7CgkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKCQkJcmV0dXJuIC1FQlVTWTsKCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfQ0FMTE9VVF9BQ1RJVkUpICYmCgkJICAgIChpbmZvLT5mbGFncyAmIEFTWU5DX1NFU1NJT05fTE9DS09VVCkgJiYKCQkgICAgKGluZm8tPnNlc3Npb24gIT0gY3VycmVudC0+c2Vzc2lvbikpCgkJICAgIHJldHVybiAtRUJVU1k7CgkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NBTExPVVRfQUNUSVZFKSAmJgoJCSAgICAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19QR1JQX0xPQ0tPVVQpICYmCgkJICAgIChpbmZvLT5wZ3JwICE9IGN1cnJlbnQtPnBncnApKQoJCSAgICByZXR1cm4gLUVCVVNZOwoJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NBTExPVVRfQUNUSVZFOwoJCXJldHVybiAwOwoJfQoJCgkvKgoJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KCSAqLwoJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CgkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0FMTE9VVF9BQ1RJVkUpCgkJCXJldHVybiAtRUJVU1k7CgkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DQUxMT1VUX0FDVElWRSkgewoJCWlmIChzdGF0ZS0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZyAmIENMT0NBTCkKCQkJZG9fY2xvY2FsID0gMTsKCX0gZWxzZSB7CgkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKCQkJZG9fY2xvY2FsID0gMTsKCX0KCQoJLyoKCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCgkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgoJICogdGhpcyBsb29wLCBzdGF0ZS0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKCSAqIHJzX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgoJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KCSAqLwoJcmV0dmFsID0gMDsKCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCglwcmludGsoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKCSAgICAgICBzdGF0ZS0+bGluZSwgc3RhdGUtPmNvdW50KTsKI2VuZGlmCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKCQlleHRyYV9jb3VudCA9IDE7CgkJc3RhdGUtPmNvdW50LS07Cgl9CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCWluZm8tPmJsb2NrZWRfb3BlbisrOwoJd2hpbGUgKDEpIHsKCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CgkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DQUxMT1VUX0FDVElWRSkgJiYKCQkgICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkKCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX01DUiwKCQkJCSAgIHNlcmlhbF9pbnAoaW5mbywgVUFSVF9NQ1IpIHwKCQkJCSAgIChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpKTsKCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwoJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CgkJICAgICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCgkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCgkJCQlyZXR2YWwgPSAtRUFHQUlOOwoJCQllbHNlCgkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQojZWxzZQoJCQlyZXR2YWwgPSAtRUFHQUlOOwojZW5kaWYKCQkJYnJlYWs7CgkJfQoJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0FMTE9VVF9BQ1RJVkUpICYmCgkJICAgICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgoJCSAgICAoZG9fY2xvY2FsIHx8IChzZXJpYWxfaW4oaW5mbywgVUFSVF9NU1IpICYKCQkJCSAgIFVBUlRfTVNSX0RDRCkpKQoJCQlicmVhazsKCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwoJCQlicmVhazsKCQl9CiNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgoJCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCgkJICAgICAgIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CiNlbmRpZgoJCXNjaGVkdWxlKCk7Cgl9CglzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOwoJaWYgKGV4dHJhX2NvdW50KQoJCXN0YXRlLT5jb3VudCsrOwoJaW5mby0+YmxvY2tlZF9vcGVuLS07CiNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgoJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKCSAgICAgICBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOwojZW5kaWYKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBnZXRfYXN5bmNfc3RydWN0KGludCBsaW5lLCBzdHJ1Y3QgYXN5bmNfc3RydWN0ICoqcmV0X2luZm8pCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm87CglzdHJ1Y3Qgc2VyaWFsX3N0YXRlICpzc3RhdGU7CgoJc3N0YXRlID0gcnNfdGFibGUgKyBsaW5lOwoJc3N0YXRlLT5jb3VudCsrOwoJaWYgKHNzdGF0ZS0+aW5mbykgewoJCSpyZXRfaW5mbyA9IHNzdGF0ZS0+aW5mbzsKCQlyZXR1cm4gMDsKCX0KCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXN5bmNfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CglpZiAoIWluZm8pIHsKCQlzc3RhdGUtPmNvdW50LS07CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhc3luY19zdHJ1Y3QpKTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOwoJaW5mby0+cG9ydCA9IHNzdGF0ZS0+cG9ydDsKCWluZm8tPmZsYWdzID0gc3N0YXRlLT5mbGFnczsKCWluZm8tPmlvX3R5cGUgPSBzc3RhdGUtPmlvX3R5cGU7CglpbmZvLT5pb21lbV9iYXNlID0gc3N0YXRlLT5pb21lbV9iYXNlOwoJaW5mby0+aW9tZW1fcmVnX3NoaWZ0ID0gc3N0YXRlLT5pb21lbV9yZWdfc2hpZnQ7CglpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IHNzdGF0ZS0+eG1pdF9maWZvX3NpemU7CglpbmZvLT5saW5lID0gbGluZTsKCWluZm8tPnRxdWV1ZS5yb3V0aW5lID0gZG9fc29mdGludDsKCWluZm8tPnRxdWV1ZS5kYXRhID0gaW5mbzsKCWluZm8tPnN0YXRlID0gc3N0YXRlOwoJaWYgKHNzdGF0ZS0+aW5mbykgewoJCWtmcmVlKGluZm8pOwoJCSpyZXRfaW5mbyA9IHNzdGF0ZS0+aW5mbzsKCQlyZXR1cm4gMDsKCX0KCSpyZXRfaW5mbyA9IHNzdGF0ZS0+aW5mbyA9IGluZm87CglyZXR1cm4gMDsKfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CiAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgYXN5bmMgc3RydWN0dXJlIGludG8KICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKICogaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB0dHkgc3RydWN0dXJlLgogKgogKiBOb3RlIHRoYXQgb24gZmFpbHVyZSwgd2UgZG9uJ3QgZGVjcmVtZW50IHRoZSBtb2R1bGUgdXNlIGNvdW50IC0gdGhlIHR0eQogKiBsYXRlciB3aWxsIGNhbGwgcnNfY2xvc2UsIHdoaWNoIHdpbGwgZGVjcmVtZW50IGl0IGZvciB1cyBhcyBsb25nIGFzCiAqIHR0eS0+ZHJpdmVyX2RhdGEgaXMgc2V0IG5vbi1OVUxMLiAtLXJtawogKi8Kc3RhdGljIGludCByc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKewoJc3RydWN0IGFzeW5jX3N0cnVjdAkqaW5mbzsKCWludCAJCQlyZXR2YWwsIGxpbmU7Cgl1bnNpZ25lZCBsb25nCQlwYWdlOwoKCU1PRF9JTkNfVVNFX0NPVU5UOwoJbGluZSA9IE1JTk9SKHR0eS0+ZGV2aWNlKSAtIHR0eS0+ZHJpdmVyLm1pbm9yX3N0YXJ0OwoJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTlJfUE9SVFMpKSB7CgkJTU9EX0RFQ19VU0VfQ09VTlQ7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CglyZXR2YWwgPSBnZXRfYXN5bmNfc3RydWN0KGxpbmUsICZpbmZvKTsKCWlmIChyZXR2YWwpIHsKCQlNT0RfREVDX1VTRV9DT1VOVDsKCQlyZXR1cm4gcmV0dmFsOwoJfQoJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CglpbmZvLT50dHkgPSB0dHk7CglpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+ZGV2aWNlLCAicnNfb3BlbiIpKQoJCXJldHVybiAtRU5PREVWOwoKI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCglwcmludGsoInJzX29wZW4gJXMlZCwgY291bnQgPSAlZFxuIiwgdHR5LT5kcml2ZXIubmFtZSwgaW5mby0+bGluZSwKCSAgICAgICBpbmZvLT5zdGF0ZS0+Y291bnQpOwojZW5kaWYKI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiAweDIwMTAwKQoJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwojZW5kaWYKCgkvKgoJICoJVGhpcyByZWxpZXMgb24gbG9ja19rZXJuZWwoKSBzdHVmZiBzbyB3YW50cyB0aWR5aW5nIGZvciAyLjUKCSAqLwoJaWYgKCF0bXBfYnVmKSB7CgkJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKCQlpZiAoIXBhZ2UpCgkJCXJldHVybiAtRU5PTUVNOwoJCWlmICh0bXBfYnVmKQoJCQlmcmVlX3BhZ2UocGFnZSk7CgkJZWxzZQoJCQl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKCX0KCgkvKgoJICogSWYgdGhlIHBvcnQgaXMgdGhlIG1pZGRsZSBvZiBjbG9zaW5nLCBiYWlsIG91dCBub3cKCSAqLwoJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKCSAgICAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSkgewoJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCgkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOwojaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CiNlbHNlCgkJcmV0dXJuIC1FQUdBSU47CiNlbmRpZgoJfQoKCS8qCgkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAoJICovCglyZXR2YWwgPSBzdGFydHVwKGluZm8pOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoKCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOwoJaWYgKHJldHZhbCkgewojaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KCQlwcmludGsoInJzX29wZW4gcmV0dXJuaW5nIGFmdGVyIGJsb2NrX3RpbF9yZWFkeSB3aXRoICVkXG4iLAoJCSAgICAgICByZXR2YWwpOwojZW5kaWYKCQlyZXR1cm4gcmV0dmFsOwoJfQoKCWlmICgoaW5mby0+c3RhdGUtPmNvdW50ID09IDEpICYmCgkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BMSVRfVEVSTUlPUykpIHsKCQlpZiAodHR5LT5kcml2ZXIuc3VidHlwZSA9PSBTRVJJQUxfVFlQRV9OT1JNQUwpCgkJCSp0dHktPnRlcm1pb3MgPSBpbmZvLT5zdGF0ZS0+bm9ybWFsX3Rlcm1pb3M7CgkJZWxzZSAKCQkJKnR0eS0+dGVybWlvcyA9IGluZm8tPnN0YXRlLT5jYWxsb3V0X3Rlcm1pb3M7CgkJY2hhbmdlX3NwZWVkKGluZm8sIDApOwoJfQojaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCglpZiAoc2VyY29ucy5jZmxhZyAmJiBzZXJjb25zLmluZGV4ID09IGxpbmUpIHsKCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBzZXJjb25zLmNmbGFnOwoJCXNlcmNvbnMuY2ZsYWcgPSAwOwoJCWNoYW5nZV9zcGVlZChpbmZvLCAwKTsKCX0KI2VuZGlmCglpbmZvLT5zZXNzaW9uID0gY3VycmVudC0+c2Vzc2lvbjsKCWluZm8tPnBncnAgPSBjdXJyZW50LT5wZ3JwOwoKI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCglwcmludGsoInJzX29wZW4gdHR5cyVkIHN1Y2Nlc3NmdWwuLi4iLCBpbmZvLT5saW5lKTsKI2VuZGlmCglyZXR1cm4gMDsKfQoKLyoKICogL3Byb2MgZnMgcm91dGluZXMuLi4uCiAqLwoKc3RhdGljIGlubGluZSBpbnQgbGluZV9pbmZvKGNoYXIgKmJ1Ziwgc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSBzdGF0ZS0+aW5mbywgc2NyX2luZm87CgljaGFyCXN0YXRfYnVmWzMwXSwgY29udHJvbCwgc3RhdHVzOwoJaW50CXJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyoKCSAqIFJldHVybiB6ZXJvIGNoYXJhY3RlcnMgZm9yIHBvcnRzIG5vdCBjbGFpbWVkIGJ5IGRyaXZlci4KCSAqLwoJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfVU5LTk9XTikgewoJCXJldHVybiAwOwkvKiBpZ25vcmUgdW51c2VkIHBvcnRzICovCgl9CgoJcmV0ID0gc3ByaW50ZihidWYsICIlZDogdWFydDolcyBwb3J0OiVsWCBpcnE6JWQiLAoJCSAgICAgIHN0YXRlLT5saW5lLCB1YXJ0X2NvbmZpZ1tzdGF0ZS0+dHlwZV0ubmFtZSwgCgkJICAgICAgKHN0YXRlLT5wb3J0ID8gc3RhdGUtPnBvcnQgOiAobG9uZylzdGF0ZS0+aW9tZW1fYmFzZSksCgkJICAgICAgc3RhdGUtPmlycSk7CgoJLyoKCSAqIEZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgUlMtMjMyIGxpbmVzCgkgKi8KCWlmICghaW5mbykgewoJCWluZm8gPSAmc2NyX2luZm87CS8qIFRoaXMgaXMganVzdCBmb3Igc2VyaWFsX3tpbixvdXR9ICovCgoJCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOwoJCWluZm8tPnBvcnQgPSBzdGF0ZS0+cG9ydDsKCQlpbmZvLT5mbGFncyA9IHN0YXRlLT5mbGFnczsKCQlpbmZvLT5odWI2ID0gc3RhdGUtPmh1YjY7CgkJaW5mby0+aW9fdHlwZSA9IHN0YXRlLT5pb190eXBlOwoJCWluZm8tPmlvbWVtX2Jhc2UgPSBzdGF0ZS0+aW9tZW1fYmFzZTsKCQlpbmZvLT5pb21lbV9yZWdfc2hpZnQgPSBzdGF0ZS0+aW9tZW1fcmVnX3NoaWZ0OwoJCWluZm8tPnF1b3QgPSAwOwoJCWluZm8tPnR0eSA9IDA7Cgl9CglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9NU1IpOwoJY29udHJvbCA9IGluZm8gIT0gJnNjcl9pbmZvID8gaW5mby0+TUNSIDogc2VyaWFsX2luKGluZm8sIFVBUlRfTUNSKTsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyAKCglzdGF0X2J1ZlswXSA9IDA7CglzdGF0X2J1ZlsxXSA9IDA7CglpZiAoY29udHJvbCAmIFVBUlRfTUNSX1JUUykKCQlzdHJjYXQoc3RhdF9idWYsICJ8UlRTIik7CglpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKQoJCXN0cmNhdChzdGF0X2J1ZiwgInxDVFMiKTsKCWlmIChjb250cm9sICYgVUFSVF9NQ1JfRFRSKQoJCXN0cmNhdChzdGF0X2J1ZiwgInxEVFIiKTsKCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EU1IpCgkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOwoJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKCQlzdHJjYXQoc3RhdF9idWYsICJ8Q0QiKTsKCWlmIChzdGF0dXMgJiBVQVJUX01TUl9SSSkKCQlzdHJjYXQoc3RhdF9idWYsICJ8UkkiKTsKCglpZiAoaW5mby0+cXVvdCkgewoJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgYmF1ZDolZCIsCgkJCSAgICAgICBzdGF0ZS0+YmF1ZF9iYXNlIC8gaW5mby0+cXVvdCk7Cgl9CgoJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eDolZCByeDolZCIsCgkJICAgICAgc3RhdGUtPmljb3VudC50eCwgc3RhdGUtPmljb3VudC5yeCk7CgoJaWYgKHN0YXRlLT5pY291bnQuZnJhbWUpCgkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBmZTolZCIsIHN0YXRlLT5pY291bnQuZnJhbWUpOwoJCglpZiAoc3RhdGUtPmljb3VudC5wYXJpdHkpCgkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBwZTolZCIsIHN0YXRlLT5pY291bnQucGFyaXR5KTsKCQoJaWYgKHN0YXRlLT5pY291bnQuYnJrKQoJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgYnJrOiVkIiwgc3RhdGUtPmljb3VudC5icmspOwkKCglpZiAoc3RhdGUtPmljb3VudC5vdmVycnVuKQoJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBzdGF0ZS0+aWNvdW50Lm92ZXJydW4pOwoKCS8qCgkgKiBMYXN0IHRoaW5nIGlzIHRoZSBSUy0yMzIgc3RhdHVzIGxpbmVzCgkgKi8KCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCByc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCnsKCWludCBpLCBsZW4gPSAwLCBsOwoJb2ZmX3QJYmVnaW4gPSAwOwoKCWxlbiArPSBzcHJpbnRmKHBhZ2UsICJzZXJpbmZvOjEuMCBkcml2ZXI6JXMlcyByZXZpc2lvbjolc1xuIiwKCQkgICAgICAgc2VyaWFsX3ZlcnNpb24sIExPQ0FMX1ZFUlNUUklORywgc2VyaWFsX3JldmRhdGUpOwoJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTICYmIGxlbiA8IDQwMDA7IGkrKykgewoJCWwgPSBsaW5lX2luZm8ocGFnZSArIGxlbiwgJnJzX3RhYmxlW2ldKTsKCQlsZW4gKz0gbDsKCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQoJCQlnb3RvIGRvbmU7CgkJaWYgKGxlbitiZWdpbiA8IG9mZikgewoJCQliZWdpbiArPSBsZW47CgkJCWxlbiA9IDA7CgkJfQoJfQoJKmVvZiA9IDE7CmRvbmU6CglpZiAob2ZmID49IGxlbitiZWdpbikKCQlyZXR1cm4gMDsKCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKCXJldHVybiAoKGNvdW50IDwgYmVnaW4rbGVuLW9mZikgPyBjb3VudCA6IGJlZ2luK2xlbi1vZmYpOwp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcnNfaW5pdCgpIGFuZCBmcmllbmRzCiAqCiAqIHJzX2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qCiAqIFRoaXMgcm91dGluZSBwcmludHMgb3V0IHRoZSBhcHByb3ByaWF0ZSBzZXJpYWwgZHJpdmVyIHZlcnNpb24KICogbnVtYmVyLCBhbmQgaWRlbnRpZmllcyB3aGljaCBvcHRpb25zIHdlcmUgY29uZmlndXJlZCBpbnRvIHRoaXMKICogZHJpdmVyLgogKi8Kc3RhdGljIGNoYXIgc2VyaWFsX29wdGlvbnNbXSBfX2luaXRkYXRhID0KI2lmZGVmIENPTkZJR19IVUI2CiAgICAgICAiIEhVQi02IgojZGVmaW5lIFNFUklBTF9PUFQKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKICAgICAgICIgTUFOWV9QT1JUUyIKI2RlZmluZSBTRVJJQUxfT1BUCiNlbmRpZgojaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSVBPUlQKICAgICAgICIgTVVMVElQT1JUIgojZGVmaW5lIFNFUklBTF9PUFQKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0VSSUFMX1NIQVJFX0lSUQogICAgICAgIiBTSEFSRV9JUlEiCiNkZWZpbmUgU0VSSUFMX09QVAojZW5kaWYKI2lmZGVmIENPTkZJR19TRVJJQUxfREVURUNUX0lSUQogICAgICAgIiBERVRFQ1RfSVJRIgojZGVmaW5lIFNFUklBTF9PUFQKI2VuZGlmCiNpZmRlZiBFTkFCTEVfU0VSSUFMX1BDSQogICAgICAgIiBTRVJJQUxfUENJIgojZGVmaW5lIFNFUklBTF9PUFQKI2VuZGlmCiNpZmRlZiBFTkFCTEVfU0VSSUFMX1BOUAogICAgICAgIiBJU0FQTlAiCiNkZWZpbmUgU0VSSUFMX09QVAojZW5kaWYKI2lmZGVmIEVOQUJMRV9TRVJJQUxfQUNQSQogICAgICAgIiBTRVJJQUxfQUNQSSIKI2RlZmluZSBTRVJJQUxfT1BUCiNlbmRpZgojaWZkZWYgU0VSSUFMX09QVAogICAgICAgIiBlbmFibGVkXG4iOwojZWxzZQogICAgICAgIiBubyBzZXJpYWwgb3B0aW9ucyBlbmFibGVkXG4iOwojZW5kaWYKI3VuZGVmIFNFUklBTF9PUFQKCnN0YXRpYyBfSU5MSU5FXyB2b2lkIHNob3dfc2VyaWFsX3ZlcnNpb24odm9pZCkKewogCXByaW50ayhLRVJOX0lORk8gIiVzIHZlcnNpb24gJXMlcyAoJXMpIHdpdGglcyIsIHNlcmlhbF9uYW1lLAoJICAgICAgIHNlcmlhbF92ZXJzaW9uLCBMT0NBTF9WRVJTVFJJTkcsIHNlcmlhbF9yZXZkYXRlLAoJICAgICAgIHNlcmlhbF9vcHRpb25zKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIGRldGVjdCB0aGUgSVJRIG9mIGEgc2VyaWFsIHBvcnQgYnkgY2xlYXJpbmcgT1VUMiB3aGVuCiAqIG5vIFVBUlQgaW50ZXJydXB0IGFyZSByZXF1ZXN0ZWQgKElFUiA9IDApICgqR1BMKikuIFRoaXMgc2VlbXMgdG8gd29yayBhdAogKiBlYWNoIHRpbWUsIGFzIGxvbmcgYXMgbm8gb3RoZXIgZGV2aWNlIHBlcm1hbmVudGx5IHJlcXVlc3QgdGhlIElSUS4KICogSWYgbm8gSVJRIGlzIGRldGVjdGVkLCBvciBtdWx0aXBsZSBJUlEgYXBwZWFyLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4KICogVGhlIHZhcmlhYmxlICJzdGF0ZSIgYW5kIHRoZSBmaWVsZCAic3RhdGUtPnBvcnQiIHNob3VsZCBub3QgYmUgbnVsbC4KICovCnN0YXRpYyB1bnNpZ25lZCBkZXRlY3RfdWFydF9pcnEgKHN0cnVjdCBzZXJpYWxfc3RhdGUgKiBzdGF0ZSkKewoJaW50IGlycTsKCXVuc2lnbmVkIGxvbmcgaXJxczsKCXVuc2lnbmVkIGNoYXIgc2F2ZV9tY3IsIHNhdmVfaWVyOwoJc3RydWN0IGFzeW5jX3N0cnVjdCBzY3JfaW5mbzsgLyogc2VyaWFsX3tpbixvdXR9IGJlY2F1c2UgSFVCNiAqLwoKI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwoJdW5zaWduZWQgY2hhciBzYXZlX0lDUD0wOyAvKiBubyB3YXJuaW5nICovCgl1bnNpZ25lZCBzaG9ydCBJQ1A9MDsKCglpZiAoc3RhdGUtPmZsYWdzICYgQVNZTkNfRk9VUlBPUlQpICB7CgkJSUNQID0gKHN0YXRlLT5wb3J0ICYgMHhGRTApIHwgMHgwMUY7CgkJc2F2ZV9JQ1AgPSBpbmJfcChJQ1ApOwoJCW91dGJfcCgweDgwLCBJQ1ApOwoJCSh2b2lkKSBpbmJfcChJQ1ApOwoJfQojZW5kaWYKCXNjcl9pbmZvLm1hZ2ljID0gU0VSSUFMX01BR0lDOwoJc2NyX2luZm8uc3RhdGUgPSBzdGF0ZTsKCXNjcl9pbmZvLnBvcnQgPSBzdGF0ZS0+cG9ydDsKCXNjcl9pbmZvLmZsYWdzID0gc3RhdGUtPmZsYWdzOwojaWZkZWYgQ09ORklHX0hVQjYKCXNjcl9pbmZvLmh1YjYgPSBzdGF0ZS0+aHViNjsKI2VuZGlmCglzY3JfaW5mby5pb190eXBlID0gc3RhdGUtPmlvX3R5cGU7CglzY3JfaW5mby5pb21lbV9iYXNlID0gc3RhdGUtPmlvbWVtX2Jhc2U7CglzY3JfaW5mby5pb21lbV9yZWdfc2hpZnQgPSBzdGF0ZS0+aW9tZW1fcmVnX3NoaWZ0OwoKCS8qIGZvcmdldCBwb3NzaWJsZSBpbml0aWFsbHkgbWFza2VkIGFuZCBwZW5kaW5nIElSUSAqLwoJcHJvYmVfaXJxX29mZihwcm9iZV9pcnFfb24oKSk7CglzYXZlX21jciA9IHNlcmlhbF9pbnAoJnNjcl9pbmZvLCBVQVJUX01DUik7CglzYXZlX2llciA9IHNlcmlhbF9pbnAoJnNjcl9pbmZvLCBVQVJUX0lFUik7CglzZXJpYWxfb3V0cCgmc2NyX2luZm8sIFVBUlRfTUNSLCBVQVJUX01DUl9PVVQxIHwgVUFSVF9NQ1JfT1VUMik7CgkKCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKCXNlcmlhbF9vdXRwKCZzY3JfaW5mbywgVUFSVF9NQ1IsIDApOwoJdWRlbGF5ICgxMCk7CglpZiAoc3RhdGUtPmZsYWdzICYgQVNZTkNfRk9VUlBPUlQpICB7CgkJc2VyaWFsX291dHAoJnNjcl9pbmZvLCBVQVJUX01DUiwKCQkJICAgIFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7Cgl9IGVsc2UgewoJCXNlcmlhbF9vdXRwKCZzY3JfaW5mbywgVUFSVF9NQ1IsCgkJCSAgICBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKTsKCX0KCXNlcmlhbF9vdXRwKCZzY3JfaW5mbywgVUFSVF9JRVIsIDB4MGYpOwkvKiBlbmFibGUgYWxsIGludHJzICovCgkodm9pZClzZXJpYWxfaW5wKCZzY3JfaW5mbywgVUFSVF9MU1IpOwoJKHZvaWQpc2VyaWFsX2lucCgmc2NyX2luZm8sIFVBUlRfUlgpOwoJKHZvaWQpc2VyaWFsX2lucCgmc2NyX2luZm8sIFVBUlRfSUlSKTsKCSh2b2lkKXNlcmlhbF9pbnAoJnNjcl9pbmZvLCBVQVJUX01TUik7CglzZXJpYWxfb3V0cCgmc2NyX2luZm8sIFVBUlRfVFgsIDB4RkYpOwoJdWRlbGF5ICgyMCk7CglpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwoKCXNlcmlhbF9vdXRwKCZzY3JfaW5mbywgVUFSVF9NQ1IsIHNhdmVfbWNyKTsKCXNlcmlhbF9vdXRwKCZzY3JfaW5mbywgVUFSVF9JRVIsIHNhdmVfaWVyKTsKI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwoJaWYgKHN0YXRlLT5mbGFncyAmIEFTWU5DX0ZPVVJQT1JUKQoJCW91dGJfcChzYXZlX0lDUCwgSUNQKTsKI2VuZGlmCglyZXR1cm4gKGlycSA+IDApPyBpcnEgOiAwOwp9CgovKgogKiBUaGlzIGlzIGEgcXVpY2tpZSB0ZXN0IHRvIHNlZSBob3cgYmlnIHRoZSBGSUZPIGlzLgogKiBJdCBkb2Vzbid0IHdvcmsgYXQgYWxsIHRoZSB0aW1lLCBtb3JlJ3MgdGhlIHBpdHkuCiAqLwpzdGF0aWMgaW50IHNpemVfZmlmbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQp7Cgl1bnNpZ25lZCBjaGFyIG9sZF9mY3IsIG9sZF9tY3IsIG9sZF9kbGwsIG9sZF9kbG07CglpbnQgY291bnQ7CgoJb2xkX2ZjciA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9GQ1IpOwoJb2xkX21jciA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9NQ1IpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKCQkgICAgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9NQ1IsIFVBUlRfTUNSX0xPT1ApOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOwoJb2xkX2RsbCA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9ETEwpOwoJb2xkX2RsbSA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9ETE0pOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9ETEwsIDB4MDEpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9ETE0sIDB4MDApOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDB4MDMpOwoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKQoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfVFgsIGNvdW50KTsKCW1kZWxheSgyMCk7Cglmb3IgKGNvdW50ID0gMDsgKHNlcmlhbF9pbnAoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfRFIpICYmCgkgICAgIChjb3VudCA8IDI1Nik7IGNvdW50KyspCgkJc2VyaWFsX2lucChpbmZvLCBVQVJUX1JYKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLCBvbGRfZmNyKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTUNSLCBvbGRfbWNyKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExMLCBvbGRfZGxsKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExNLCBvbGRfZGxtKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qCiAqIFRoaXMgaXMgYSBoZWxwZXIgcm91dGluZSB0byBhdXRvZGV0ZWN0IFN0YXJUZWNoL0V4YXIvT3hzZW1pIFVBUlQncy4KICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3ZSBrbm93IGl0IGlzIGF0IGxlYXN0IGEgU3RhclRlY2gKICogMTY2NTAgVjIsIGJ1dCBpdCBtaWdodCBiZSBvbmUgb2Ygc2V2ZXJhbCBTdGFyVGVjaCBVQVJUcywgb3Igb25lIG9mCiAqIGl0cyBjbG9uZXMuICAoV2UgdHJlYXQgdGhlIGJyb2tlbiBvcmlnaW5hbCBTdGFyVGVjaCAxNjY1MCBWMSBhcyBhCiAqIDE2NTUwLCBhbmQgd2h5IG5vdD8gIFN0YXJ0ZWNoIGRvZXNuJ3Qgc2VlbSB0byBldmVuIGFja25vd2xlZGdlIGl0cwogKiBleGlzdGVuY2UuKQogKiAKICogV2hhdCBldmlsIGhhdmUgbWVuJ3MgbWluZHMgd3JvdWdodC4uLgogKi8Kc3RhdGljIHZvaWQgYXV0b2NvbmZpZ19zdGFydGVjaF91YXJ0cyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvLAoJCQkJICAgICAgc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUsCgkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQp7Cgl1bnNpZ25lZCBjaGFyIHNjcmF0Y2gsIHNjcmF0Y2gyLCBzY3JhdGNoMywgc2NyYXRjaDQ7CgoJLyoKCSAqIEZpcnN0IHdlIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGFuIE94Zm9yZCBTZW1pY29uZHVjdG9yIFVBUlQuCgkgKgoJICogSWYgd2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUgYmVjYXVzZSBzb21lIG5vbi1OYXRpb25hbAoJICogU2VtaWNvbmR1Y3RvciBjbG9uZSBjaGlwcyBsb2NrIHVwIGlmIHlvdSB0cnkgd3JpdGluZyB0byB0aGUKCSAqIExTUiByZWdpc3RlciAod2hpY2ggc2VyaWFsX2ljcl9yZWFkIGRvZXMpCgkgKi8KCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgewoJCS8qCgkJICogRUZSIFs0XSBtdXN0IGJlIHNldCBlbHNlIHRoaXMgdGVzdCBmYWlscwoJCSAqCgkJICogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgTWlrZSBIdWRzb24KCQkgKiAoRXhvcmF5QGlzeXMuY2EpIGNsYWltcyB0aGF0IGl0J3MgbmVlZGVkIGZvciA5NTIKCQkgKiBkdWFsIFVBUlQncyAod2hpY2ggYXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgbmV3IGRlc2lnbnMpLgoJCSAqLwoJCWluZm8tPkFDUiA9IDA7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX0xDUiwgMHhCRik7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VGUiwgMHgxMCk7CgkJc2VyaWFsX291dChpbmZvLCBVQVJUX0xDUiwgMHgwMCk7CgkJLyogQ2hlY2sgZm9yIE94Zm9yZCBTZW1pY29uZHVjdG9yIDE2Qzk1MCAqLwoJCXNjcmF0Y2ggPSBzZXJpYWxfaWNyX3JlYWQoaW5mbywgVUFSVF9JRDEpOwoJCXNjcmF0Y2gyID0gc2VyaWFsX2ljcl9yZWFkKGluZm8sIFVBUlRfSUQyKTsKCQlzY3JhdGNoMyA9IHNlcmlhbF9pY3JfcmVhZChpbmZvLCBVQVJUX0lEMyk7CgkJCgkJaWYgKHNjcmF0Y2ggPT0gMHgxNiAmJiBzY3JhdGNoMiA9PSAweEM5ICYmCgkJICAgIChzY3JhdGNoMyA9PSAweDUwIHx8IHNjcmF0Y2gzID09IDB4NTIgfHwKCQkgICAgIHNjcmF0Y2gzID09IDB4NTQpKSB7CgkJCXN0YXRlLT50eXBlID0gUE9SVF8xNkM5NTA7CgkJCXN0YXRlLT5yZXZpc2lvbiA9IHNlcmlhbF9pY3JfcmVhZChpbmZvLCBVQVJUX1JFVikgfAoJCQkJKHNjcmF0Y2gzIDw8IDgpOwoJCQlyZXR1cm47CgkJfQoJfQoJCgkvKgoJICogV2UgY2hlY2sgZm9yIGEgWFIxNkM4NTAgYnkgc2V0dGluZyBETEwgYW5kIERMTSB0byAwLCBhbmQKCSAqIHRoZW4gcmVhZGluZyBiYWNrIERMTCBhbmQgRExNLiAgSWYgRExNIHJlYWRzIGJhY2sgMHgxMCwKCSAqIHRoZW4gdGhlIFVBUlQgaXMgYSBYUjE2Qzg1MCBhbmQgdGhlIERMTCBjb250YWlucyB0aGUgY2hpcAoJICogcmV2aXNpb24uICBJZiBETE0gcmVhZHMgYmFjayAweDE0LCB0aGVuIHRoZSBVQVJUIGlzIGEKCSAqIFhSMTZDODU0LgoJICogCgkgKi8KCgkvKiBTYXZlIHRoZSBETEwgYW5kIERMTSAqLwoKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsKCXNjcmF0Y2gzID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0RMTCk7CglzY3JhdGNoNCA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9ETE0pOwoKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExMLCAwKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExNLCAwKTsKCXNjcmF0Y2gyID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0RMTCk7CglzY3JhdGNoID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0RMTSk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMCk7CgoJaWYgKHNjcmF0Y2ggPT0gMHgxMCB8fCBzY3JhdGNoID09IDB4MTQpIHsKCQlpZiAoc2NyYXRjaCA9PSAweDEwKQoJCQlzdGF0ZS0+cmV2aXNpb24gPSBzY3JhdGNoMjsKCQlzdGF0ZS0+dHlwZSA9IFBPUlRfMTY4NTA7CgkJcmV0dXJuOwoJfQoKCS8qIFJlc3RvcmUgdGhlIERMTCBhbmQgRExNICovCgoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9ETEwsIHNjcmF0Y2gzKTsKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRExNLCBzY3JhdGNoNCk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMCk7CgkvKgoJICogV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgJzY1NCBhbmQgdGhlICc2NTAgYnkgY291bnRpbmcKCSAqIGhvdyBtYW55IGJ5dGVzIGFyZSBpbiB0aGUgRklGTy4gIEknbSB1c2luZyB0aGlzIGZvciBub3csCgkgKiBzaW5jZSB0aGF0J3MgdGhlIHRlY2huaXF1ZSB0aGF0IHdhcyBzZW50IHRvIG1lIGluIHRoZQoJICogc2VyaWFsIGRyaXZlciB1cGRhdGUsIGJ1dCBJJ20gbm90IGNvbnZpbmNlZCB0aGlzIHdvcmtzLgoJICogSSd2ZSBoYWQgcHJvYmxlbXMgZG9pbmcgdGhpcyBpbiB0aGUgcGFzdC4gIC1UWVQKCSAqLwoJaWYgKHNpemVfZmlmbyhpbmZvKSA9PSA2NCkKCQlzdGF0ZS0+dHlwZSA9IFBPUlRfMTY2NTQ7CgllbHNlCgkJc3RhdGUtPnR5cGUgPSBQT1JUXzE2NjUwVjI7Cn0KCi8qCiAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgcnNfaW5pdCgpIHRvIGluaXRpYWxpemUgYSBzcGVjaWZpYyBzZXJpYWwKICogcG9ydC4gIEl0IGRldGVybWluZXMgd2hhdCB0eXBlIG9mIFVBUlQgY2hpcCB0aGlzIHNlcmlhbCBwb3J0IGlzCiAqIHVzaW5nOiA4MjUwLCAxNjQ1MCwgMTY1NTAsIDE2NTUwQS4gIFRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gaXMKICogd2hldGhlciBvciBub3QgdGhpcyBVQVJUIGlzIGEgMTY1NTBBIG9yIG5vdCwgc2luY2UgdGhpcyB3aWxsCiAqIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBjYW4gdXNlIGl0cyBGSUZPIGZlYXR1cmVzIG9yIG5vdC4KICovCnN0YXRpYyB2b2lkIGF1dG9jb25maWcoc3RydWN0IHNlcmlhbF9zdGF0ZSAqIHN0YXRlKQp7Cgl1bnNpZ25lZCBjaGFyIHN0YXR1czEsIHN0YXR1czIsIHNjcmF0Y2gsIHNjcmF0Y2gyLCBzY3JhdGNoMzsKCXVuc2lnbmVkIGNoYXIgc2F2ZV9sY3IsIHNhdmVfbWNyOwoJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgc2NyX2luZm87Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXN0YXRlLT50eXBlID0gUE9SVF9VTktOT1dOOwoKI2lmZGVmIFNFUklBTF9ERUJVR19BVVRPQ09ORgoJcHJpbnRrKCJUZXN0aW5nIHR0eVMlZCAoMHglMDRseCwgMHglMDR4KS4uLlxuIiwgc3RhdGUtPmxpbmUsCgkgICAgICAgc3RhdGUtPnBvcnQsICh1bnNpZ25lZCkgc3RhdGUtPmlvbWVtX2Jhc2UpOwojZW5kaWYKCQoJaWYgKCFDT05GSUdVUkVEX1NFUklBTF9QT1JUKHN0YXRlKSkKCQlyZXR1cm47CgkJCglpbmZvID0gJnNjcl9pbmZvOwkvKiBUaGlzIGlzIGp1c3QgZm9yIHNlcmlhbF97aW4sb3V0fSAqLwoKCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOwoJaW5mby0+c3RhdGUgPSBzdGF0ZTsKCWluZm8tPnBvcnQgPSBzdGF0ZS0+cG9ydDsKCWluZm8tPmZsYWdzID0gc3RhdGUtPmZsYWdzOwojaWZkZWYgQ09ORklHX0hVQjYKCWluZm8tPmh1YjYgPSBzdGF0ZS0+aHViNjsKI2VuZGlmCglpbmZvLT5pb190eXBlID0gc3RhdGUtPmlvX3R5cGU7CglpbmZvLT5pb21lbV9iYXNlID0gc3RhdGUtPmlvbWVtX2Jhc2U7CglpbmZvLT5pb21lbV9yZWdfc2hpZnQgPSBzdGF0ZS0+aW9tZW1fcmVnX3NoaWZ0OwoKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCQoJaWYgKCEoc3RhdGUtPmZsYWdzICYgQVNZTkNfQlVHR1lfVUFSVCkgJiYKCSAgICAhc3RhdGUtPmlvbWVtX2Jhc2UpIHsKCQkvKgoJCSAqIERvIGEgc2ltcGxlIGV4aXN0ZW5jZSB0ZXN0IGZpcnN0OyBpZiB3ZSBmYWlsIHRoaXMsCgkJICogdGhlcmUncyBubyBwb2ludCB0cnlpbmcgYW55dGhpbmcgZWxzZS4KCQkgKiAKCQkgKiAweDgwIGlzIHVzZWQgYXMgYSBub25zZW5zZSBwb3J0IHRvIHByZXZlbnQgYWdhaW5zdAoJCSAqIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gSVNBIGJ1cyBmbG9hdC4gIFRoZQoJCSAqIGFzc3VtcHRpb24gaXMgdGhhdCAweDgwIGlzIGEgbm9uLWV4aXN0ZW50IHBvcnQ7CgkJICogd2hpY2ggc2hvdWxkIGJlIHNhZmUgc2luY2UgaW5jbHVkZS9hc20vaW8uaCBhbHNvCgkJICogbWFrZXMgdGhpcyBhc3N1bXB0aW9uLgoJCSAqLwoJCXNjcmF0Y2ggPSBzZXJpYWxfaW5wKGluZm8sIFVBUlRfSUVSKTsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgMCk7CiNpZmRlZiBfX2kzODZfXwoJCW91dGIoMHhmZiwgMHgwODApOwojZW5kaWYKCQlzY3JhdGNoMiA9IHNlcmlhbF9pbnAoaW5mbywgVUFSVF9JRVIpOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfSUVSLCAweDBGKTsKI2lmZGVmIF9faTM4Nl9fCgkJb3V0YigwLCAweDA4MCk7CiNlbmRpZgoJCXNjcmF0Y2gzID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX0lFUik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9JRVIsIHNjcmF0Y2gpOwoJCWlmIChzY3JhdGNoMiB8fCBzY3JhdGNoMyAhPSAweDBGKSB7CiNpZmRlZiBTRVJJQUxfREVCVUdfQVVUT0NPTkYKCQkJcHJpbnRrKCJzZXJpYWw6IHR0eVMlZDogc2ltcGxlIGF1dG9jb25maWcgZmFpbGVkICIKCQkJICAgICAgICIoJTAyeCwgJTAyeClcbiIsIHN0YXRlLT5saW5lLCAKCQkJICAgICAgIHNjcmF0Y2gyLCBzY3JhdGNoMyk7CiNlbmRpZgoJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCQkJcmV0dXJuOwkJLyogV2UgZmFpbGVkOyB0aGVyZSdzIG5vdGhpbmcgaGVyZSAqLwoJCX0KCX0KCglzYXZlX21jciA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX01DUik7CglzYXZlX2xjciA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0xDUik7CgoJLyogCgkgKiBDaGVjayB0byBzZWUgaWYgYSBVQVJUIGlzIHJlYWxseSB0aGVyZS4gIENlcnRhaW4gYnJva2VuCgkgKiBpbnRlcm5hbCBtb2RlbXMgYmFzZWQgb24gdGhlIFJvY2t3ZWxsIGNoaXBzZXQgZmFpbCB0aGlzCgkgKiB0ZXN0LCBiZWNhdXNlIHRoZXkgYXBwYXJlbnRseSBkb24ndCBpbXBsZW1lbnQgdGhlIGxvb3BiYWNrCgkgKiB0ZXN0IG1vZGUuICBTbyB0aGlzIHRlc3QgaXMgc2tpcHBlZCBvbiB0aGUgQ09NIDEgdGhyb3VnaAoJICogQ09NIDQgcG9ydHMuICBUaGlzICpzaG91bGQqIGJlIHNhZmUsIHNpbmNlIG5vIGJvYXJkCgkgKiBtYW51ZmFjdHVyZXIgd291bGQgYmUgc3R1cGlkIGVub3VnaCB0byBkZXNpZ24gYSBib2FyZAoJICogdGhhdCBjb25mbGljdHMgd2l0aCBDT00gMS00IC0tLSB3ZSBob3BlIQoJICovCglpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TS0lQX1RFU1QpKSB7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9NQ1IsIFVBUlRfTUNSX0xPT1AgfCAweDBBKTsKCQlzdGF0dXMxID0gc2VyaWFsX2lucChpbmZvLCBVQVJUX01TUikgJiAweEYwOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTUNSLCBzYXZlX21jcik7CgkJaWYgKHN0YXR1czEgIT0gMHg5MCkgewojaWZkZWYgU0VSSUFMX0RFQlVHX0FVVE9DT05GCgkJCXByaW50aygic2VyaWFsOiB0dHlTJWQ6IG5vIFVBUlQgbG9vcGJhY2sgZmFpbGVkXG4iLAoJCQkgICAgICAgc3RhdGUtPmxpbmUpOwojZW5kaWYKCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJCXJldHVybjsKCQl9Cgl9CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMHhCRik7IC8qIHNldCB1cCBmb3IgU3RhclRlY2ggdGVzdCAqLwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9FRlIsIDApOwkvKiBFRlIgaXMgdGhlIHNhbWUgYXMgRkNSICovCglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgMCk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwoJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0lJUikgPj4gNjsKCXN3aXRjaCAoc2NyYXRjaCkgewoJCWNhc2UgMDoKCQkJc3RhdGUtPnR5cGUgPSBQT1JUXzE2NDUwOwoJCQlicmVhazsKCQljYXNlIDE6CgkJCXN0YXRlLT50eXBlID0gUE9SVF9VTktOT1dOOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCXN0YXRlLT50eXBlID0gUE9SVF8xNjU1MDsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQlzdGF0ZS0+dHlwZSA9IFBPUlRfMTY1NTBBOwoJCQlicmVhazsKCX0KCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgewoJCS8qIENoZWNrIGZvciBTdGFydGVjaCBVQVJUJ3MgKi8KCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0xDUiwgVUFSVF9MQ1JfRExBQik7CgkJaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VGUikgPT0gMCkgewoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0VGUiwgMHhBOCk7CgkJCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FRlIpID09IDApIHsKCQkJCS8qIFdlIGFyZSBhIE5TMTY1NTJEL01vdG9yb2xhCgkJCQkgKiA4eHh4IERVQVJULCBzdG9wLiAqLwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJc3RhdGUtPnR5cGUgPSBQT1JUXzE2NjUwOwoJCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0VGUiwgMCk7CgkJfSBlbHNlIHsKCQkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9MQ1IsIDB4QkYpOwoJCQlpZiAoc2VyaWFsX2luKGluZm8sIFVBUlRfRUZSKSA9PSAwKQoJCQkJYXV0b2NvbmZpZ19zdGFydGVjaF91YXJ0cyhpbmZvLCBzdGF0ZSwgZmxhZ3MpOwoJCX0KCX0KCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgewoJCS8qIENoZWNrIGZvciBUSSAxNjc1MCAqLwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCBzYXZlX2xjciB8IFVBUlRfTENSX0RMQUIpOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLAoJCQkgICAgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUjdfNjRCWVRFKTsKCQlzY3JhdGNoID0gc2VyaWFsX2luKGluZm8sIFVBUlRfSUlSKSA+PiA1OwoJCWlmIChzY3JhdGNoID09IDcpIHsKCQkJLyoKCQkJICogSWYgdGhpcyBpcyBhIDE2NzUwLCBhbmQgbm90IGEgY2hlYXAgVUFSVAoJCQkgKiBjbG9uZSwgdGhlbiBpdCBzaG91bGQgb25seSBnbyBpbnRvIDY0IGJ5dGUKCQkJICogbW9kZSBpZiB0aGUgVUFSVF9GQ1I3XzY0QllURSBiaXQgd2FzIHNldAoJCQkgKiB3aGlsZSBVQVJUX0xDUl9ETEFCIHdhcyBsYXRjaGVkLgoJCQkgKi8KIAkJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7CgkJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCAwKTsKCQkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsCgkJCQkgICAgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUjdfNjRCWVRFKTsKCQkJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0lJUikgPj4gNTsKCQkJaWYgKHNjcmF0Y2ggPT0gNikKCQkJCXN0YXRlLT50eXBlID0gUE9SVF8xNjc1MDsKCQl9CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKCX0KI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9SU0EpICYmIGRlZmluZWQoTU9EVUxFKQoJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfMTY1NTBBKSB7CgkJaW50IGk7CgoJCWZvciAoaSA9IDAgOyBpIDwgUE9SVF9SU0FfTUFYIDsgKytpKSB7CgkJCWlmICghcHJvYmVfcnNhW2ldICYmICFmb3JjZV9yc2FbaV0pCgkJCQlicmVhazsKCQkJaWYgKCgocHJvYmVfcnNhW2ldICE9IHN0YXRlLT5wb3J0KSB8fAoJCQkgICAgIGNoZWNrX3JlZ2lvbihzdGF0ZS0+cG9ydCArIFVBUlRfUlNBX0JBU0UsIDE2KSkgJiYKCQkJICAgIChmb3JjZV9yc2FbaV0gIT0gc3RhdGUtPnBvcnQpKQoJCQkJY29udGludWU7CgkJCWlmICghZW5hYmxlX3JzYShpbmZvKSkKCQkJCWNvbnRpbnVlOwoJCQlzdGF0ZS0+dHlwZSA9IFBPUlRfUlNBOwoJCQlzdGF0ZS0+YmF1ZF9iYXNlID0gU0VSSUFMX1JTQV9CQVVEX0JBU0U7CgkJCWJyZWFrOwoJCX0KCX0KI2VuZGlmCm91dDoKCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfTENSLCBzYXZlX2xjcik7CglpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF8xNjQ1MCkgewoJCXNjcmF0Y2ggPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9TQ1IpOwoJCXNlcmlhbF9vdXRwKGluZm8sIFVBUlRfU0NSLCAweGE1KTsKCQlzdGF0dXMxID0gc2VyaWFsX2luKGluZm8sIFVBUlRfU0NSKTsKCQlzZXJpYWxfb3V0cChpbmZvLCBVQVJUX1NDUiwgMHg1YSk7CgkJc3RhdHVzMiA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX1NDUik7CgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9TQ1IsIHNjcmF0Y2gpOwoKCQlpZiAoKHN0YXR1czEgIT0gMHhhNSkgfHwgKHN0YXR1czIgIT0gMHg1YSkpCgkJCXN0YXRlLT50eXBlID0gUE9SVF84MjUwOwoJfQoJc3RhdGUtPnhtaXRfZmlmb19zaXplID0JdWFydF9jb25maWdbc3RhdGUtPnR5cGVdLmRmbF94bWl0X2ZpZm9fc2l6ZTsKCglpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF9VTktOT1dOKSB7CgkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJcmV0dXJuOwoJfQoKCWlmIChpbmZvLT5wb3J0KSB7CiNpZmRlZiBDT05GSUdfU0VSSUFMX1JTQQoJCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUX1JTQSkKCQkJcmVxdWVzdF9yZWdpb24oaW5mby0+cG9ydCArIFVBUlRfUlNBX0JBU0UsIDE2LAoJCQkJICAgICAgICJzZXJpYWxfcnNhKGF1dG8pIik7CgkJZWxzZQojZW5kaWYKCQkJcmVxdWVzdF9yZWdpb24oaW5mby0+cG9ydCw4LCJzZXJpYWwoYXV0bykiKTsKCX0KCgkvKgoJICogUmVzZXQgdGhlIFVBUlQuCgkgKi8KI2lmZGVmIENPTkZJR19TRVJJQUxfUlNBCglpZiAoc3RhdGUtPnR5cGUgPT0gUE9SVF9SU0EpCgkJc2VyaWFsX291dHAoaW5mbywgVUFSVF9SU0FfRlJSLCAwKTsKI2VuZGlmCglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX01DUiwgc2F2ZV9tY3IpOwoJc2VyaWFsX291dHAoaW5mbywgVUFSVF9GQ1IsIChVQVJUX0ZDUl9FTkFCTEVfRklGTyB8CgkJCQkgICAgIFVBUlRfRkNSX0NMRUFSX1JDVlIgfAoJCQkJICAgICBVQVJUX0ZDUl9DTEVBUl9YTUlUKSk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0ZDUiwgMCk7Cgkodm9pZClzZXJpYWxfaW4oaW5mbywgVUFSVF9SWCk7CglzZXJpYWxfb3V0cChpbmZvLCBVQVJUX0lFUiwgMCk7CgkKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwp9CgppbnQgcmVnaXN0ZXJfc2VyaWFsKHN0cnVjdCBzZXJpYWxfc3RydWN0ICpyZXEpOwp2b2lkIHVucmVnaXN0ZXJfc2VyaWFsKGludCBsaW5lKTsKCiNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gMHgyMDEwMCkKRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zZXJpYWwpOwpFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfc2VyaWFsKTsKI2Vsc2UKc3RhdGljIHN0cnVjdCBzeW1ib2xfdGFibGUgc2VyaWFsX3N5bXMgPSB7CiNpbmNsdWRlIDxsaW51eC9zeW10YWJfYmVnaW4uaD4KCVgocmVnaXN0ZXJfc2VyaWFsKSwKCVgodW5yZWdpc3Rlcl9zZXJpYWwpLAojaW5jbHVkZSA8bGludXgvc3ltdGFiX2VuZC5oPgp9OwojZW5kaWYKCgojaWYgZGVmaW5lZChFTkFCTEVfU0VSSUFMX1BDSSkgfHwgZGVmaW5lZChFTkFCTEVfU0VSSUFMX1BOUCkgCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJpbnRrX3BucF9kZXZfaWQodW5zaWduZWQgc2hvcnQgdmVuZG9yLAoJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2UpCnsKCXByaW50aygiJWMlYyVjJXgleCV4JXgiLAoJICAgICAgICdBJyArICgodmVuZG9yID4+IDIpICYgMHgzZikgLSAxLAoJICAgICAgICdBJyArICgoKHZlbmRvciAmIDMpIDw8IDMpIHwgKCh2ZW5kb3IgPj4gMTMpICYgNykpIC0gMSwKCSAgICAgICAnQScgKyAoKHZlbmRvciA+PiA4KSAmIDB4MWYpIC0gMSwKCSAgICAgICAoZGV2aWNlID4+IDQpICYgMHgwZiwKCSAgICAgICBkZXZpY2UgJiAweDBmLAoJICAgICAgIChkZXZpY2UgPj4gMTIpICYgMHgwZiwKCSAgICAgICAoZGV2aWNlID4+IDgpICYgMHgwZik7Cn0KCnN0YXRpYyBfSU5MSU5FXyBpbnQgZ2V0X3BjaV9wb3J0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCgkJCQkgIHN0cnVjdCBwY2lfYm9hcmQgKmJvYXJkLAoJCQkJICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmVxLAoJCQkJICBpbnQgaWR4KQp7Cgl1bnNpZ25lZCBsb25nIHBvcnQ7CglpbnQgYmFzZV9pZHg7CglpbnQgbWF4X3BvcnQ7CglpbnQgb2Zmc2V0OwoKCWJhc2VfaWR4ID0gU1BDSV9GTF9HRVRfQkFTRShib2FyZC0+ZmxhZ3MpOwoJaWYgKGJvYXJkLT5mbGFncyAmIFNQQ0lfRkxfQkFTRV9UQUJMRSkKCQliYXNlX2lkeCArPSBpZHg7CgoJaWYgKGJvYXJkLT5mbGFncyAmIFNQQ0lfRkxfUkVHSU9OX1NaX0NBUCkgewoJCW1heF9wb3J0ID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIGJhc2VfaWR4KSAvIDg7CgkJaWYgKGlkeCA+PSBtYXhfcG9ydCkKCQkJcmV0dXJuIDE7Cgl9CgkJCQoJb2Zmc2V0ID0gYm9hcmQtPmZpcnN0X3VhcnRfb2Zmc2V0OwoKCS8qIFRpbWVkaWEvU1VOSVggdXNlcyBhIG1peHR1cmUgb2YgQkFScyBhbmQgb2Zmc2V0cyAqLwoJLyogVWdoLCB0aGlzIGlzIHVnbHkgYXMgYWxsIGhlbGwgLS0tIFRZVCAqLwoJaWYoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9USU1FRElBICkgIC8qIDB4MTQwOSAqLwoJCXN3aXRjaChpZHgpIHsKCQkJY2FzZSAwOiBiYXNlX2lkeD0wOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTogYmFzZV9pZHg9MDsgb2Zmc2V0PTg7CgkJCQlicmVhazsKCQkJY2FzZSAyOiBiYXNlX2lkeD0xOyAKCQkJCWJyZWFrOwoJCQljYXNlIDM6IGJhc2VfaWR4PTE7IG9mZnNldD04OwoJCQkJYnJlYWs7CgkJCWNhc2UgNDogLyogQkFSIDIqLwoJCQljYXNlIDU6IC8qIEJBUiAzICovCgkJCWNhc2UgNjogLyogQkFSIDQqLwoJCQljYXNlIDc6IGJhc2VfaWR4PWlkeC0yOyAvKiBCQVIgNSovCgkJfQoKCS8qIFNvbWUgVGl0YW4gY2FyZHMgYXJlIGFsc28gYSBsaXR0bGUgd2VpcmQgKi8KCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1RJVEFOICYmCgkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElUQU5fNDAwTCB8fAoJICAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJVEFOXzgwMEwpKSB7CgkJc3dpdGNoIChpZHgpIHsKCQljYXNlIDA6IGJhc2VfaWR4ID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAxOiBiYXNlX2lkeCA9IDI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJhc2VfaWR4ID0gNDsKCQkJb2Zmc2V0ID0gOCAqIChpZHggLSAyKTsKCQl9CgkJCgl9CiAgCgkvKiBIUCdzIERpdmEgY2hpcCBwdXRzIHRoZSA0dGgvNXRoIHNlcmlhbCBwb3J0IGZ1cnRoZXIgb3V0LCBhbmQKCSAqIHNvbWUgc2VyaWFsIHBvcnRzIGFyZSBzdXBwb3NlZCB0byBiZSBoaWRkZW4gb24gY2VydGFpbiBtb2RlbHMuCgkgKi8KCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0hQICYmCgkJCWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSFBfU0FTKSB7CgkJc3dpdGNoIChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKCQljYXNlIDB4MTA0QjogLyogTWFlc3RybyAqLwoJCQlpZiAoaWR4ID09IDMpIGlkeCsrOwoJCQlicmVhazsKCQljYXNlIDB4MTI4MjogLyogRXZlcmVzdCAvIExvbmdzIFBlYWsgKi8KCQkJaWYgKGlkeCA+IDApIGlkeCsrOwoJCQlpZiAoaWR4ID4gMikgaWR4Kys7CgkJCWJyZWFrOwoJCX0KCQlpZiAoaWR4ID4gMikgewoJCQlvZmZzZXQgPSAweDE4OwoJCX0KCX0KCglwb3J0ID0gIHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhc2VfaWR4KSArIG9mZnNldDsKCglpZiAoKGJvYXJkLT5mbGFncyAmIFNQQ0lfRkxfQkFTRV9UQUJMRSkgPT0gMCkKCQlwb3J0ICs9IGlkeCAqIChib2FyZC0+dWFydF9vZmZzZXQgPyBib2FyZC0+dWFydF9vZmZzZXQgOiA4KTsKCglpZiAoSVNfUENJX1JFR0lPTl9JT1BPUlQoZGV2LCBiYXNlX2lkeCkpIHsKCQlyZXEtPnBvcnQgPSBwb3J0OwoJCWlmIChISUdIX0JJVFNfT0ZGU0VUKQoJCQlyZXEtPnBvcnRfaGlnaCA9IHBvcnQgPj4gSElHSF9CSVRTX09GRlNFVDsKCQllbHNlCgkJCXJlcS0+cG9ydF9oaWdoID0gMDsKCQlyZXR1cm4gMDsKCX0KCXJlcS0+aW9fdHlwZSA9IFNFUklBTF9JT19NRU07CglyZXEtPmlvbWVtX2Jhc2UgPSBpb3JlbWFwKHBvcnQsIGJvYXJkLT51YXJ0X29mZnNldCk7CglyZXEtPmlvbWVtX3JlZ19zaGlmdCA9IGJvYXJkLT5yZWdfc2hpZnQ7CglyZXEtPnBvcnQgPSAwOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBfSU5MSU5FXyBpbnQgZ2V0X3BjaV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCXN0cnVjdCBwY2lfYm9hcmQgKmJvYXJkLAoJCQkJaW50IGlkeCkKewoJaW50IGJhc2VfaWR4OwoKCWlmICgoYm9hcmQtPmZsYWdzICYgU1BDSV9GTF9JUlFSRVNPVVJDRSkgPT0gMCkKCQlyZXR1cm4gZGV2LT5pcnE7CgoJYmFzZV9pZHggPSBTUENJX0ZMX0dFVF9JUlFCQVNFKGJvYXJkLT5mbGFncyk7CglpZiAoYm9hcmQtPmZsYWdzICYgU1BDSV9GTF9JUlFfVEFCTEUpCgkJYmFzZV9pZHggKz0gaWR4OwoJCglyZXR1cm4gUENJX0lSUV9SRVNPVVJDRShkZXYsIGJhc2VfaWR4KTsKfQoKLyoKICogQ29tbW9uIGVuYWJsZXIgY29kZSBzaGFyZWQgYnkgYm90aCBQQ0kgYW5kIElTQVBOUCBwcm9iZXMKICovCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzdGFydF9wY2lfcG5wX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpkZXYsCgkJCQkgICAgICAgc3RydWN0IHBjaV9ib2FyZCAqYm9hcmQpCnsKCWludCBrLCBsaW5lOwoJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaWFsX3JlcTsKCWludCBiYXNlX2JhdWQ7CgogICAgICAgaWYgKFBSRVBBUkVfRlVOQyhkZXYpICYmIChQUkVQQVJFX0ZVTkMoZGV2KSkoZGV2KSA8IDApIHsKCSAgICAgICBwcmludGsoInNlcmlhbDogUE5QIGRldmljZSAnIik7CgkgICAgICAgcHJpbnRrX3BucF9kZXZfaWQoZGV2LT52ZW5kb3IsIGRldi0+ZGV2aWNlKTsKCSAgICAgICBwcmludGsoIicgcHJlcGFyZSBmYWlsZWRcbiIpOwoJICAgICAgIHJldHVybjsKICAgICAgIH0KCiAgICAgICBpZiAoQUNUSVZBVEVfRlVOQyhkZXYpICYmIChBQ1RJVkFURV9GVU5DKGRldikpKGRldikgPCAwKSB7CgkgICAgICAgcHJpbnRrKCJzZXJpYWw6IFBOUCBkZXZpY2UgJyIpOwoJICAgICAgIHByaW50a19wbnBfZGV2X2lkKGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSk7CgkgICAgICAgcHJpbnRrKCInIGFjdGl2YXRlIGZhaWxlZFxuIik7CgkgICAgICAgcmV0dXJuOwogICAgICAgfQoKCS8qCgkgKiBSdW4gdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBpZiBhbnkKCSAqLwoJaWYgKGJvYXJkLT5pbml0X2ZuICYmICgoYm9hcmQtPmluaXRfZm4pKGRldiwgYm9hcmQsIDEpICE9IDApKQoJCXJldHVybjsKCgkvKgoJICogUmVnaXN0ZXIgdGhlIHNlcmlhbCBib2FyZCBpbiB0aGUgYXJyYXkgaWYgd2UgbmVlZCB0bwoJICogc2h1dGRvd24gdGhlIGJvYXJkIG9uIGEgbW9kdWxlIHVubG9hZCBvciBjYXJkIHJlbW92YWwKCSAqLwoJaWYgKERFQUNUSVZBVEVfRlVOQyhkZXYpIHx8IGJvYXJkLT5pbml0X2ZuKSB7CgkJZm9yIChrPTA7IGsgPCBOUl9QQ0lfQk9BUkRTOyBrKyspCgkJCWlmIChzZXJpYWxfcGNpX2JvYXJkW2tdLmRldiA9PSAwKQoJCQkJYnJlYWs7CgkJaWYgKGsgPj0gTlJfUENJX0JPQVJEUykKCQkJcmV0dXJuOwoJCXNlcmlhbF9wY2lfYm9hcmRba10uYm9hcmQgPSAqYm9hcmQ7CgkJc2VyaWFsX3BjaV9ib2FyZFtrXS5kZXYgPSBkZXY7Cgl9CgoJYmFzZV9iYXVkID0gYm9hcmQtPmJhc2VfYmF1ZDsKCWlmICghYmFzZV9iYXVkKQoJCWJhc2VfYmF1ZCA9IEJBU0VfQkFVRDsKCW1lbXNldCgmc2VyaWFsX3JlcSwgMCwgc2l6ZW9mKHNlcmlhbF9yZXEpKTsKCglmb3IgKGs9MDsgayA8IGJvYXJkLT5udW1fcG9ydHM7IGsrKykgewoJCXNlcmlhbF9yZXEuaXJxID0gZ2V0X3BjaV9pcnEoZGV2LCBib2FyZCwgayk7CgkJaWYgKGdldF9wY2lfcG9ydChkZXYsIGJvYXJkLCAmc2VyaWFsX3JlcSwgaykpCgkJCWJyZWFrOwoJCXNlcmlhbF9yZXEuZmxhZ3MgPSBBU1lOQ19TS0lQX1RFU1QgfCBBU1lOQ19BVVRPUFJPQkU7CiNpZmRlZiBTRVJJQUxfREVCVUdfUENJCgkJcHJpbnRrKCJTZXR1cCBQQ0kvUE5QIHBvcnQ6IHBvcnQgJXgsIGlycSAlZCwgdHlwZSAlZFxuIiwKCQkgICAgICAgc2VyaWFsX3JlcS5wb3J0LCBzZXJpYWxfcmVxLmlycSwgc2VyaWFsX3JlcS5pb190eXBlKTsKI2VuZGlmCgkJbGluZSA9IHJlZ2lzdGVyX3NlcmlhbCgmc2VyaWFsX3JlcSk7CgkJaWYgKGxpbmUgPCAwKQoJCQlicmVhazsKCQlyc190YWJsZVtsaW5lXS5iYXVkX2Jhc2UgPSBiYXNlX2JhdWQ7CgkJcnNfdGFibGVbbGluZV0uZGV2ID0gZGV2OwoJfQp9CiNlbmRpZgkvKiBFTkFCTEVfU0VSSUFMX1BDSSB8fCBFTkFCTEVfU0VSSUFMX1BOUCAqLwoKI2lmZGVmIEVOQUJMRV9TRVJJQUxfUENJCi8qCiAqIFNvbWUgUENJIHNlcmlhbCBjYXJkcyB1c2luZyB0aGUgUExYIDkwNTAgUENJIGludGVyZmFjZSBjaGlwIHJlcXVpcmUKICogdGhhdCB0aGUgY2FyZCBpbnRlcnJ1cHQgYmUgZXhwbGljaXRseSBlbmFibGVkIG9yIGRpc2FibGVkLiAgVGhpcwogKiBzZWVtcyB0byBiZSBtYWlubHkgbmVlZGVkIG9uIGNhcmQgdXNpbmcgdGhlIFBMWCB3aGljaCBhbHNvIHVzZSBJL08KICogbWFwcGVkIG1lbW9yeS4KICovCnN0YXRpYyBpbnQgX19kZXZpbml0CnBjaV9wbHg5MDUwX2ZuKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYm9hcmQgKmJvYXJkLCBpbnQgZW5hYmxlKQp7Cgl1OCBkYXRhLCAqcCwgaXJxX2NvbmZpZzsKCWludCBwY2lfY29uZmlnOwoKCWlycV9jb25maWcgPSAweDQxOwoJcGNpX2NvbmZpZyA9IFBDSV9DT01NQU5EX01FTU9SWTsKCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BBTkFDT00pCgkJaXJxX2NvbmZpZyA9IDB4NDM7CglpZiAoKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUExYKSAmJgoJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BMWF9ST01VTFVTKSkgewoJCS8qCgkJICogQXMgdGhlIG1lZ2F3b2xmIGNhcmRzIGhhdmUgdGhlIGludCBwaW5zIGFjdGl2ZQoJCSAqIGhpZ2gsIGFuZCBoYXZlIDIgVUFSVCBjaGlwcywgYm90aCBpbnRzIG11c3QgYmUKCQkgKiBlbmFibGVkIG9uIHRoZSA5MDUwLiBBbHNvLCB0aGUgVUFSVFMgYXJlIHNldCBpbgoJCSAqIDE2NDUwIG1vZGUgYnkgZGVmYXVsdCwgc28gd2UgaGF2ZSB0byBlbmFibGUgdGhlCgkJICogMTZDOTUwICdlbmhhbmNlZCcgbW9kZSBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlIGRlZXAKCQkgKiBGSUZPcwoJCSAqLwoJCWlycV9jb25maWcgPSAweDViOwoJCXBjaV9jb25maWcgPSBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTzsKCX0KCQoJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ09NTUFORCwgJmRhdGEpOwoKCWlmIChlbmFibGUpCgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NPTU1BTkQsCgkJCQkgICAgICBkYXRhIHwgcGNpX2NvbmZpZyk7CgkKCS8qIGVuYWJsZS9kaXNhYmxlIGludGVycnVwdHMgKi8KCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLCAweDgwKTsKCXdyaXRlbChlbmFibGUgPyBpcnFfY29uZmlnIDogMHgwMCwgKHVuc2lnbmVkIGxvbmcpcCArIDB4NGMpOwoJaW91bm1hcChwKTsKCglpZiAoIWVuYWJsZSkKCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ09NTUFORCwKCQkJCSAgICAgIGRhdGEgJiB+cGNpX2NvbmZpZyk7CglyZXR1cm4gMDsKfQoKCi8qCiAqIFNJSUcgc2VyaWFsIGNhcmRzIGhhdmUgYW4gUENJIGludGVyZmFjZSBjaGlwIHdoaWNoIGFsc28gY29udHJvbHMKICogdGhlIFVBUlQgY2xvY2tpbmcgZnJlcXVlbmN5LiBFYWNoIFVBUlQgY2FuIGJlIGNsb2NrZWQgaW5kZXBlbmRlbnRseQogKiAoZXhjZXB0IGNhcmRzIGVxdWlwZWQgd2l0aCA0IFVBUlRzKSBhbmQgaW5pdGlhbCBjbG9ja2luZyBzZXR0aW5ncwogKiBhcmUgc3RvcmVkIGluIHRoZSBFRVBST00gY2hpcC4gSXQgY2FuIGNhdXNlIHByb2JsZW1zIGJlY2F1c2UgdGhpcwogKiB2ZXJzaW9uIG9mIHNlcmlhbCBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGRpZmZlcmVudGx5IGNsb2NrZWQgVUFSVCdzCiAqIG9uIHNpbmdsZSBQQ0kgY2FyZC4gVG8gcHJldmVudCB0aGlzLCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgc2V0CiAqIGhpZ2ggZnJlcXVlbmN5IGNsb2NraW5nIGZvciBhbGwgVUFSVCdzIG9uIGdpdmVuIGNhcmQuIEl0IGlzIHNhZmUgKEkKICogaG9wZSkgYmVjYXVzZSBpdCBkb2Vzbid0IHRvdWNoIEVFUFJPTSBzZXR0aW5ncyB0byBwcmV2ZW50IGNvbmZsaWN0cwogKiB3aXRoIG90aGVyIE9TZXMgKGxpa2UgTSQgRE9TKS4KICoKICogIFNJSUcgc3VwcG9ydCBhZGRlZCBieSBBbmRyZXkgUGFuaW4gPHBhemtlQG1haWwudHAucnU+LCAxMC8xOTk5CiAqIAogKiBUaGVyZSBpcyB0d28gZmFtaWx5IG9mIFNJSUcgc2VyaWFsIGNhcmRzIHdpdGggZGlmZmVyZW50IFBDSQogKiBpbnRlcmZhY2UgY2hpcCBhbmQgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gbWV0aG9kczoKICogICAgIC0gMTB4IGNhcmRzIGhhdmUgY29udHJvbCByZWdpc3RlcnMgaW4gSU8gYW5kL29yIG1lbW9yeSBzcGFjZTsKICogICAgIC0gMjB4IGNhcmRzIGhhdmUgY29udHJvbCByZWdpc3RlcnMgaW4gc3RhbmRhcmQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UuCiAqCiAqIFNJSUcgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB1c2UgYnkgcGFycG9ydF9zZXJpYWwuYyBtb2R1bGUuCiAqLwoKI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4IChQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4XzU1MCAmIDB4ZmZmYykKI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMTB4IChQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMTB4XzU1MCAmIDB4ZmZmOCkKCmludCBfX2RldmluaXQKcGNpX3NpaWcxMHhfZm4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9ib2FyZCAqYm9hcmQsIGludCBlbmFibGUpCnsKICAgICAgIHUxNiBkYXRhLCAqcDsKCiAgICAgICBpZiAoIWVuYWJsZSkgcmV0dXJuIDA7CgogICAgICAgcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksIDB4ODApOwoKICAgICAgIHN3aXRjaCAoZGV2LT5kZXZpY2UgJiAweGZmZjgpIHsKICAgICAgICAgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4OiAgICAgICAgIC8qIDFTICovCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4ZmZkZjsKICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMTB4OiAgICAgICAgIC8qIDJTLCAyUzFQICovCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4ZjdmZjsKICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDFTMVAsIDRTICovCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4ZmZmYjsKICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIH0KCiAgICAgICB3cml0ZXcocmVhZHcoKHVuc2lnbmVkIGxvbmcpIHAgKyAweDI4KSAmIGRhdGEsICh1bnNpZ25lZCBsb25nKSBwICsgMHgyOCk7CiAgICAgICBpb3VubWFwKHApOwogICAgICAgcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChwY2lfc2lpZzEweF9mbik7CgojZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yU18yMHggKFBDSV9ERVZJQ0VfSURfU0lJR18yU18yMHhfNTUwICYgMHhmZmZjKQojZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yUzFQXzIweCAoUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4XzU1MCAmIDB4ZmZmYykKCmludCBfX2RldmluaXQKcGNpX3NpaWcyMHhfZm4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9ib2FyZCAqYm9hcmQsIGludCBlbmFibGUpCnsKICAgICAgIHU4IGRhdGE7CgogICAgICAgaWYgKCFlbmFibGUpIHJldHVybiAwOwoKICAgICAgIC8qIENoYW5nZSBjbG9jayBmcmVxdWVuY3kgZm9yIHRoZSBmaXJzdCBVQVJULiAqLwogICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDZmLCAmZGF0YSk7CiAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDZmLCBkYXRhICYgMHhlZik7CgogICAgICAgLyogSWYgdGhpcyBjYXJkIGhhcyAyIFVBUlQsIHdlIGhhdmUgdG8gZG8gdGhlIHNhbWUgd2l0aCBzZWNvbmQgVUFSVC4gKi8KICAgICAgIGlmICgoKGRldi0+ZGV2aWNlICYgMHhmZmZjKSA9PSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMjB4KSB8fAogICAgICAgICAgICgoZGV2LT5kZXZpY2UgJiAweGZmZmMpID09IFBDSV9ERVZJQ0VfSURfU0lJR18yUzFQXzIweCkpIHsKICAgICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDczLCAmZGF0YSk7CiAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NzMsIGRhdGEgJiAweGVmKTsKICAgICAgIH0KICAgICAgIHJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0wocGNpX3NpaWcyMHhfZm4pOwoKLyogQWRkZWQgZm9yIEVLRiBJbnRlbCBpOTYwIHNlcmlhbCBib2FyZHMgKi8Kc3RhdGljIGludCBfX2RldmluaXQKcGNpX2ludGVsaTk2MG5pX2ZuKHN0cnVjdCBwY2lfZGV2ICpkZXYsCgkJICAgc3RydWN0IHBjaV9ib2FyZCAqYm9hcmQsCgkJICAgaW50IGVuYWJsZSkKewoJdW5zaWduZWQgbG9uZyBvbGR2YWw7CgkKCWlmICghKHBjaV9nZXRfc3ViZGV2aWNlKGRldikgJiAweDEwMDApKQoJCXJldHVybigtMSk7CgoJaWYgKCFlbmFibGUpIC8qIGlzIHRoZXJlIHNvbWV0aGluZyB0byBkZWluaXQ/ICovCgkJcmV0dXJuKDApOwogICAKI2lmZGVmIFNFUklBTF9ERUJVR19QQ0kKCXByaW50ayhLRVJOX0RFQlVHICIgU3Vic3lzdGVtIElEICVseCAoaW50ZWwgOTYwKVxuIiwKCSAgICAgICAodW5zaWduZWQgbG9uZykgZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKI2VuZGlmCgkvKiBpcyBmaXJtd2FyZSBzdGFydGVkPyAqLwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgKHZvaWQqKSAmb2xkdmFsKTsgCglpZiAob2xkdmFsID09IDB4MDAwMDEwMDBMKSB7IC8qIFJFU0VUIHZhbHVlICovIAoJCXByaW50ayhLRVJOX0RFQlVHICJMb2NhbCBpOTYwIGZpcm13YXJlIG1pc3NpbmciKTsKCQlyZXR1cm4oLTEpOyAKCX0KCXJldHVybigwKTsKfQoKLyoKICogVGltZWRpYSBoYXMgYW4gZXhwbG9zaW9uIG9mIGJvYXJkcywgYW5kIHRvIGF2b2lkIHRoZSBQQ0kgdGFibGUgZnJvbQogKiBncm93aW5nICpodWdlKiwgd2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29sbGFwc2Ugc29tZSA3MCBlbnRyaWVzCiAqIGluIHRoZSBQQ0kgdGFibGUgaW50byBvbmUsIGZvciBzYW5pdHkncyBhbmQgY29tcGFjdG5lc3MncyBzYWtlLgogKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IHRpbWVkaWFfc2luZ2xlX3BvcnRbXSA9IHsKCTB4NDAyNSwgMHg0MDI3LCAweDQwMjgsIDB4NTAyNSwgMHg1MDI3LCAwIH07CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0aW1lZGlhX2R1YWxfcG9ydFtdID0gewoJMHgwMDAyLCAweDQwMzYsIDB4NDAzNywgMHg0MDM4LCAweDQwNzgsIDB4NDA3OSwgMHg0MDg1LAoJMHg0MDg4LCAweDQwODksIDB4NTAzNywgMHg1MDc4LCAweDUwNzksIDB4NTA4NSwgMHg2MDc5LCAKCTB4NzA3OSwgMHg4MDc5LCAweDgxMzcsIDB4ODEzOCwgMHg4MjM3LCAweDgyMzgsIDB4OTA3OSwgCgkweDkxMzcsIDB4OTEzOCwgMHg5MjM3LCAweDkyMzgsIDB4QTA3OSwgMHhCMDc5LCAweEMwNzksCgkweEQwNzksIDAgfTsKc3RhdGljIHVuc2lnbmVkIHNob3J0IHRpbWVkaWFfcXVhZF9wb3J0W10gPSB7CgkweDQwNTUsIDB4NDA1NiwgMHg0MDk1LCAweDQwOTYsIDB4NTA1NiwgMHg4MTU2LCAweDgxNTcsIAoJMHg4MjU2LCAweDgyNTcsIDB4OTA1NiwgMHg5MTU2LCAweDkxNTcsIDB4OTE1OCwgMHg5MTU5LCAKCTB4OTI1NiwgMHg5MjU3LCAweEEwNTYsIDB4QTE1NywgMHhBMTU4LCAweEExNTksIDB4QjA1NiwKCTB4QjE1NywgMCB9OwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgdGltZWRpYV9laWdodF9wb3J0W10gPSB7CgkweDQwNjUsIDB4NDA2NiwgMHg1MDY1LCAweDUwNjYsIDB4ODE2NiwgMHg5MDY2LCAweDkxNjYsIAoJMHg5MTY3LCAweDkxNjgsIDB4QTA2NiwgMHhBMTY3LCAweEExNjgsIDAgfTsKc3RhdGljIHN0cnVjdCB0aW1lZGlhX3N0cnVjdCB7CglpbnQgbnVtOwoJdW5zaWduZWQgc2hvcnQgKmlkczsKfSB0aW1lZGlhX2RhdGFbXSA9IHsKCXsgMSwgdGltZWRpYV9zaW5nbGVfcG9ydCB9LAoJeyAyLCB0aW1lZGlhX2R1YWxfcG9ydCB9LAoJeyA0LCB0aW1lZGlhX3F1YWRfcG9ydCB9LAoJeyA4LCB0aW1lZGlhX2VpZ2h0X3BvcnQgfSwKCXsgMCwgMCB9Cn07CgpzdGF0aWMgaW50IF9fZGV2aW5pdApwY2lfdGltZWRpYV9mbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2JvYXJkICpib2FyZCwgaW50IGVuYWJsZSkKewoJaW50CWksIGo7Cgl1bnNpZ25lZCBzaG9ydCAqaWRzOwoKCWlmICghZW5hYmxlKQoJCXJldHVybiAwOwoKCWZvciAoaT0wOyB0aW1lZGlhX2RhdGFbaV0ubnVtOyBpKyspIHsKCQlpZHMgPSB0aW1lZGlhX2RhdGFbaV0uaWRzOwoJCWZvciAoaj0wOyBpZHNbal07IGorKykgewoJCQlpZiAocGNpX2dldF9zdWJkZXZpY2UoZGV2KSA9PSBpZHNbal0pIHsKCQkJCWJvYXJkLT5udW1fcG9ydHMgPSB0aW1lZGlhX2RhdGFbaV0ubnVtOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9Cgl9CglyZXR1cm4gMDsKfQoKLyoKICogSFAncyBSZW1vdGUgTWFuYWdlbWVudCBDb25zb2xlLiAgVGhlIERpdmEgY2hpcCBjYW1lIGluIHNldmVyYWwKICogZGlmZmVyZW50IHZlcnNpb25zLiAgTi1jbGFzcywgTDIwMDAgYW5kIEE1MDAgaGF2ZSB0d28gRGl2YSBjaGlwcywgZWFjaAogKiB3aXRoIDMgVUFSVHMgKHRoZSB0aGlyZCBVQVJUIG9uIHRoZSBzZWNvbmQgY2hpcCBpcyB1bnVzZWQpLiAgU3VwZXJkb21lCiAqIGFuZCBLZXlzdG9uZSBoYXZlIG9uZSBEaXZhIGNoaXAgd2l0aCAzIFVBUlRzLiAgU29tZSBsYXRlciBtYWNoaW5lcyBoYXZlCiAqIG9uZSBEaXZhIGNoaXAsIGJ1dCBpdCBoYXMgYmVlbiBleHBhbmRlZCB0byA1IFVBUlRzLgogKi8Kc3RhdGljIGludCBfX2RldmluaXQKcGNpX2hwX2RpdmEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9ib2FyZCAqYm9hcmQsIGludCBlbmFibGUpCnsKCWlmICghZW5hYmxlKQoJCXJldHVybiAwOwoKCXN3aXRjaCAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CgljYXNlIDB4MTA0OTogLyogUHJlbHVkZSBEaXZhIDEgKi8KCWNhc2UgMHgxMjIzOiAvKiBTdXBlcmRvbWUgKi8KCWNhc2UgMHgxMjI2OiAvKiBLZXlzdG9uZSAqLwoJY2FzZSAweDEyODI6IC8qIEV2ZXJlc3QgLyBMb25ncyBQZWFrICovCgkJYm9hcmQtPm51bV9wb3J0cyA9IDM7CgkJYnJlYWs7CgljYXNlIDB4MTA0QTogLyogUHJlbHVkZSBEaXZhIDIgKi8KCQlib2FyZC0+bnVtX3BvcnRzID0gMjsKCQlicmVhazsKCWNhc2UgMHgxMDRCOiAvKiBNYWVzdHJvICovCgkJYm9hcmQtPm51bV9wb3J0cyA9IDQ7CgkJYnJlYWs7CgljYXNlIDB4MTIyNzogLyogUG93ZXJiYXIgKi8KCQlib2FyZC0+bnVtX3BvcnRzID0gMTsKCQlicmVhazsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQKcGNpX3hpcmNvbV9mbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2JvYXJkICpib2FyZCwgaW50IGVuYWJsZSkKewoJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CglzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKCXJldHVybiAwOwp9CgovKgogKiBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlIGZvciBhbGwgb2YgdGhlIFBDSSBzZXJpYWwgYm9hcmRzCiAqIHdoaWNoIHdlIHN1cHBvcnQuICBJdCBpcyBkaXJlY3RseSBpbmRleGVkIGJ5IHRoZSBwY2lfYm9hcmRfbnVtX3QgZW51bQogKiB2YWx1ZSwgd2hpY2ggaXMgZW5jb2RlZCBpbiB0aGUgcGNpX2RldmljZV9pZCBQQ0kgcHJvYmUgdGFibGUncwogKiBkcml2ZXJfZGF0YSBtZW1iZXIuCiAqLwplbnVtIHBjaV9ib2FyZF9udW1fdCB7CglwYm5fYjBfMV8xMTUyMDAsCglwYm5fZGVmYXVsdCA9IDAsCgoJcGJuX2IwXzJfMTE1MjAwLAoJcGJuX2IwXzRfMTE1MjAwLAoKCXBibl9iMF8xXzkyMTYwMCwKCXBibl9iMF8yXzkyMTYwMCwKCXBibl9iMF80XzkyMTYwMCwKCglwYm5fYjBfYnRfMV8xMTUyMDAsCglwYm5fYjBfYnRfMl8xMTUyMDAsCglwYm5fYjBfYnRfMV80NjA4MDAsCglwYm5fYjBfYnRfMl80NjA4MDAsCglwYm5fYjBfYnRfMl85MjE2MDAsCgoJcGJuX2IxXzFfMTE1MjAwLAoJcGJuX2IxXzJfMTE1MjAwLAoJcGJuX2IxXzRfMTE1MjAwLAoJcGJuX2IxXzhfMTE1MjAwLAoKCXBibl9iMV8yXzkyMTYwMCwKCXBibl9iMV80XzkyMTYwMCwKCXBibl9iMV84XzkyMTYwMCwKCglwYm5fYjFfMl8xMzgyNDAwLAoJcGJuX2IxXzRfMTM4MjQwMCwKCXBibl9iMV84XzEzODI0MDAsCgoJcGJuX2IyXzFfMTE1MjAwLAoJcGJuX2IyXzhfMTE1MjAwLAoJcGJuX2IyXzRfNDYwODAwLAoJcGJuX2IyXzhfNDYwODAwLAoJcGJuX2IyXzE2XzQ2MDgwMCwKCXBibl9iMl80XzkyMTYwMCwKCXBibl9iMl84XzkyMTYwMCwKCglwYm5fYjJfYnRfMV8xMTUyMDAsCglwYm5fYjJfYnRfMl8xMTUyMDAsCglwYm5fYjJfYnRfNF8xMTUyMDAsCglwYm5fYjJfYnRfMl85MjE2MDAsCgoJcGJuX3BhbmFjb20sCglwYm5fcGFuYWNvbTIsCglwYm5fcGFuYWNvbTQsCglwYm5fcGx4X3JvbXVsdXMsCglwYm5fb3hzZW1pLAoJcGJuX3RpbWVkaWEsCglwYm5faW50ZWxfaTk2MCwKCXBibl9zZ2lfaW9jMywKCXBibl9ocF9kaXZhLAojaWZkZWYgQ09ORklHX0REQjUwNzQKCXBibl9uZWNfbmlsZTQsCiNlbmRpZgoKCXBibl9kY2lfcGNjb200LAoJcGJuX2RjaV9wY2NvbTgsCgoJcGJuX3hpcmNvbV9jb21ibywKCglwYm5fc2lpZzEweF8wLAoJcGJuX3NpaWcxMHhfMSwKCXBibl9zaWlnMTB4XzIsCglwYm5fc2lpZzEweF80LAoJcGJuX3NpaWcyMHhfMCwKCXBibl9zaWlnMjB4XzIsCglwYm5fc2lpZzIweF80LAoJCglwYm5fY29tcHV0b25lXzQsCglwYm5fY29tcHV0b25lXzYsCglwYm5fY29tcHV0b25lXzgsCn07CgpzdGF0aWMgc3RydWN0IHBjaV9ib2FyZCBwY2lfYm9hcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKCS8qCgkgKiBQQ0kgRmxhZ3MsIE51bWJlciBvZiBQb3J0cywgQmFzZSAoTWF4aW11bSkgQmF1ZCBSYXRlLAoJICogT2Zmc2V0IHRvIGdldCB0byBuZXh0IFVBUlQncyByZWdpc3RlcnMsCgkgKiBSZWdpc3RlciBzaGlmdCB0byB1c2UgZm9yIG1lbW9yeS1tYXBwZWQgSS9PLAoJICogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24sIGZpcnN0IFVBUlQgb2Zmc2V0CgkgKi8KCgkvKiBHZW5lcmljIHNlcmlhbCBib2FyZCwgcGJuX2IwXzFfMTE1MjAwLCBwYm5fZGVmYXVsdCAqLwoJeyBTUENJX0ZMX0JBU0UwLCAxLCAxMTUyMDAgfSwJCS8qIHBibl9iMF8xXzExNTIwMCwKCQkJCQkJICAgcGJuX2RlZmF1bHQgKi8KCgl7IFNQQ0lfRkxfQkFTRTAsIDIsIDExNTIwMCB9LAkJLyogcGJuX2IwXzJfMTE1MjAwICovCgl7IFNQQ0lfRkxfQkFTRTAsIDQsIDExNTIwMCB9LAkJLyogcGJuX2IwXzRfMTE1MjAwICovCgoJeyBTUENJX0ZMX0JBU0UwLCAxLCA5MjE2MDAgfSwJCS8qIHBibl9iMF8xXzkyMTYwMCAqLwoJeyBTUENJX0ZMX0JBU0UwLCAyLCA5MjE2MDAgfSwJCS8qIHBibl9iMF8yXzkyMTYwMCAqLwoJeyBTUENJX0ZMX0JBU0UwLCA0LCA5MjE2MDAgfSwJCS8qIHBibl9iMF80XzkyMTYwMCAqLwoKCXsgU1BDSV9GTF9CQVNFMCB8IFNQQ0lfRkxfQkFTRV9UQUJMRSwgMSwgMTE1MjAwIH0sIC8qIHBibl9iMF9idF8xXzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UwIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAyLCAxMTUyMDAgfSwgLyogcGJuX2IwX2J0XzJfMTE1MjAwICovCgl7IFNQQ0lfRkxfQkFTRTAgfCBTUENJX0ZMX0JBU0VfVEFCTEUsIDEsIDQ2MDgwMCB9LCAvKiBwYm5fYjBfYnRfMV80NjA4MDAgKi8KCXsgU1BDSV9GTF9CQVNFMCB8IFNQQ0lfRkxfQkFTRV9UQUJMRSwgMiwgNDYwODAwIH0sIC8qIHBibl9iMF9idF8yXzQ2MDgwMCAqLwoJeyBTUENJX0ZMX0JBU0UwIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAyLCA5MjE2MDAgfSwgLyogcGJuX2IwX2J0XzJfOTIxNjAwICovCgoJeyBTUENJX0ZMX0JBU0UxLCAxLCAxMTUyMDAgfSwJCS8qIHBibl9iMV8xXzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UxLCAyLCAxMTUyMDAgfSwJCS8qIHBibl9iMV8yXzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UxLCA0LCAxMTUyMDAgfSwJCS8qIHBibl9iMV80XzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UxLCA4LCAxMTUyMDAgfSwJCS8qIHBibl9iMV84XzExNTIwMCAqLwoKCXsgU1BDSV9GTF9CQVNFMSwgMiwgOTIxNjAwIH0sCQkvKiBwYm5fYjFfMl85MjE2MDAgKi8KCXsgU1BDSV9GTF9CQVNFMSwgNCwgOTIxNjAwIH0sCQkvKiBwYm5fYjFfNF85MjE2MDAgKi8KCXsgU1BDSV9GTF9CQVNFMSwgOCwgOTIxNjAwIH0sCQkvKiBwYm5fYjFfOF85MjE2MDAgKi8KCgl7IFNQQ0lfRkxfQkFTRTEsIDIsIDEzODI0MDAgfSwJCS8qIHBibl9iMV8yXzEzODI0MDAgKi8KCXsgU1BDSV9GTF9CQVNFMSwgNCwgMTM4MjQwMCB9LAkJLyogcGJuX2IxXzRfMTM4MjQwMCAqLwoJeyBTUENJX0ZMX0JBU0UxLCA4LCAxMzgyNDAwIH0sCQkvKiBwYm5fYjFfOF8xMzgyNDAwICovCgoJeyBTUENJX0ZMX0JBU0UyLCAxLCAxMTUyMDAgfSwJCS8qIHBibl9iMl8xXzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UyLCA4LCAxMTUyMDAgfSwJCS8qIHBibl9iMl84XzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UyLCA0LCA0NjA4MDAgfSwJCS8qIHBibl9iMl80XzQ2MDgwMCAqLwoJeyBTUENJX0ZMX0JBU0UyLCA4LCA0NjA4MDAgfSwJCS8qIHBibl9iMl84XzQ2MDgwMCAqLwoJeyBTUENJX0ZMX0JBU0UyLCAxNiwgNDYwODAwIH0sCQkvKiBwYm5fYjJfMTZfNDYwODAwICovCgl7IFNQQ0lfRkxfQkFTRTIsIDQsIDkyMTYwMCB9LAkJLyogcGJuX2IyXzRfOTIxNjAwICovCgl7IFNQQ0lfRkxfQkFTRTIsIDgsIDkyMTYwMCB9LAkJLyogcGJuX2IyXzhfOTIxNjAwICovCgoJeyBTUENJX0ZMX0JBU0UyIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAxLCAxMTUyMDAgfSwgLyogcGJuX2IyX2J0XzFfMTE1MjAwICovCgl7IFNQQ0lfRkxfQkFTRTIgfCBTUENJX0ZMX0JBU0VfVEFCTEUsIDIsIDExNTIwMCB9LCAvKiBwYm5fYjJfYnRfMl8xMTUyMDAgKi8KCXsgU1BDSV9GTF9CQVNFMiB8IFNQQ0lfRkxfQkFTRV9UQUJMRSwgNCwgMTE1MjAwIH0sIC8qIHBibl9iMl9idF80XzExNTIwMCAqLwoJeyBTUENJX0ZMX0JBU0UyIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAyLCA5MjE2MDAgfSwgLyogcGJuX2IyX2J0XzJfOTIxNjAwICovCgoJeyBTUENJX0ZMX0JBU0UyLCAyLCA5MjE2MDAsIC8qIElPTUVNICovCQkgICAvKiBwYm5fcGFuYWNvbSAqLwoJCTB4NDAwLCA3LCBwY2lfcGx4OTA1MF9mbiB9LAoJeyBTUENJX0ZMX0JBU0UyIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAyLCA5MjE2MDAsICAgLyogcGJuX3BhbmFjb20yICovCgkJMHg0MDAsIDcsIHBjaV9wbHg5MDUwX2ZuIH0sCgl7IFNQQ0lfRkxfQkFTRTIgfCBTUENJX0ZMX0JBU0VfVEFCTEUsIDQsIDkyMTYwMCwgICAvKiBwYm5fcGFuYWNvbTQgKi8KCQkweDQwMCwgNywgcGNpX3BseDkwNTBfZm4gfSwKCXsgU1BDSV9GTF9CQVNFMiwgNCwgOTIxNjAwLAkJCSAgIC8qIHBibl9wbHhfcm9tdWx1cyAqLwoJCTB4MjAsIDIsIHBjaV9wbHg5MDUwX2ZuLCAweDAzIH0sCgkJLyogVGhpcyBib2FyZCB1c2VzIHRoZSBzaXplIG9mIFBDSSBCYXNlIHJlZ2lvbiAwIHRvCgkJICogc2lnbmFsIG5vdyBtYW55IHBvcnRzIGFyZSBhdmFpbGFibGUgKi8KCXsgU1BDSV9GTF9CQVNFMCB8IFNQQ0lfRkxfUkVHSU9OX1NaX0NBUCwgMzIsIDExNTIwMCB9LCAvKiBwYm5fb3hzZW1pICovCgl7IFNQQ0lfRkxfQkFTRV9UQUJMRSwgMSwgOTIxNjAwLAkJICAgLyogcGJuX3RpbWVkaWEgKi8KCQkwLCAwLCBwY2lfdGltZWRpYV9mbiB9LAoJLyogRUtGIGFkZGl0aW9uIGZvciBpOTYwIEJvYXJkcyBmb3JtIEVLRiB3aXRoIHNlcmlhbCBwb3J0ICovCgl7IFNQQ0lfRkxfQkFTRTAsIDMyLCA5MjE2MDAsIC8qIG1heCAyNTYgcG9ydHMgKi8gICAvKiBwYm5faW50ZWxfaTk2MCAqLwoJCTg8PDIsIDIsIHBjaV9pbnRlbGk5NjBuaV9mbiwgMHgxMDAwMH0sCgl7IFNQQ0lfRkxfQkFTRTAgfCBTUENJX0ZMX0lSUVJFU09VUkNFLAkJICAgLyogcGJuX3NnaV9pb2MzICovCgkJMSwgNDU4MzMzLCAwLCAwLCAwLCAweDIwMTc4IH0sCgl7IFNQQ0lfRkxfQkFTRTAsIDUsIDExNTIwMCwgOCwgMCwgcGNpX2hwX2RpdmEsIDB9LCAgIC8qIHBibl9ocF9kaXZhICovCiNpZmRlZiBDT05GSUdfRERCNTA3NAoJLyoKCSAqIE5FQyBWcmMtNTA3NCAoTmlsZSA0KSBidWlsdGluIFVBUlQuCgkgKiBDb25kaXRpb25hbGx5IGNvbXBpbGVkIGluIHNpbmNlIHRoaXMgaXMgYSBtb3RoZXJib2FyZCBkZXZpY2UuCgkgKi8KCXsgU1BDSV9GTF9CQVNFMCwgMSwgNTIwODMzLAkJCSAgIC8qIHBibl9uZWNfbmlsZTQgKi8KCQk2NCwgMywgTlVMTCwgMHgzMDAgfSwKI2VuZGlmCgoJe1NQQ0lfRkxfQkFTRTMsIDQsIDExNTIwMCwgOH0sCQkJICAgLyogcGJuX2RjaV9wY2NvbTQgKi8KCXtTUENJX0ZMX0JBU0UzLCA4LCAxMTUyMDAsIDh9LAkJCSAgIC8qIHBibl9kY2lfcGNjb204ICovCgoJeyBTUENJX0ZMX0JBU0UwLCAxLCAxMTUyMDAsCQkJICAvKiBwYm5feGlyY29tX2NvbWJvICovCgkJMCwgMCwgcGNpX3hpcmNvbV9mbiB9LAoKCXsgU1BDSV9GTF9CQVNFMiwgMSwgNDYwODAwLAkJCSAgIC8qIHBibl9zaWlnMTB4XzAgKi8KCQkwLCAwLCBwY2lfc2lpZzEweF9mbiB9LAoJeyBTUENJX0ZMX0JBU0UyLCAxLCA5MjE2MDAsCQkJICAgLyogcGJuX3NpaWcxMHhfMSAqLwoJCTAsIDAsIHBjaV9zaWlnMTB4X2ZuIH0sCgl7IFNQQ0lfRkxfQkFTRTIgfCBTUENJX0ZMX0JBU0VfVEFCTEUsIDIsIDkyMTYwMCwgICAvKiBwYm5fc2lpZzEweF8yICovCgkJMCwgMCwgcGNpX3NpaWcxMHhfZm4gfSwKCXsgU1BDSV9GTF9CQVNFMiB8IFNQQ0lfRkxfQkFTRV9UQUJMRSwgNCwgOTIxNjAwLCAgIC8qIHBibl9zaWlnMTB4XzQgKi8KCQkwLCAwLCBwY2lfc2lpZzEweF9mbiB9LAoJeyBTUENJX0ZMX0JBU0UwLCAxLCA5MjE2MDAsCQkJICAgLyogcGJuX3NpaXgyMHhfMCAqLwoJCTAsIDAsIHBjaV9zaWlnMjB4X2ZuIH0sCgl7IFNQQ0lfRkxfQkFTRTAgfCBTUENJX0ZMX0JBU0VfVEFCTEUsIDIsIDkyMTYwMCwgICAvKiBwYm5fc2lpeDIweF8yICovCgkJMCwgMCwgcGNpX3NpaWcyMHhfZm4gfSwKCXsgU1BDSV9GTF9CQVNFMCB8IFNQQ0lfRkxfQkFTRV9UQUJMRSwgNCwgOTIxNjAwLCAgIC8qIHBibl9zaWl4MjB4XzQgKi8KCQkwLCAwLCBwY2lfc2lpZzIweF9mbiB9LAoKCXsgU1BDSV9GTF9CQVNFMCwgNCwgOTIxNjAwLCAvKiBJT01FTSAqLwkJICAgLyogcGJuX2NvbXB1dG9uZV80ICovCgkJMHg0MCwgMiwgTlVMTCwgMHgyMDAgfSwKCXsgU1BDSV9GTF9CQVNFMCwgNiwgOTIxNjAwLCAvKiBJT01FTSAqLwkJICAgLyogcGJuX2NvbXB1dG9uZV82ICovCgkJMHg0MCwgMiwgTlVMTCwgMHgyMDAgfSwKCXsgU1BDSV9GTF9CQVNFMCwgOCwgOTIxNjAwLCAvKiBJT01FTSAqLwkJICAgLyogcGJuX2NvbXB1dG9uZV84ICovCgkJMHg0MCwgMiwgTlVMTCwgMHgyMDAgfSwKfTsKCi8qCiAqIEdpdmVuIGEgY29tcGxldGUgdW5rbm93biBQQ0kgZGV2aWNlLCB0cnkgdG8gdXNlIHNvbWUgaGV1cmlzdGljcyB0bwogKiBndWVzcyB3aGF0IHRoZSBjb25maWd1cmF0aW9uIG1pZ2h0IGJlLCBiYXNlZCBvbiB0aGUgcGl0aWZ1bCBQQ0kKICogc2VyaWFsIHNwZWNzLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDEgb24gZmFpbHVyZS4KICovCnN0YXRpYyBpbnQgX19kZXZpbml0IHNlcmlhbF9wY2lfZ3Vlc3NfYm9hcmQoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCQkgICBzdHJ1Y3QgcGNpX2JvYXJkICpib2FyZCkKewoJaW50CW51bV9pb21lbSA9IDAsIG51bV9wb3J0ID0gMCwgZmlyc3RfcG9ydCA9IC0xOwoJaW50CWk7CgkKCS8qCgkgKiBJZiBpdCBpcyBub3QgYSBjb21tdW5pY2F0aW9ucyBkZXZpY2Ugb3IgdGhlIHByb2dyYW1taW5nCgkgKiBpbnRlcmZhY2UgaXMgZ3JlYXRlciB0aGFuIDYsIGdpdmUgdXAuCgkgKgoJICogKFNob3VsZCB3ZSB0cnkgdG8gbWFrZSBndWVzc2VzIGZvciBtdWx0aXBvcnQgc2VyaWFsIGRldmljZXMKCSAqIGxhdGVyPykgCgkgKi8KCWlmICgoKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCkgJiYKCSAgICAoKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX0NPTU1VTklDQVRJT05fTU9ERU0pKSB8fAoJICAgIChkZXYtPmNsYXNzICYgMHhmZikgPiA2KQoJCXJldHVybiAxOwoKCWZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CgkJaWYgKElTX1BDSV9SRUdJT05fSU9QT1JUKGRldiwgaSkpIHsKCQkJbnVtX3BvcnQrKzsKCQkJaWYgKGZpcnN0X3BvcnQgPT0gLTEpCgkJCQlmaXJzdF9wb3J0ID0gaTsKCQl9CgkJaWYgKElTX1BDSV9SRUdJT05fSU9NRU0oZGV2LCBpKSkKCQkJbnVtX2lvbWVtKys7Cgl9CgoJLyoKCSAqIElmIHRoZXJlIGlzIDEgb3IgMCBpb21lbSByZWdpb25zLCBhbmQgZXhhY3RseSBvbmUgcG9ydCwgdXNlCgkgKiBpdC4KCSAqLwoJaWYgKG51bV9pb21lbSA8PSAxICYmIG51bV9wb3J0ID09IDEpIHsKCQlib2FyZC0+ZmxhZ3MgPSBmaXJzdF9wb3J0OwoJCXJldHVybiAwOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHNlcmlhbF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAoJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQp7CglzdHJ1Y3QgcGNpX2JvYXJkICpib2FyZCwgdG1wOwoJaW50IHJjOwoKCWJvYXJkID0gJnBjaV9ib2FyZHNbZW50LT5kcml2ZXJfZGF0YV07CgoJcmMgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwoJaWYgKHJjKSByZXR1cm4gcmM7CgoJaWYgKGVudC0+ZHJpdmVyX2RhdGEgPT0gcGJuX2RlZmF1bHQgJiYKCSAgICBzZXJpYWxfcGNpX2d1ZXNzX2JvYXJkKGRldiwgYm9hcmQpKQoJCXJldHVybiAtRU5PREVWOwoJZWxzZSBpZiAoc2VyaWFsX3BjaV9ndWVzc19ib2FyZChkZXYsICZ0bXApID09IDApIHsKCQlwcmludGsoS0VSTl9JTkZPICJSZWR1bmRhbnQgZW50cnkgaW4gc2VyaWFsIHBjaV90YWJsZS4gICIKCQkgICAgICAgIlBsZWFzZSBzZW5kIHRoZSBvdXRwdXQgb2ZcbiIKCQkgICAgICAgImxzcGNpIC12diwgdGhpcyBtZXNzYWdlICglMDR4LCUwNHgsJTA0eCwlMDR4KVxuIgoJCSAgICAgICAiYW5kIHRoZSBtYW51ZmFjdHVyZXIgYW5kIG5hbWUgb2YgIgoJCSAgICAgICAic2VyaWFsIGJvYXJkIG9yIG1vZGVtIGJvYXJkXG4iCgkJICAgICAgICJ0byBzZXJpYWwtcGNpLWluZm9AbGlzdHMuc291cmNlZm9yZ2UubmV0LlxuIiwKCQkgICAgICAgZGV2LT52ZW5kb3IsIGRldi0+ZGV2aWNlLAoJCSAgICAgICBwY2lfZ2V0X3N1YnZlbmRvcihkZXYpLCBwY2lfZ2V0X3N1YmRldmljZShkZXYpKTsKCX0KCQkgICAgICAgCglzdGFydF9wY2lfcG5wX2JvYXJkKGRldiwgYm9hcmQpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2VyaWFsX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKewoJaW50CWk7CgoJLyoKCSAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBvcnRzIGZpbmRpbmcgdGhvc2UgdGhhdCBiZWxvbmcKCSAqIHRvIHRoaXMgUENJIGRldmljZS4KCSAqLwoJZm9yKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgewoJCWlmIChyc190YWJsZVtpXS5kZXYgIT0gZGV2KQoJCQljb250aW51ZTsKCQl1bnJlZ2lzdGVyX3NlcmlhbChpKTsKCQlyc190YWJsZVtpXS5kZXYgPSAwOwoJfQoJLyoKCSAqIE5vdyBleGVjdXRlIGFueSBib2FyZC1zcGVjaWZpYyBzaHV0ZG93biBwcm9jZWR1cmUKCSAqLwoJZm9yIChpPTA7IGkgPCBOUl9QQ0lfQk9BUkRTOyBpKyspIHsKCQlzdHJ1Y3QgcGNpX2JvYXJkX2luc3QgKmJyZCA9ICZzZXJpYWxfcGNpX2JvYXJkW2ldOwoKCQlpZiAoc2VyaWFsX3BjaV9ib2FyZFtpXS5kZXYgIT0gZGV2KQoJCQljb250aW51ZTsKCQlpZiAoYnJkLT5ib2FyZC5pbml0X2ZuKQoJCQkoYnJkLT5ib2FyZC5pbml0X2ZuKShicmQtPmRldiwgJmJyZC0+Ym9hcmQsIDApOwoJCWlmIChERUFDVElWQVRFX0ZVTkMoYnJkLT5kZXYpKQoJCQkoREVBQ1RJVkFURV9GVU5DKGJyZC0+ZGV2KSkoYnJkLT5kZXYpOwoJCXNlcmlhbF9wY2lfYm9hcmRbaV0uZGV2ID0gMDsKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzZXJpYWxfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjk2MCwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfMjMyLCAwLCAwLAoJCXBibl9iMV84XzEzODI0MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9WMywgUENJX0RFVklDRV9JRF9WM19WOTYwLAoJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAoJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JINF8yMzIsIDAsIDAsCgkJcGJuX2IxXzRfMTM4MjQwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1Y5NjAsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgyXzIzMiwgMCwgMCwKCQlwYm5fYjFfMl8xMzgyNDAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjM1MSwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfMjMyLCAwLCAwLAoJCXBibl9iMV84XzEzODI0MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9WMywgUENJX0RFVklDRV9JRF9WM19WMzUxLAoJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAoJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JINF8yMzIsIDAsIDAsCgkJcGJuX2IxXzRfMTM4MjQwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1YzNTEsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgyXzIzMiwgMCwgMCwKCQlwYm5fYjFfMl8xMzgyNDAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjM1MSwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfNDg1LCAwLCAwLAoJCXBibl9iMV84XzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1YzNTEsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg4XzQ4NV80XzQsIDAsIDAsCgkJcGJuX2IxXzhfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjM1MSwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDRfNDg1LCAwLCAwLAoJCXBibl9iMV80XzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1YzNTEsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg0XzQ4NV8yXzIsIDAsIDAsCgkJcGJuX2IxXzRfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjM1MSwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDJfNDg1LCAwLCAwLAoJCXBibl9iMV8yXzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1YzNTEsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg4XzQ4NV8yXzYsIDAsIDAsCgkJcGJuX2IxXzhfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVjMsIFBDSV9ERVZJQ0VfSURfVjNfVjM1MSwKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDA4MTEwMVYxLCAwLCAwLAoJCXBibl9iMV84XzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1YzLCBQQ0lfREVWSUNFX0lEX1YzX1YzNTEsCgkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCgkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgwNDExMDFWMSwgMCwgMCwKCQlwYm5fYjFfNF85MjE2MDAgfSwKCgl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVTUzMCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjJfYnRfMV8xMTUyMDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9TRUFMRVZFTCwgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9VQ09NTTIsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IyX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVUNPTU00MjIsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IyX2J0XzRfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVUNPTU0yMzIsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IyX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfQ09NTTQsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IyX2J0XzRfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfQ09NTTgsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IyXzhfMTE1MjAwIH0sCgoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfR1RFS19TRVJJQUwyLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX2IyX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF9TUENPTTIwMCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9iMl9idF8yXzkyMTYwMCB9LAoJLyogVlNjb20gU1BDT004MDAsIGZyb20gc2xAcy5wbCAqLwoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfU1BDT004MDAsIAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMl84XzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfMTA3NywKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjJfNF85MjE2MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYXzkwNTAsCgkJUENJX1NVQlZFTkRPUl9JRF9LRVlTUEFOLAoJCVBDSV9TVUJERVZJQ0VfSURfS0VZU1BBTl9TWDIsIDAsIDAsCgkJcGJuX3BhbmFjb20gfSwKCXsJUENJX1ZFTkRPUl9JRF9QQU5BQ09NLCBQQ0lfREVWSUNFX0lEX1BBTkFDT01fUVVBRE1PREVNLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX3BhbmFjb200IH0sCgl7CVBDSV9WRU5ET1JfSURfUEFOQUNPTSwgUENJX0RFVklDRV9JRF9QQU5BQ09NX0RVQUxNT0RFTSwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9wYW5hY29tMiB9LAoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfOTA1MCwKCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSUZBU1QsCgkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUNCwgMCwgMCwgCgkJcGJuX2IyXzRfNDYwODAwIH0sCgl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAoJCVBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJRkFTVCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1Q4LCAwLCAwLCAKCQlwYm5fYjJfOF80NjA4MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYXzkwNTAsCgkJUENJX1NVQlZFTkRPUl9JRF9DSEFTRV9QQ0lGQVNULAoJCVBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDE2LCAwLCAwLCAKCQlwYm5fYjJfMTZfNDYwODAwIH0sCgl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAoJCVBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJRkFTVCwKCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1QxNkZNQywgMCwgMCwgCgkJcGJuX2IyXzE2XzQ2MDgwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfOTA1MCwKCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSVJBUywKCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSVJBUzQsIDAsIDAsIAoJCXBibl9iMl80XzQ2MDgwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfOTA1MCwKCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSVJBUywKCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSVJBUzgsIDAsIDAsIAoJCXBibl9iMl84XzQ2MDgwMCB9LAoJLyogTWVnYXdvbGYgUm9tdWx1cyBQQ0kgU2VyaWFsIENhcmQsIGZyb20gTWlrZSBIdWRzb24gKi8KCS8qIChFeG9yYXlAaXN5cy5jYSkgKi8KCXsJUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYX1JPTVVMVVMsCgkJMHgxMGI1LCAweDEwNmEsIDAsIDAsCgkJcGJuX3BseF9yb211bHVzIH0sCgl7CVBDSV9WRU5ET1JfSURfUVVBVEVDSCwgUENJX0RFVklDRV9JRF9RVUFURUNIX1FTQzEwMCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjFfNF8xMTUyMDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9RVUFURUNILCBQQ0lfREVWSUNFX0lEX1FVQVRFQ0hfRFNDMTAwLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMV8yXzExNTIwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1FVQVRFQ0gsIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9FU0MxMDBELAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMV84XzExNTIwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1FVQVRFQ0gsIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9FU0MxMDBNLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMV84XzExNTIwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQsCgkJUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9TVUJERVZJQ0VfSURfU1BFQ0lBTElYX1NQRUVENCwgMCwgMCwgCgkJcGJuX2IwXzRfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjBfNF8xMTUyMDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9PWFNFTUksIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTUyLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMF9idF8yXzkyMTYwMCB9LAoKCS8qIERpZ2l0YW4gRFM1NjAtNTU4LCBmcm9tIGppbWRAZXNvZnQuY29tICovCgl7CVBDSV9WRU5ET1JfSURfQVRULCBQQ0lfREVWSUNFX0lEX0FUVF9WRU5VU19NT0RFTSwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjFfMV8xMTUyMDAgfSwKCgkvKiAzQ29tIFVTIFJvYm90aWNzIDU2ayBWb2ljZSBJbnRlcm5hbCBQQ0kgbW9kZWwgNTYxMCAqLwoJewlQQ0lfVkVORE9SX0lEX1VTUiwgMHgxMDA4LAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCgoJLyogVGl0YW4gRWxlY3Ryb25pYyBjYXJkcyAqLwoJewlQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzEwMCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKCQlwYm5fYjBfMV85MjE2MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9USVRBTiwgUENJX0RFVklDRV9JRF9USVRBTl8yMDAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IwXzJfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVElUQU4sIFBDSV9ERVZJQ0VfSURfVElUQU5fNDAwLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAoJCXBibl9iMF80XzkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzgwMEIsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCgkJcGJuX2IwXzRfOTIxNjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfVElUQU4sIFBDSV9ERVZJQ0VfSURfVElUQU5fMTAwTCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAoJCVNQQ0lfRkxfQkFTRTEsIDEsIDkyMTYwMCB9LAoJewlQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzIwMEwsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKCQlTUENJX0ZMX0JBU0UxIHwgU1BDSV9GTF9CQVNFX1RBQkxFLCAyLCA5MjE2MDAgfSwKCS8qIFRoZSA0MDBMIGFuZCA4MDBMIGhhdmUgYSBjdXN0b20gaGFjayBpbiBnZXRfcGNpX3BvcnQgKi8KCXsJUENJX1ZFTkRPUl9JRF9USVRBTiwgUENJX0RFVklDRV9JRF9USVRBTl80MDBMLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkJU1BDSV9GTF9CQVNFX1RBQkxFLCA0LCA5MjE2MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9USVRBTiwgUENJX0RFVklDRV9JRF9USVRBTl84MDBMLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkJU1BDSV9GTF9CQVNFX1RBQkxFLCA4LCA5MjE2MDAgfSwKCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzEweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzEweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzEweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzEweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF80IH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzEweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF80IH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzEweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzEweF80IH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzIweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzIweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzFTXzIweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8wIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzIweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzIweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzJTXzIweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF8yIH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzIweF81NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF80IH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzIweF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF80IH0sCgl7CVBDSV9WRU5ET1JfSURfU0lJRywgUENJX0RFVklDRV9JRF9TSUlHXzRTXzIweF84NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fc2lpZzIweF80IH0sCgoJLyogQ29tcHV0b25lIGRldmljZXMgc3VibWl0dGVkIGJ5IERvdWcgTWNOYXNoIGRtY25hc2hAY29tcHV0b25lLmNvbSAqLwoJewlQQ0lfVkVORE9SX0lEX0NPTVBVVE9ORSwgUENJX0RFVklDRV9JRF9DT01QVVRPTkVfUEcsCgkJUENJX1NVQlZFTkRPUl9JRF9DT01QVVRPTkUsIFBDSV9TVUJERVZJQ0VfSURfQ09NUFVUT05FX1BHNCwKCQkwLCAwLCBwYm5fY29tcHV0b25lXzQgfSwKCXsJUENJX1ZFTkRPUl9JRF9DT01QVVRPTkUsIFBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX1BHLAoJCVBDSV9TVUJWRU5ET1JfSURfQ09NUFVUT05FLCBQQ0lfU1VCREVWSUNFX0lEX0NPTVBVVE9ORV9QRzgsCgkJMCwgMCwgcGJuX2NvbXB1dG9uZV84IH0sCgl7CVBDSV9WRU5ET1JfSURfQ09NUFVUT05FLCBQQ0lfREVWSUNFX0lEX0NPTVBVVE9ORV9QRywKCQlQQ0lfU1VCVkVORE9SX0lEX0NPTVBVVE9ORSwgUENJX1NVQkRFVklDRV9JRF9DT01QVVRPTkVfUEc2LAoJCTAsIDAsIHBibl9jb21wdXRvbmVfNiB9LAoKCXsJUENJX1ZFTkRPUl9JRF9PWFNFTUksIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTVOLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHBibl9veHNlbWkgfSwKCXsJUENJX1ZFTkRPUl9JRF9USU1FRElBLCBQQ0lfREVWSUNFX0lEX1RJTUVESUFfMTg4OSwKCQlQQ0lfVkVORE9SX0lEX1RJTUVESUEsIFBDSV9BTllfSUQsIDAsIDAsIHBibl90aW1lZGlhIH0sCgoJewlQQ0lfVkVORE9SX0lEX0xBVkEsIFBDSV9ERVZJQ0VfSURfTEFWQV9EU0VSSUFMLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX2IwX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfTEFWQSwgUENJX0RFVklDRV9JRF9MQVZBX1FVQVRST19BLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX2IwX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfTEFWQSwgUENJX0RFVklDRV9JRF9MQVZBX1FVQVRST19CLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX2IwX2J0XzJfMTE1MjAwIH0sCgl7CVBDSV9WRU5ET1JfSURfTEFWQSwgUENJX0RFVklDRV9JRF9MQVZBX1BPUlRfUExVUywKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9iMF9idF8yXzQ2MDgwMCB9LAoJewlQQ0lfVkVORE9SX0lEX0xBVkEsIFBDSV9ERVZJQ0VfSURfTEFWQV9RVUFEX0EsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fYjBfYnRfMl80NjA4MDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9MQVZBLCBQQ0lfREVWSUNFX0lEX0xBVkFfUVVBRF9CLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX2IwX2J0XzJfNDYwODAwIH0sCgl7CVBDSV9WRU5ET1JfSURfTEFWQSwgUENJX0RFVklDRV9JRF9MQVZBX1NTRVJJQUwsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fYjBfYnRfMV8xMTUyMDAgfSwKCXsJUENJX1ZFTkRPUl9JRF9MQVZBLCBQQ0lfREVWSUNFX0lEX0xBVkFfUE9SVF82NTAsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fYjBfYnRfMV80NjA4MDAgfSwKCgkvKiBSQVN0ZWwgMiBwb3J0IG1vZGVtLCBnZXJnQG1vcmV0b24uY29tLmF1ICovCgl7CVBDSV9WRU5ET1JfSURfTU9SRVRPTiwgUENJX0RFVklDRV9JRF9SQVNURUxfMlBPUlQsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fYjJfYnRfMl8xMTUyMDAgfSwKCgkvKiBFS0YgYWRkaXRpb24gZm9yIGk5NjAgQm9hcmRzIGZvcm0gRUtGIHdpdGggc2VyaWFsIHBvcnQgKi8KCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxOTYwLAoJCTB4RTRCRiwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5faW50ZWxfaTk2MCB9LAoKCS8qIFhpcmNvbSBDYXJkYnVzL0V0aGVybmV0IGNvbWJvcyAqLwoJewlQQ0lfVkVORE9SX0lEX1hJUkNPTSwgUENJX0RFVklDRV9JRF9YSVJDT01fWDMyMDFfTURNLAoJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCgkJcGJuX3hpcmNvbV9jb21ibyB9LAoKCS8qCgkgKiBVbnRlc3RlZCBQQ0kgbW9kZW1zLCBzZW50IGluIGZyb20gdmFyaW91cyBmb2xrcy4uLgoJICovCgoJLyogRWxzYSBNb2RlbCA1NksgUENJIE1vZGVtLCBmcm9tIEFuZHJlYXMgUmF0aCA8YXJoQDAxMDE5ZnJlZW5ldC5kZT4gKi8KCXsJUENJX1ZFTkRPUl9JRF9ST0NLV0VMTCwgMHgxMDA0LAoJCTB4MTA0OCwgMHgxNTAwLCAwLCAwLAoJCXBibl9iMV8xXzExNTIwMCB9LAoKCXsJUENJX1ZFTkRPUl9JRF9TR0ksIFBDSV9ERVZJQ0VfSURfU0dJX0lPQzMsCgkJMHhGRjAwLCAwLCAwLCAwLAoJCXBibl9zZ2lfaW9jMyB9LAoKCS8qIEhQIERpdmEgY2FyZCAqLwoJewlQQ0lfVkVORE9SX0lEX0hQLCBQQ0lfREVWSUNFX0lEX0hQX1NBUywKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9ocF9kaXZhIH0sCgl7CVBDSV9WRU5ET1JfSURfSFAsIDB4MTI5MCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9iMl8xXzExNTIwMCB9LAoKI2lmZGVmIENPTkZJR19EREI1MDc0CgkvKgoJICogTkVDIFZyYy01MDc0IChOaWxlIDQpIGJ1aWx0aW4gVUFSVC4KCSAqIENvbmRpdGlvbmFsbHkgY29tcGlsZWQgaW4gc2luY2UgdGhpcyBpcyBhIG1vdGhlcmJvYXJkIGRldmljZS4KCSAqLwoJewlQQ0lfVkVORE9SX0lEX05FQywgUENJX0RFVklDRV9JRF9ORUNfTklMRTQsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fbmVjX25pbGU0IH0sCiNlbmRpZgoKCXsJUENJX1ZFTkRPUl9JRF9EQ0ksIFBDSV9ERVZJQ0VfSURfRENJX1BDQ09NNCwKCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAoJCXBibl9kY2lfcGNjb200IH0sCgl7CVBDSV9WRU5ET1JfSURfRENJLCBQQ0lfREVWSUNFX0lEX0RDSV9QQ0NPTTgsCgkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKCQlwYm5fZGNpX3BjY29tOCB9LAoKICAgICAgIHsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKCSBQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZmZmMDAsIH0sCiAgICAgICB7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fTU9ERU0gPDwgOCwgMHhmZmZmMDAsIH0sCiAgICAgICB7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzZXJpYWxfcGNpX3RibCk7CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2VyaWFsX3BjaV9kcml2ZXIgPSB7CiAgICAgICBuYW1lOiAgICAgICAgICAgInNlcmlhbCIsCiAgICAgICBwcm9iZTogICAgICAgICAgc2VyaWFsX2luaXRfb25lLAogICAgICAgcmVtb3ZlOgkgICAgICAgX19kZXZleGl0X3Aoc2VyaWFsX3JlbW92ZV9vbmUpLAogICAgICAgaWRfdGFibGU6ICAgICAgIHNlcmlhbF9wY2lfdGJsLAp9OwoKCi8qCiAqIFF1ZXJ5IFBDSSBzcGFjZSBmb3Iga25vd24gc2VyaWFsIGJvYXJkcwogKiBJZiBmb3VuZCwgYWRkIHRoZW0gdG8gdGhlIFBDSSBkZXZpY2Ugc3BhY2UgaW4gcnNfdGFibGVbXQogKgogKiBBY2NlcHQgYSBtYXhpbXVtIG9mIGVpZ2h0IGJvYXJkcwogKgogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IHByb2JlX3NlcmlhbF9wY2kodm9pZCkgCnsKI2lmZGVmIFNFUklBTF9ERUJVR19QQ0kKCXByaW50ayhLRVJOX0RFQlVHICJFbnRlcmVkIHByb2JlX3NlcmlhbF9wY2koKVxuIik7CiNlbmRpZgoKCS8qIFJlZ2lzdGVyIGNhbGwgUENJIHNlcmlhbCBkZXZpY2VzLiAgTnVsbCBvdXQKCSAqIHRoZSBkcml2ZXIgbmFtZSB1cG9uIGZhaWx1cmUsIGFzIGEgc2lnbmFsCgkgKiBub3QgdG8gYXR0ZW1wdCB0byB1bnJlZ2lzdGVyIHRoZSBkcml2ZXIgbGF0ZXIKCSAqLwoJaWYgKHBjaV9tb2R1bGVfaW5pdCAoJnNlcmlhbF9wY2lfZHJpdmVyKSAhPSAwKQoJCXNlcmlhbF9wY2lfZHJpdmVyLm5hbWUgPSAiIjsKCiNpZmRlZiBTRVJJQUxfREVCVUdfUENJCglwcmludGsoS0VSTl9ERUJVRyAiTGVhdmluZyBwcm9iZV9zZXJpYWxfcGNpKCkgKHByb2JlIGZpbmlzaGVkKVxuIik7CiNlbmRpZgoJcmV0dXJuOwp9CgojZW5kaWYgLyogRU5BQkxFX1NFUklBTF9QQ0kgKi8KCiNpZmRlZiBFTkFCTEVfU0VSSUFMX1BOUAoKc3RydWN0IHBucF9ib2FyZCB7Cgl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Cgl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7Cn07CgpzdGF0aWMgc3RydWN0IHBucF9ib2FyZCBwbnBfZGV2aWNlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CgkvKiBBcmNodGVrIEFtZXJpY2EgQ29ycC4gKi8KCS8qIEFyY2h0ZWsgU21hcnRMaW5rIE1vZGVtIDMzMzRCVCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdBJywgJ0EnLCAnQycpLCBJU0FQTlBfREVWSUNFKDB4MDAwRikgfSwKCS8qIEFuY2hvciBEYXRhY29tbSBCViAqLwoJLyogU1hQcm8gMTQ0IEV4dGVybmFsIERhdGEgRmF4IE1vZGVtIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdDJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAxKSB9LAoJLyogU1hQcm8gMjg4IEV4dGVybmFsIERhdGEgRmF4IE1vZGVtIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdDJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAyKSB9LAoJLyogUm9ja3dlbGwgNTZLIEFDRiBJSSBGYXgrRGF0YStWb2ljZSBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdBJywgJ0snLCAnWScpLCBJU0FQTlBfREVWSUNFKDB4MTAyMSkgfSwKCS8qIEFaVDMwMDUgUG5QIFNPVU5EIERFVklDRSAqLwoJewlJU0FQTlBfVkVORE9SKCdBJywgJ1onLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4NDAwMSkgfSwKCS8qIEJlc3QgRGF0YSBQcm9kdWN0cyBJbmMuIFNtYXJ0IE9uZSAzMzZGIFBuUCBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdCJywgJ0QnLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4MzMzNikgfSwKCS8qICBCb2NhIFJlc2VhcmNoICovCgkvKiBCb2NhIENvbXBsZXRlIE9mYyBDb21tdW5pY2F0b3IgMTQuNCBEYXRhLUZBWCAqLwoJewlJU0FQTlBfVkVORE9SKCdCJywgJ1InLCAnSScpLCBJU0FQTlBfREVWSUNFKDB4MEE0OSkgfSwKCS8qIEJvY2EgUmVzZWFyY2ggMzMsNjAwIEFDRiBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdCJywgJ1InLCAnSScpLCBJU0FQTlBfREVWSUNFKDB4MTQwMCkgfSwKCS8qIEJvY2EgMzMuNiBLYnBzIEludGVybmFsIEZEMzRGU1ZEICovCgl7CUlTQVBOUF9WRU5ET1IoJ0InLCAnUicsICdJJyksIElTQVBOUF9ERVZJQ0UoMHgzNDAwKSB9LAoJLyogQm9jYSAzMy42IEticHMgSW50ZXJuYWwgRkQzNEZTVkQgKi8KCXsJSVNBUE5QX1ZFTkRPUignQicsICdSJywgJ0knKSwgSVNBUE5QX0RFVklDRSgweDBBNDkpIH0sCgkvKiBCZXN0IERhdGEgUHJvZHVjdHMgSW5jLiBTbWFydCBPbmUgMzM2RiBQblAgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignQicsICdEJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDMzMzYpIH0sCgkvKiBDb21wdXRlciBQZXJpcGhlcmFscyBJbmMgKi8KCS8qIEV1cm9WaVZhIENvbW1DZW50ZXItMzMuNiBTUCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignQycsICdQJywgJ0knKSwgSVNBUE5QX0RFVklDRSgweDQwNTApIH0sCgkvKiBDcmVhdGl2ZSBMYWJzICovCgkvKiBDcmVhdGl2ZSBMYWJzIFBob25lIEJsYXN0ZXIgMjguOCBEU1ZEIFBuUCBWb2ljZSAqLwoJewlJU0FQTlBfVkVORE9SKCdDJywgJ1QnLCAnTCcpLCBJU0FQTlBfREVWSUNFKDB4MzAwMSkgfSwKCS8qIENyZWF0aXZlIExhYnMgTW9kZW0gQmxhc3RlciAyOC44IERTVkQgUG5QIFZvaWNlICovCgl7CUlTQVBOUF9WRU5ET1IoJ0MnLCAnVCcsICdMJyksIElTQVBOUF9ERVZJQ0UoMHgzMDExKSB9LAoJLyogQ3JlYXRpdmUgKi8KCS8qIENyZWF0aXZlIE1vZGVtIEJsYXN0ZXIgRmxhc2g1NiBESTU2MDEtMSAqLwoJewlJU0FQTlBfVkVORE9SKCdEJywgJ00nLCAnQicpLCBJU0FQTlBfREVWSUNFKDB4MTAzMikgfSwKCS8qIENyZWF0aXZlIE1vZGVtIEJsYXN0ZXIgVi45MCBESTU2NjAgKi8KCXsJSVNBUE5QX1ZFTkRPUignRCcsICdNJywgJ0InKSwgSVNBUE5QX0RFVklDRSgweDIwMDEpIH0sCgkvKiBGVUpJVFNVICovCgkvKiBGdWppdHN1IDMzNjAwIFBuUC1JMiBSIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0YnLCAnVScsICdKJyksIElTQVBOUF9ERVZJQ0UoMHgwMjAyKSB9LAoJLyogRnVqaXRzdSBGTVYtRlg0MzEgUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignRicsICdVJywgJ0onKSwgSVNBUE5QX0RFVklDRSgweDAyMDUpIH0sCgkvKiBGdWppdHN1IDMzNjAwIFBuUC1JNCBSIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0YnLCAnVScsICdKJyksIElTQVBOUF9ERVZJQ0UoMHgwMjA2KSB9LAoJLyogRnVqaXRzdSBGYXggVm9pY2UgMzM2MDAgUE5QLUk1IFIgUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignRicsICdVJywgJ0onKSwgSVNBUE5QX0RFVklDRSgweDAyMDkpIH0sCgkvKiBBcmNodGVrIEFtZXJpY2EgQ29ycC4gKi8KCS8qIEFyY2h0ZWsgU21hcnRMaW5rIE1vZGVtIDMzMzRCVCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdHJywgJ1YnLCAnQycpLCBJU0FQTlBfREVWSUNFKDB4MDAwRikgfSwKCS8qIEhheWVzICovCgkvKiBIYXllcyBPcHRpbWEgMjg4IFYuMzQtVi5GQyArIEZBWCArIFZvaWNlIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAxKSB9LAoJLyogSGF5ZXMgT3B0aW1hIDMzNiBWLjM0ICsgRkFYICsgVm9pY2UgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHgwMDBDKSB9LAoJLyogSGF5ZXMgT3B0aW1hIDMzNkIgVi4zNCArIEZBWCArIFZvaWNlIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdIJywgJ0EnLCAnWScpLCBJU0FQTlBfREVWSUNFKDB4MDAwRCkgfSwKCS8qIEhheWVzIEFjY3VyYSA1NksgRXh0IEZheCBNb2RlbSBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignSCcsICdBJywgJ1knKSwgSVNBUE5QX0RFVklDRSgweDU2NzApIH0sCgkvKiBIYXllcyBBY2N1cmEgNTZLIEV4dCBGYXggTW9kZW0gUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHg1Njc0KSB9LAoJLyogSGF5ZXMgQWNjdXJhIDU2SyBGYXggTW9kZW0gUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHg1Njc1KSB9LAoJLyogSGF5ZXMgMjg4LCBWLjM0ICsgRkFYICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHhGMDAwKSB9LAoJLyogSGF5ZXMgT3B0aW1hIDI4OCBWLjM0ICsgRkFYICsgVm9pY2UsIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ0gnLCAnQScsICdZJyksIElTQVBOUF9ERVZJQ0UoMHhGMDAxKSB9LAoJLyogSUJNICovCgkvKiBJQk0gVGhpbmtwYWQgNzAxIEludGVybmFsIE1vZGVtIFZvaWNlICovCgl7CUlTQVBOUF9WRU5ET1IoJ0knLCAnQicsICdNJyksIElTQVBOUF9ERVZJQ0UoMHgwMDMzKSB9LAoJLyogSW50ZXJ0ZXggKi8KCS8qIEludGVydGV4IDI4azggMzNrNiBWb2ljZSBFWFQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0knLCAnWCcsICdEJyksIElTQVBOUF9ERVZJQ0UoMHhDODAxKSB9LAoJLyogSW50ZXJ0ZXggMzNrNiA1NmsgVm9pY2UgRVhUIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdJJywgJ1gnLCAnRCcpLCBJU0FQTlBfREVWSUNFKDB4QzkwMSkgfSwKCS8qIEludGVydGV4IDI4azggMzNrNiBWb2ljZSBTUCBFWFQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0knLCAnWCcsICdEJyksIElTQVBOUF9ERVZJQ0UoMHhEODAxKSB9LAoJLyogSW50ZXJ0ZXggMzNrNiA1NmsgVm9pY2UgU1AgRVhUIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdJJywgJ1gnLCAnRCcpLCBJU0FQTlBfREVWSUNFKDB4RDkwMSkgfSwKCS8qIEludGVydGV4IDI4azggMzNrNiBWb2ljZSBTUCBJTlQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0knLCAnWCcsICdEJyksIElTQVBOUF9ERVZJQ0UoMHhGNDAxKSB9LAoJLyogSW50ZXJ0ZXggMjhrOCAzM2s2IFZvaWNlIFNQIEVYVCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignSScsICdYJywgJ0QnKSwgSVNBUE5QX0RFVklDRSgweEY4MDEpIH0sCgkvKiBJbnRlcnRleCAzM2s2IDU2ayBWb2ljZSBTUCBFWFQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0knLCAnWCcsICdEJyksIElTQVBOUF9ERVZJQ0UoMHhGOTAxKSB9LAoJLyogS29ydGV4IEludGVybmF0aW9uYWwgKi8KCS8qIEtPUlRFWCAyODgwMCBFeHRlcm5lIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdLJywgJ08nLCAnUicpLCBJU0FQTlBfREVWSUNFKDB4NDUyMikgfSwKCS8qIEtYUHJvIDMzLjYgVm9jYWwgQVNWRCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignSycsICdPJywgJ1InKSwgSVNBUE5QX0RFVklDRSgweEY2NjEpIH0sCgkvKiBMYXNhdCAqLwoJLyogTEFTQVQgSW50ZXJuZXQgMzM2MDAgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ0wnLCAnQScsICdTJyksIElTQVBOUF9ERVZJQ0UoMHg0MDQwKSB9LAoJLyogTGFzYXQgU2FmaXJlIDU2MCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignTCcsICdBJywgJ1MnKSwgSVNBUE5QX0RFVklDRSgweDQ1NDApIH0sCgkvKiBMYXNhdCBTYWZpcmUgMzM2ICBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignTCcsICdBJywgJ1MnKSwgSVNBUE5QX0RFVklDRSgweDU0NDApIH0sCgkvKiBNaWNyb2NvbSwgSW5jLiAqLwoJLyogTWljcm9jb20gVHJhdmVsUG9ydGUgRkFTVCBWLjM0IFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHgyODEpIH0sCgkvKiBNaWNyb2NvbSBEZXNrUG9ydGUgVi4zNCBGQVNUIG9yIEZBU1QrIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHgwMzM2KSB9LAoJLyogTWljcm9jb20gRGVza1BvcnRlIEZBU1QgRVAgMjguOCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4MDMzOSkgfSwKCS8qIE1pY3JvY29tIERlc2tQb3J0ZSAyOC44UCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4MDM0MikgfSwKCS8qIE1pY3JvY29tIERlc2tQb3J0ZSBGQVNUIEVTIDI4LjggUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignTScsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDA1MDApIH0sCgkvKiBNaWNyb2NvbSBEZXNrUG9ydGUgRkFTVCBFUyAyOC44IFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHgwNTAxKSB9LAoJLyogTWljcm9jb20gRGVza1BvcnRlIDI4LjhTIEludGVybmFsIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHgwNTAyKSB9LAoJLyogTW90b3JvbGEgKi8KCS8qIE1vdG9yb2xhIEJpdFNVUkZSIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxMTA1KSB9LAoJLyogTW90b3JvbGEgVEEyMTAgUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignTScsICdPJywgJ1QnKSwgSVNBUE5QX0RFVklDRSgweDExMTEpIH0sCgkvKiBNb3Rvcm9sYSBITVRBIDIwMCAoSVNETikgUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignTScsICdPJywgJ1QnKSwgSVNBUE5QX0RFVklDRSgweDExMTQpIH0sCgkvKiBNb3Rvcm9sYSBCaXRTVVJGUiBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTExNSkgfSwKCS8qIE1vdG9yb2xhIExpZmVzdHlsZSAyOC44IEludGVybmFsICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxMTkwKSB9LAoJLyogTW90b3JvbGEgVi4zNDAwIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTAxKSB9LAoJLyogTW90b3JvbGEgTGlmZXN0eWxlIDI4LjggVi4zNCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTUwMikgfSwKCS8qIE1vdG9yb2xhIFBvd2VyIDI4LjggVi4zNCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTUwNSkgfSwKCS8qIE1vdG9yb2xhIE1vZGVtU1VSRlIgRXh0ZXJuYWwgMjguOCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTUwOSkgfSwKCS8qIE1vdG9yb2xhIFByZW1pZXIgMzMuNiBEZXNrdG9wIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTBBKSB9LAoJLyogTW90b3JvbGEgVm9pY2VTVVJGUiA1NksgRXh0ZXJuYWwgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTBGKSB9LAoJLyogTW90b3JvbGEgTW9kZW1TVVJGUiA1NksgRXh0ZXJuYWwgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTEwKSB9LAoJLyogTW90b3JvbGEgTW9kZW1TVVJGUiA1NksgSW50ZXJuYWwgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTUwKSB9LAoJLyogTW90b3JvbGEgTW9kZW1TVVJGUiBJbnRlcm5hbCAyOC44IFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTYwKSB9LAoJLyogTW90b3JvbGEgUHJlbWllciAzMy42IEludGVybmFsIFBsdWcgJiBQbGF5ICovCgl7CUlTQVBOUF9WRU5ET1IoJ00nLCAnTycsICdUJyksIElTQVBOUF9ERVZJQ0UoMHgxNTgwKSB9LAoJLyogTW90b3JvbGEgT25saW5lU1VSRlIgMjguOCBJbnRlcm5hbCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTVCMCkgfSwKCS8qIE1vdG9yb2xhIFZvaWNlU1VSRlIgNTZLIEludGVybmFsIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ08nLCAnVCcpLCBJU0FQTlBfREVWSUNFKDB4MTVGMCkgfSwKCS8qIENvbSAxICovCgkvKiAgRGVza2xpbmUgSzU2IFBob25lIFN5c3RlbSBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignTScsICdWJywgJ1gnKSwgSVNBUE5QX0RFVklDRSgweDAwQTEpIH0sCgkvKiBQQyBSaWRlciBLNTYgUGhvbmUgU3lzdGVtIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdNJywgJ1YnLCAnWCcpLCBJU0FQTlBfREVWSUNFKDB4MDBGMikgfSwKCS8qIFBhY2UgNTYgVm9pY2UgSW50ZXJuYWwgUGx1ZyAmIFBsYXkgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdNJywgJ0MnKSwgSVNBUE5QX0RFVklDRSgweDI0MzApIH0sCgkvKiBHZW5lcmljICovCgkvKiBHZW5lcmljIHN0YW5kYXJkIFBDIENPTSBwb3J0CSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4MDUwMCkgfSwKCS8qIEdlbmVyaWMgMTY1NTBBLWNvbXBhdGlibGUgQ09NIHBvcnQgKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDA1MDEpIH0sCgkvKiBDb21wYXEgMTQ0MDAgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMwMDApIH0sCgkvKiBDb21wYXEgMjQwMC85NjAwIE1vZGVtICovCgl7CUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHhDMDAxKSB9LAoJLyogRGlhbC1VcCBOZXR3b3JraW5nIFNlcmlhbCBDYWJsZSBiZXR3ZWVuIDIgUENzICovCgl7CUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHhDMDMxKSB9LAoJLyogRGlhbC1VcCBOZXR3b3JraW5nIFBhcmFsbGVsIENhYmxlIGJldHdlZW4gMiBQQ3MgKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMwMzIpIH0sCgkvKiBTdGFuZGFyZCA5NjAwIGJwcyBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwMCkgfSwKCS8qIFN0YW5kYXJkIDE0NDAwIGJwcyBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwMSkgfSwKCS8qICBTdGFuZGFyZCAyODgwMCBicHMgTW9kZW0qLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwMikgfSwKCS8qICBTdGFuZGFyZCBNb2RlbSovCgl7CUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHhDMTAzKSB9LAoJLyogIFN0YW5kYXJkIDk2MDAgYnBzIE1vZGVtKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMDQpIH0sCgkvKiAgU3RhbmRhcmQgMTQ0MDAgYnBzIE1vZGVtKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMDUpIH0sCgkvKiAgU3RhbmRhcmQgMjg4MDAgYnBzIE1vZGVtKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMDYpIH0sCgkvKiAgU3RhbmRhcmQgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMDcpIH0sCgkvKiBTdGFuZGFyZCA5NjAwIGJwcyBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwOCkgfSwKCS8qIFN0YW5kYXJkIDE0NDAwIGJwcyBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwOSkgfSwKCS8qIFN0YW5kYXJkIDI4ODAwIGJwcyBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwQSkgfSwKCS8qIFN0YW5kYXJkIE1vZGVtICovCgl7CUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHhDMTBCKSB9LAoJLyogU3RhbmRhcmQgOTYwMCBicHMgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMEMpIH0sCgkvKiBTdGFuZGFyZCAxNDQwMCBicHMgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMEQpIH0sCgkvKiBTdGFuZGFyZCAyODgwMCBicHMgTW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweEMxMEUpIH0sCgkvKiBTdGFuZGFyZCBNb2RlbSAqLwoJewlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfREVWSUNFKDB4QzEwRikgfSwKCS8qIFN0YW5kYXJkIFBDTUNJQSBDYXJkIE1vZGVtICovCgl7CUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9ERVZJQ0UoMHgyMDAwKSB9LAoJLyogUm9ja3dlbGwgKi8KCS8qIE1vZHVsYXIgVGVjaG5vbG9neSAqLwoJLyogUm9ja3dlbGwgMzMuNiBEUEYgSW50ZXJuYWwgUG5QICovCgkvKiBNb2R1bGFyIFRlY2hub2xvZ3kgMzMuNiBJbnRlcm5hbCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignUicsICdPJywgJ0snKSwgSVNBUE5QX0RFVklDRSgweDAwMzApIH0sCgkvKiBLb3J0ZXggSW50ZXJuYXRpb25hbCAqLwoJLyogS09SVEVYIDE0NDAwIEV4dGVybmUgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1InLCAnTycsICdLJyksIElTQVBOUF9ERVZJQ0UoMHgwMTAwKSB9LAoJLyogVmlraW5nIENvbXBvbmVudHMsIEluYyAqLwoJLyogVmlraW5nIDI4LjggSU5URVJOQUwgRmF4K0RhdGErVm9pY2UgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1InLCAnTycsICdLJyksIElTQVBOUF9ERVZJQ0UoMHg0OTIwKSB9LAoJLyogUm9ja3dlbGwgKi8KCS8qIEJyaXRpc2ggVGVsZWNvbSAqLwoJLyogTW9kdWxhciBUZWNobm9sb2d5ICovCgkvKiBSb2Nrd2VsbCAzMy42IERQRiBFeHRlcm5hbCBQblAgKi8KCS8qIEJUIFByb2xvZ3VlIDMzLjYgRXh0ZXJuYWwgUG5QICovCgkvKiBNb2R1bGFyIFRlY2hub2xvZ3kgMzMuNiBFeHRlcm5hbCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignUicsICdTJywgJ1MnKSwgSVNBUE5QX0RFVklDRSgweDAwQTApIH0sCgkvKiBWaWtpbmcgNTZLIEZBWCBJTlQgKi8KCXsJSVNBUE5QX1ZFTkRPUignUicsICdTJywgJ1MnKSwgSVNBUE5QX0RFVklDRSgweDAyNjIpIH0sCgkvKiBTdXByYUV4cHJlc3MgMjguOCBEYXRhL0ZheCBQblAgbW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUycsICdVJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDEzMTApIH0sCgkvKiBTdXByYUV4cHJlc3MgMzMuNiBEYXRhL0ZheCBQblAgbW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUycsICdVJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDE0MjEpIH0sCgkvKiBTdXByYUV4cHJlc3MgMzMuNiBEYXRhL0ZheCBQblAgbW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUycsICdVJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDE1OTApIH0sCgkvKiBTdXByYUV4cHJlc3MgMzMuNiBEYXRhL0ZheCBQblAgbW9kZW0gKi8KCXsJSVNBUE5QX1ZFTkRPUignUycsICdVJywgJ1AnKSwgSVNBUE5QX0RFVklDRSgweDE3NjApIH0sCgkvKiBQaG9lYmUgTWljcm8gKi8KCS8qIFBob2ViZSBNaWNybyAzMy42IERhdGEgRmF4IDE0MzNWUUggUGx1ZyAmIFBsYXkgKi8KCXsJSVNBUE5QX1ZFTkRPUignVCcsICdFJywgJ1gnKSwgSVNBUE5QX0RFVklDRSgweDAwMTEpIH0sCgkvKiBBcmNodGVrIEFtZXJpY2EgQ29ycC4gKi8KCS8qIEFyY2h0ZWsgU21hcnRMaW5rIE1vZGVtIDMzMzRCVCBQbHVnICYgUGxheSAqLwoJewlJU0FQTlBfVkVORE9SKCdVJywgJ0EnLCAnQycpLCBJU0FQTlBfREVWSUNFKDB4MDAwRikgfSwKCS8qIDNDb20gQ29ycC4gKi8KCS8qIEdhdGV3YXkgVGVsZXBhdGggSUl2aSAzMy42ICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAwKSB9LAoJLyogIFNwb3J0c3RlciBWaSAxNC40IFBuUCBGQVggVm9pY2VtYWlsICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgwMDA0KSB9LAoJLyogVS5TLiBSb2JvdGljcyAzMy42SyBWb2ljZSBJTlQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgwMDA2KSB9LAoJLyogVS5TLiBSb2JvdGljcyAzMy42SyBWb2ljZSBFWFQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgwMDA3KSB9LAoJLyogVS5TLiBSb2JvdGljcyAzMy42SyBWb2ljZSBJTlQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgyMDAyKSB9LAoJLyogVS5TLiBSb2JvdGljcyA1NksgVm9pY2UgSU5UIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdVJywgJ1MnLCAnUicpLCBJU0FQTlBfREVWSUNFKDB4MjA3MCkgfSwKCS8qIFUuUy4gUm9ib3RpY3MgNTZLIFZvaWNlIEVYVCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignVScsICdTJywgJ1InKSwgSVNBUE5QX0RFVklDRSgweDIwODApIH0sCgkvKiBVLlMuIFJvYm90aWNzIDU2SyBGQVggSU5UICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgzMDMxKSB9LAoJLyogVS5TLiBSb2JvdGljcyA1NksgVm9pY2UgSU5UIFBuUCAqLwoJewlJU0FQTlBfVkVORE9SKCdVJywgJ1MnLCAnUicpLCBJU0FQTlBfREVWSUNFKDB4MzA3MCkgfSwKCS8qIFUuUy4gUm9ib3RpY3MgNTZLIFZvaWNlIEVYVCBQblAgKi8KCXsJSVNBUE5QX1ZFTkRPUignVScsICdTJywgJ1InKSwgSVNBUE5QX0RFVklDRSgweDMwODApIH0sCgkvKiBVLlMuIFJvYm90aWNzIDU2SyBWb2ljZSBJTlQgUG5QICovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHgzMDkwKSB9LAoJLyogVS5TLiBSb2JvdGljcyA1NksgTWVzc2FnZSAgKi8KCXsJSVNBUE5QX1ZFTkRPUignVScsICdTJywgJ1InKSwgSVNBUE5QX0RFVklDRSgweDkxMDApIH0sCgkvKiAgVS5TLiBSb2JvdGljcyA1NksgRkFYIEVYVCBQblAqLwoJewlJU0FQTlBfVkVORE9SKCdVJywgJ1MnLCAnUicpLCBJU0FQTlBfREVWSUNFKDB4OTE2MCkgfSwKCS8qICBVLlMuIFJvYm90aWNzIDU2SyBGQVggSU5UIFBuUCovCgl7CUlTQVBOUF9WRU5ET1IoJ1UnLCAnUycsICdSJyksIElTQVBOUF9ERVZJQ0UoMHg5MTcwKSB9LAoJLyogIFUuUy4gUm9ib3RpY3MgNTZLIFZvaWNlIEVYVCBQblAqLwoJewlJU0FQTlBfVkVORE9SKCdVJywgJ1MnLCAnUicpLCBJU0FQTlBfREVWSUNFKDB4OTE4MCkgfSwKCS8qICBVLlMuIFJvYm90aWNzIDU2SyBWb2ljZSBJTlQgUG5QKi8KCXsJSVNBUE5QX1ZFTkRPUignVScsICdTJywgJ1InKSwgSVNBUE5QX0RFVklDRSgweDkxOTApIH0sCgl7CTAsIH0KfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBhdm9pZF9pcnFfc2hhcmUoc3RydWN0IHBjaV9kZXYgKmRldikKewoJaW50IGksIG1hcCA9IDB4MUZGODsKCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gcnNfdGFibGU7CglzdHJ1Y3QgaXNhcG5wX2lycSAqaXJxOwoJc3RydWN0IGlzYXBucF9yZXNvdXJjZXMgKnJlcyA9IGRldi0+c3lzZGF0YTsKCglmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgewoJCWlmIChzdGF0ZS0+dHlwZSAhPSBQT1JUX1VOS05PV04pCgkJCWNsZWFyX2JpdChzdGF0ZS0+aXJxLCAmbWFwKTsKCQlzdGF0ZSsrOwoJfQoKCWZvciAoIDsgcmVzOyByZXMgPSByZXMtPmFsdCkKCQlmb3IoaXJxID0gcmVzLT5pcnE7IGlycTsgaXJxID0gaXJxLT5uZXh0KQoJCQlpcnEtPm1hcCA9IG1hcDsKfQoKc3RhdGljIGNoYXIgKm1vZGVtX25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKICAgICAgICJNT0RFTSIsICJNb2RlbSIsICJtb2RlbSIsICJGQVgiLCAiRmF4IiwgImZheCIsCiAgICAgICAiNTZLIiwgIjU2ayIsICJLNTYiLCAiMzMuNiIsICIyOC44IiwgIjE0LjQiLAogICAgICAgIjMzLDYwMCIsICIyOCw4MDAiLCAiMTQsNDAwIiwgIjMzLjYwMCIsICIyOC44MDAiLCAiMTQuNDAwIiwKICAgICAgICIzMzYwMCIsICIyODgwMCIsICIxNDQwMCIsICJWLjkwIiwgIlYuMzQiLCAiVi4zMiIsIDAKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGNoZWNrX25hbWUoY2hhciAqbmFtZSkKewogICAgICAgY2hhciAqKnRtcCA9IG1vZGVtX25hbWVzOwoKICAgICAgIHdoaWxlICgqdG1wKSB7CiAgICAgICAgICAgICAgIGlmIChzdHJzdHIobmFtZSwgKnRtcCkpCiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgIHRtcCsrOwogICAgICAgfQogICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NvbXBhdGlibGVfaWQoc3RydWN0IHBjaV9kZXYgKmRldikKewogICAgICAgaW50IGk7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX0NPTVBBVElCTEU7IGkrKykKCSAgICAgICBpZiAoKGRldi0+dmVuZG9yX2NvbXBhdGlibGVbaV0gPT0KCQkgICAgSVNBUE5QX1ZFTkRPUignUCcsICdOJywgJ1AnKSkgJiYKCQkgICAoc3dhYjE2KGRldi0+ZGV2aWNlX2NvbXBhdGlibGVbaV0pID49IDB4YzAwMCkgJiYKCQkgICAoc3dhYjE2KGRldi0+ZGV2aWNlX2NvbXBhdGlibGVbaV0pIDw9IDB4ZGZmZikpCgkJICAgICAgIHJldHVybiAwOwogICAgICAgcmV0dXJuIDE7Cn0KCi8qCiAqIEdpdmVuIGEgY29tcGxldGUgdW5rbm93biBJU0EgUG5QIGRldmljZSwgdHJ5IHRvIHVzZSBzb21lIGhldXJpc3RpY3MgdG8KICogZGV0ZWN0IG1vZGVtcy4gQ3VycmVudGx5IHVzZSBzdWNoIGhldXJpc3RpYyBzZXQ6CiAqICAgICAtIGRldi0+bmFtZSBvciBkZXYtPmJ1cy0+bmFtZSBtdXN0IGNvbnRhaW4gIm1vZGVtIiBzdWJzdHJpbmc7CiAqICAgICAtIGRldmljZSBtdXN0IGhhdmUgb25seSBvbmUgSU8gcmVnaW9uICg4IGJ5dGUgbG9uZykgd2l0aCBiYXNlIGFkcmVzcwogKiAgICAgICAweDJlOCwgMHgzZTgsIDB4MmY4IG9yIDB4M2Y4LgogKgogKiBTdWNoIGRldGVjdGlvbiBsb29rcyB2ZXJ5IHVnbHksIGJ1dCBjYW4gZGV0ZWN0IGF0IGxlYXN0IHNvbWUgb2YgbnVtZXJvdXMKICogSVNBIFBuUCBtb2RlbXMsIGFsdGVybmF0aXZlbHkgd2UgbXVzdCBoYXJkY29kZSBhbGwgbW9kZW1zIGluIHBucF9kZXZpY2VzW10KICogdGFibGUuCiAqLwpzdGF0aWMgaW50IF9JTkxJTkVfIHNlcmlhbF9wbnBfZ3Vlc3NfYm9hcmQoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCQkgIHN0cnVjdCBwY2lfYm9hcmQgKmJvYXJkKQp7CiAgICAgICBzdHJ1Y3QgaXNhcG5wX3Jlc291cmNlcyAqcmVzID0gKHN0cnVjdCBpc2FwbnBfcmVzb3VyY2VzICopZGV2LT5zeXNkYXRhOwogICAgICAgc3RydWN0IGlzYXBucF9yZXNvdXJjZXMgKnJlc2E7CgogICAgICAgaWYgKCEoY2hlY2tfbmFtZShkZXYtPm5hbWUpIHx8IGNoZWNrX25hbWUoZGV2LT5idXMtPm5hbWUpKSAmJgoJICAgIShjaGVja19jb21wYXRpYmxlX2lkKGRldikpKQoJICAgICAgIHJldHVybiAxOwoKICAgICAgIGlmICghcmVzIHx8IHJlcy0+bmV4dCkKCSAgICAgICByZXR1cm4gMTsKCiAgICAgICBmb3IgKHJlc2EgPSByZXMtPmFsdDsgcmVzYTsgcmVzYSA9IHJlc2EtPmFsdCkgewoJICAgICAgIHN0cnVjdCBpc2FwbnBfcG9ydCAqcG9ydDsKCSAgICAgICBmb3IgKHBvcnQgPSByZXMtPnBvcnQ7IHBvcnQ7IHBvcnQgPSBwb3J0LT5uZXh0KQoJCSAgICAgICBpZiAoKHBvcnQtPnNpemUgPT0gOCkgJiYKCQkJICAgKChwb3J0LT5taW4gPT0gMHgyZjgpIHx8CgkJCSAgICAocG9ydC0+bWluID09IDB4M2Y4KSB8fAoJCQkgICAgKHBvcnQtPm1pbiA9PSAweDJlOCkgfHwKCQkJICAgIChwb3J0LT5taW4gPT0gMHgzZTgpKSkKCQkJICAgICAgIHJldHVybiAwOwogICAgICAgfQoKICAgICAgIHJldHVybiAxOwp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJvYmVfc2VyaWFsX3BucCh2b2lkKQp7CiAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKICAgICAgIHN0cnVjdCBwbnBfYm9hcmQgKnBucF9ib2FyZDsKICAgICAgIHN0cnVjdCBwY2lfYm9hcmQgYm9hcmQ7CgojaWZkZWYgU0VSSUFMX0RFQlVHX1BOUAogICAgICAgcHJpbnRrKCJFbnRlcmVkIHByb2JlX3NlcmlhbF9wbnAoKVxuIik7CiNlbmRpZgogICAgICAgaWYgKCFpc2FwbnBfcHJlc2VudCgpKSB7CiNpZmRlZiBTRVJJQUxfREVCVUdfUE5QCiAgICAgICAgICAgICAgIHByaW50aygiTGVhdmluZyBwcm9iZV9zZXJpYWxfcG5wKCkgKG5vIGlzYXBucClcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgfQoKICAgICAgIGlzYXBucF9mb3JfZWFjaF9kZXYoZGV2KSB7CgkgICAgICAgaWYgKGRldi0+YWN0aXZlKQoJCSAgICAgICBjb250aW51ZTsKCgkgICAgICAgbWVtc2V0KCZib2FyZCwgMCwgc2l6ZW9mKGJvYXJkKSk7CgkgICAgICAgYm9hcmQuZmxhZ3MgPSBTUENJX0ZMX0JBU0UwIHwgU1BDSV9GTF9QTlBERUZBVUxUOwoJICAgICAgIGJvYXJkLm51bV9wb3J0cyA9IDE7CgkgICAgICAgYm9hcmQuYmFzZV9iYXVkID0gMTE1MjAwOwoJICAgICAgIAoJICAgICAgIGZvciAocG5wX2JvYXJkID0gcG5wX2RldmljZXM7IHBucF9ib2FyZC0+dmVuZG9yOyBwbnBfYm9hcmQrKykKCQkgICAgICAgaWYgKChkZXYtPnZlbmRvciA9PSBwbnBfYm9hcmQtPnZlbmRvcikgJiYKCQkJICAgKGRldi0+ZGV2aWNlID09IHBucF9ib2FyZC0+ZGV2aWNlKSkKCQkJICAgICAgIGJyZWFrOwoKCSAgICAgICBpZiAocG5wX2JvYXJkLT52ZW5kb3IpIHsKCQkgICAgICAgLyogU3BlY2lhbCBjYXNlIHRoYXQncyBtb3JlIGVmZmljaWVudCB0byBoYXJkY29kZSAqLwoJCSAgICAgICBpZiAoKHBucF9ib2FyZC0+dmVuZG9yID09IElTQVBOUF9WRU5ET1IoJ0EnLCAnSycsICdZJykgJiYKCQkJICAgIHBucF9ib2FyZC0+ZGV2aWNlID09IElTQVBOUF9ERVZJQ0UoMHgxMDIxKSkpCgkJCSAgICAgICBib2FyZC5mbGFncyB8PSBTUENJX0ZMX05PX1NISVJROwoJICAgICAgIH0gZWxzZSB7CgkJICAgICAgIGlmIChzZXJpYWxfcG5wX2d1ZXNzX2JvYXJkKGRldiwgJmJvYXJkKSkKCQkJICAgICAgIGNvbnRpbnVlOwoJICAgICAgIH0KCSAgICAgICAKCSAgICAgICBpZiAoYm9hcmQuZmxhZ3MgJiBTUENJX0ZMX05PX1NISVJRKQoJCSAgICAgICBhdm9pZF9pcnFfc2hhcmUoZGV2KTsKCSAgICAgICBzdGFydF9wY2lfcG5wX2JvYXJkKGRldiwgJmJvYXJkKTsKICAgICAgIH0KCiNpZmRlZiBTRVJJQUxfREVCVUdfUE5QCiAgICAgICBwcmludGsoIkxlYXZpbmcgcHJvYmVfc2VyaWFsX3BucCgpIChwcm9iZSBmaW5pc2hlZClcbiIpOwojZW5kaWYKICAgICAgIHJldHVybjsKfQoKI2VuZGlmIC8qIEVOQUJMRV9TRVJJQUxfUE5QICovCgovKgogKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKICovCnN0YXRpYyBpbnQgX19pbml0IHJzX2luaXQodm9pZCkKewoJaW50IGk7CglzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CgoJaW5pdF9iaChTRVJJQUxfQkgsIGRvX3NlcmlhbF9iaCk7Cglpbml0X3RpbWVyKCZzZXJpYWxfdGltZXIpOwoJc2VyaWFsX3RpbWVyLmZ1bmN0aW9uID0gcnNfdGltZXI7Cgltb2RfdGltZXIoJnNlcmlhbF90aW1lciwgamlmZmllcyArIFJTX1NUUk9CRV9USU1FKTsKCglmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CgkJSVJRX3BvcnRzW2ldID0gMDsKCQlJUlFfdGltZW91dFtpXSA9IDA7CiNpZmRlZiBDT05GSUdfU0VSSUFMX01VTFRJUE9SVAoJCW1lbXNldCgmcnNfbXVsdGlwb3J0W2ldLCAwLAoJCSAgICAgICBzaXplb2Yoc3RydWN0IHJzX211bHRpcG9ydF9zdHJ1Y3QpKTsKI2VuZGlmCgl9CiNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKCS8qCgkgKglUaGUgaW50ZXJydXB0IG9mIHRoZSBzZXJpYWwgY29uc29sZSBwb3J0CgkgKgljYW4ndCBiZSBzaGFyZWQuCgkgKi8KCWlmIChzZXJjb25zLmZsYWdzICYgQ09OX0NPTlNERVYpIHsKCQlmb3IoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKQoJCQlpZiAoaSAhPSBzZXJjb25zLmluZGV4ICYmCgkJCSAgICByc190YWJsZVtpXS5pcnEgPT0gcnNfdGFibGVbc2VyY29ucy5pbmRleF0uaXJxKQoJCQkJcnNfdGFibGVbaV0uaXJxID0gMDsKCX0KI2VuZGlmCglzaG93X3NlcmlhbF92ZXJzaW9uKCk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KCQoJbWVtc2V0KCZzZXJpYWxfZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKCXNlcmlhbF9kcml2ZXIubWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOwojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAxMDApCglzZXJpYWxfZHJpdmVyLmRyaXZlcl9uYW1lID0gInNlcmlhbCI7CiNlbmRpZgojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAzMkQgJiYgZGVmaW5lZChDT05GSUdfREVWRlNfRlMpKQoJc2VyaWFsX2RyaXZlci5uYW1lID0gInR0cy8lZCI7CiNlbHNlCglzZXJpYWxfZHJpdmVyLm5hbWUgPSAidHR5UyI7CiNlbmRpZgoJc2VyaWFsX2RyaXZlci5tYWpvciA9IFRUWV9NQUpPUjsKCXNlcmlhbF9kcml2ZXIubWlub3Jfc3RhcnQgPSA2NCArIFNFUklBTF9ERVZfT0ZGU0VUOwoJc2VyaWFsX2RyaXZlci5uYW1lX2Jhc2UgPSBTRVJJQUxfREVWX09GRlNFVDsKCXNlcmlhbF9kcml2ZXIubnVtID0gTlJfUE9SVFM7CglzZXJpYWxfZHJpdmVyLnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwoJc2VyaWFsX2RyaXZlci5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOwoJc2VyaWFsX2RyaXZlci5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CglzZXJpYWxfZHJpdmVyLmluaXRfdGVybWlvcy5jX2NmbGFnID0KCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CglzZXJpYWxfZHJpdmVyLmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfTk9fREVWRlM7CglzZXJpYWxfZHJpdmVyLnJlZmNvdW50ID0gJnNlcmlhbF9yZWZjb3VudDsKCXNlcmlhbF9kcml2ZXIudGFibGUgPSBzZXJpYWxfdGFibGU7CglzZXJpYWxfZHJpdmVyLnRlcm1pb3MgPSBzZXJpYWxfdGVybWlvczsKCXNlcmlhbF9kcml2ZXIudGVybWlvc19sb2NrZWQgPSBzZXJpYWxfdGVybWlvc19sb2NrZWQ7CgoJc2VyaWFsX2RyaXZlci5vcGVuID0gcnNfb3BlbjsKCXNlcmlhbF9kcml2ZXIuY2xvc2UgPSByc19jbG9zZTsKCXNlcmlhbF9kcml2ZXIud3JpdGUgPSByc193cml0ZTsKCXNlcmlhbF9kcml2ZXIucHV0X2NoYXIgPSByc19wdXRfY2hhcjsKCXNlcmlhbF9kcml2ZXIuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFyczsKCXNlcmlhbF9kcml2ZXIud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb207CglzZXJpYWxfZHJpdmVyLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlcjsKCXNlcmlhbF9kcml2ZXIuZmx1c2hfYnVmZmVyID0gcnNfZmx1c2hfYnVmZmVyOwoJc2VyaWFsX2RyaXZlci5pb2N0bCA9IHJzX2lvY3RsOwoJc2VyaWFsX2RyaXZlci50aHJvdHRsZSA9IHJzX3Rocm90dGxlOwoJc2VyaWFsX2RyaXZlci51bnRocm90dGxlID0gcnNfdW50aHJvdHRsZTsKCXNlcmlhbF9kcml2ZXIuc2V0X3Rlcm1pb3MgPSByc19zZXRfdGVybWlvczsKCXNlcmlhbF9kcml2ZXIuc3RvcCA9IHJzX3N0b3A7CglzZXJpYWxfZHJpdmVyLnN0YXJ0ID0gcnNfc3RhcnQ7CglzZXJpYWxfZHJpdmVyLmhhbmd1cCA9IHJzX2hhbmd1cDsKI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gMTMxMzk0KSAvKiBMaW51eCAyLjEuNjYgKi8KCXNlcmlhbF9kcml2ZXIuYnJlYWtfY3RsID0gcnNfYnJlYWs7CiNlbmRpZgojaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSAxMzEzNDMpCglzZXJpYWxfZHJpdmVyLnNlbmRfeGNoYXIgPSByc19zZW5kX3hjaGFyOwoJc2VyaWFsX2RyaXZlci53YWl0X3VudGlsX3NlbnQgPSByc193YWl0X3VudGlsX3NlbnQ7CglzZXJpYWxfZHJpdmVyLnJlYWRfcHJvYyA9IHJzX3JlYWRfcHJvYzsKI2VuZGlmCgkKCS8qCgkgKiBUaGUgY2FsbG91dCBkZXZpY2UgaXMganVzdCBsaWtlIG5vcm1hbCBkZXZpY2UgZXhjZXB0IGZvcgoJICogbWFqb3IgbnVtYmVyIGFuZCB0aGUgc3VidHlwZSBjb2RlLgoJICovCgljYWxsb3V0X2RyaXZlciA9IHNlcmlhbF9kcml2ZXI7CiNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gMHgyMDMyRCAmJiBkZWZpbmVkKENPTkZJR19ERVZGU19GUykpCgljYWxsb3V0X2RyaXZlci5uYW1lID0gImN1YS8lZCI7CiNlbHNlCgljYWxsb3V0X2RyaXZlci5uYW1lID0gImN1YSI7CiNlbmRpZgoJY2FsbG91dF9kcml2ZXIubWFqb3IgPSBUVFlBVVhfTUFKT1I7CgljYWxsb3V0X2RyaXZlci5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfQ0FMTE9VVDsKI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gMTMxMzQzKQoJY2FsbG91dF9kcml2ZXIucmVhZF9wcm9jID0gMDsKCWNhbGxvdXRfZHJpdmVyLnByb2NfZW50cnkgPSAwOwojZW5kaWYKCglpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RyaXZlcikpCgkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIpOwoJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoJmNhbGxvdXRfZHJpdmVyKSkKCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgY2FsbG91dCBkcml2ZXJcbiIpOwoJCglmb3IgKGkgPSAwLCBzdGF0ZSA9IHJzX3RhYmxlOyBpIDwgTlJfUE9SVFM7IGkrKyxzdGF0ZSsrKSB7CgkJc3RhdGUtPm1hZ2ljID0gU1NUQVRFX01BR0lDOwoJCXN0YXRlLT5saW5lID0gaTsKCQlzdGF0ZS0+dHlwZSA9IFBPUlRfVU5LTk9XTjsKCQlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSAwOwoJCXN0YXRlLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7CgkJc3RhdGUtPmNsb3Npbmdfd2FpdCA9IDMwKkhaOwoJCXN0YXRlLT5jYWxsb3V0X3Rlcm1pb3MgPSBjYWxsb3V0X2RyaXZlci5pbml0X3Rlcm1pb3M7CgkJc3RhdGUtPm5vcm1hbF90ZXJtaW9zID0gc2VyaWFsX2RyaXZlci5pbml0X3Rlcm1pb3M7CgkJc3RhdGUtPmljb3VudC5jdHMgPSBzdGF0ZS0+aWNvdW50LmRzciA9IAoJCQlzdGF0ZS0+aWNvdW50LnJuZyA9IHN0YXRlLT5pY291bnQuZGNkID0gMDsKCQlzdGF0ZS0+aWNvdW50LnJ4ID0gc3RhdGUtPmljb3VudC50eCA9IDA7CgkJc3RhdGUtPmljb3VudC5mcmFtZSA9IHN0YXRlLT5pY291bnQucGFyaXR5ID0gMDsKCQlzdGF0ZS0+aWNvdW50Lm92ZXJydW4gPSBzdGF0ZS0+aWNvdW50LmJyayA9IDA7CgkJc3RhdGUtPmlycSA9IGlycV9jYW5ub25pY2FsaXplKHN0YXRlLT5pcnEpOwoJCWlmIChzdGF0ZS0+aHViNikKCQkJc3RhdGUtPmlvX3R5cGUgPSBTRVJJQUxfSU9fSFVCNjsKCQlpZiAoc3RhdGUtPnBvcnQgJiYgY2hlY2tfcmVnaW9uKHN0YXRlLT5wb3J0LDgpKQoJCQljb250aW51ZTsKI2lmZGVmIENPTkZJR19NQ0EJCQkKCQlpZiAoKHN0YXRlLT5mbGFncyAmIEFTWU5DX0JPT1RfT05MWU1DQSkgJiYgIU1DQV9idXMpCgkJCWNvbnRpbnVlOwojZW5kaWYJCQkKCQlpZiAoc3RhdGUtPmZsYWdzICYgQVNZTkNfQk9PVF9BVVRPQ09ORikKCQkJYXV0b2NvbmZpZyhzdGF0ZSk7Cgl9Cglmb3IgKGkgPSAwLCBzdGF0ZSA9IHJzX3RhYmxlOyBpIDwgTlJfUE9SVFM7IGkrKyxzdGF0ZSsrKSB7CgkJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfVU5LTk9XTikKCQkJY29udGludWU7CgkJaWYgKCAgIChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19CT09UX0FVVE9DT05GKQoJCSAgICAmJiAoc3RhdGUtPmZsYWdzICYgQVNZTkNfQVVUT19JUlEpCgkJICAgICYmIChzdGF0ZS0+cG9ydCAhPSAwIHx8IHN0YXRlLT5pb21lbV9iYXNlICE9IDApKQoJCQlzdGF0ZS0+aXJxID0gZGV0ZWN0X3VhcnRfaXJxKHN0YXRlKTsKCQlpZiAoc3RhdGUtPmlvX3R5cGUgPT0gU0VSSUFMX0lPX01FTSkgewoJCQlwcmludGsoS0VSTl9JTkZPInR0eVMlMDJkJXMgYXQgMHglcCAoaXJxID0gJWQpIGlzIGEgJXNcbiIsCgkgCQkgICAgICAgc3RhdGUtPmxpbmUgKyBTRVJJQUxfREVWX09GRlNFVCwKCQkJICAgICAgIChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19GT1VSUE9SVCkgPyAiIEZvdXJQb3J0IiA6ICIiLAoJCQkgICAgICAgc3RhdGUtPmlvbWVtX2Jhc2UsIHN0YXRlLT5pcnEsCgkJCSAgICAgICB1YXJ0X2NvbmZpZ1tzdGF0ZS0+dHlwZV0ubmFtZSk7CgkJfQoJCWVsc2UgewoJCQlwcmludGsoS0VSTl9JTkZPICJ0dHlTJTAyZCVzIGF0IDB4JTA0bHggKGlycSA9ICVkKSBpcyBhICVzXG4iLAoJIAkJICAgICAgIHN0YXRlLT5saW5lICsgU0VSSUFMX0RFVl9PRkZTRVQsCgkJCSAgICAgICAoc3RhdGUtPmZsYWdzICYgQVNZTkNfRk9VUlBPUlQpID8gIiBGb3VyUG9ydCIgOiAiIiwKCQkJICAgICAgIHN0YXRlLT5wb3J0LCBzdGF0ZS0+aXJxLAoJCQkgICAgICAgdWFydF9jb25maWdbc3RhdGUtPnR5cGVdLm5hbWUpOwoJCX0KCQl0dHlfcmVnaXN0ZXJfZGV2ZnMoJnNlcmlhbF9kcml2ZXIsIDAsCgkJCQkgICBzZXJpYWxfZHJpdmVyLm1pbm9yX3N0YXJ0ICsgc3RhdGUtPmxpbmUpOwoJCXR0eV9yZWdpc3Rlcl9kZXZmcygmY2FsbG91dF9kcml2ZXIsIDAsCgkJCQkgICBjYWxsb3V0X2RyaXZlci5taW5vcl9zdGFydCArIHN0YXRlLT5saW5lKTsKCX0KI2lmZGVmIEVOQUJMRV9TRVJJQUxfUENJCglwcm9iZV9zZXJpYWxfcGNpKCk7CiNlbmRpZgojaWZkZWYgRU5BQkxFX1NFUklBTF9QTlAKICAgICAgIHByb2JlX3NlcmlhbF9wbnAoKTsKI2VuZGlmCglyZXR1cm4gMDsKfQoKLyoKICogVGhpcyBpcyBmb3IgdXNlIGJ5IGFyY2hpdGVjdHVyZXMgdGhhdCBrbm93IHRoZWlyIHNlcmlhbCBjb25zb2xlIAogKiBhdHRyaWJ1dGVzIG9ubHkgYXQgcnVuIHRpbWUuIE5vdCB0byBiZSBpbnZva2VkIGFmdGVyIHJzX2luaXQoKS4KICovCmludCBfX2luaXQgZWFybHlfc2VyaWFsX3NldHVwKHN0cnVjdCBzZXJpYWxfc3RydWN0ICpyZXEpCnsKCWludCBpID0gcmVxLT5saW5lOwoKCWlmIChpID49IE5SX0lSUVMpCgkJcmV0dXJuKC1FTk9FTlQpOwoJcnNfdGFibGVbaV0ubWFnaWMgPSAwOwoJcnNfdGFibGVbaV0uYmF1ZF9iYXNlID0gcmVxLT5iYXVkX2Jhc2U7Cglyc190YWJsZVtpXS5wb3J0ID0gcmVxLT5wb3J0OwoJaWYgKEhJR0hfQklUU19PRkZTRVQpCgkJcnNfdGFibGVbaV0ucG9ydCArPSAodW5zaWduZWQgbG9uZykgcmVxLT5wb3J0X2hpZ2ggPDwgCgkJCQkJCQlISUdIX0JJVFNfT0ZGU0VUOwoJcnNfdGFibGVbaV0uaXJxID0gcmVxLT5pcnE7Cglyc190YWJsZVtpXS5mbGFncyA9IHJlcS0+ZmxhZ3M7Cglyc190YWJsZVtpXS5jbG9zZV9kZWxheSA9IHJlcS0+Y2xvc2VfZGVsYXk7Cglyc190YWJsZVtpXS5pb190eXBlID0gcmVxLT5pb190eXBlOwoJcnNfdGFibGVbaV0uaHViNiA9IHJlcS0+aHViNjsKCXJzX3RhYmxlW2ldLmlvbWVtX2Jhc2UgPSByZXEtPmlvbWVtX2Jhc2U7Cglyc190YWJsZVtpXS5pb21lbV9yZWdfc2hpZnQgPSByZXEtPmlvbWVtX3JlZ19zaGlmdDsKCXJzX3RhYmxlW2ldLnR5cGUgPSByZXEtPnR5cGU7Cglyc190YWJsZVtpXS54bWl0X2ZpZm9fc2l6ZSA9IHJlcS0+eG1pdF9maWZvX3NpemU7Cglyc190YWJsZVtpXS5jdXN0b21fZGl2aXNvciA9IHJlcS0+Y3VzdG9tX2Rpdmlzb3I7Cglyc190YWJsZVtpXS5jbG9zaW5nX3dhaXQgPSByZXEtPmNsb3Npbmdfd2FpdDsKCXJldHVybigwKTsKfQoKLyoKICogcmVnaXN0ZXJfc2VyaWFsIGFuZCB1bnJlZ2lzdGVyX3NlcmlhbCBhbGxvd3MgZm9yIDE2eDUwIHNlcmlhbCBwb3J0cyB0byBiZQogKiBjb25maWd1cmVkIGF0IHJ1bi10aW1lLCB0byBzdXBwb3J0IFBDTUNJQSBtb2RlbXMuCiAqLwogCi8qKgogKglyZWdpc3Rlcl9zZXJpYWwgLSBjb25maWd1cmUgYSAxNng1MCBzZXJpYWwgcG9ydCBhdCBydW50aW1lCiAqCUByZXE6IHJlcXVlc3Qgc3RydWN0dXJlCiAqCiAqCUNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0LiBJZiB0aGUKICoJcG9ydCBleGlzdHMgYW5kIGlzIGluIHVzZSBhbiBlcnJvciBpcyByZXR1cm5lZC4gSWYgdGhlIHBvcnQKICoJaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgdGFibGUgaXQgaXMgYWRkZWQuCiAqCiAqCVRoZSBwb3J0IGlzIHRoZW4gcHJvYmVkIGFuZCBpZiBuZWNjZXNzYXJ5IHRoZSBJUlEgaXMgYXV0b2RldGVjdGVkCiAqCUlmIHRoaXMgZmFpbHMgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCiAqCiAqCU9uIHN1Y2Nlc3MgdGhlIHBvcnQgaXMgcmVhZHkgdG8gdXNlIGFuZCB0aGUgbGluZSBudW1iZXIgaXMgcmV0dXJuZWQuCiAqLwogCmludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSkKewoJaW50IGk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvOwoJdW5zaWduZWQgbG9uZyBwb3J0OwoKCXBvcnQgPSByZXEtPnBvcnQ7CglpZiAoSElHSF9CSVRTX09GRlNFVCkKCQlwb3J0ICs9ICh1bnNpZ25lZCBsb25nKSByZXEtPnBvcnRfaGlnaCA8PCBISUdIX0JJVFNfT0ZGU0VUOwoKCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CgkJaWYgKChyc190YWJsZVtpXS5wb3J0ID09IHBvcnQpICYmCgkJICAgIChyc190YWJsZVtpXS5pb21lbV9iYXNlID09IHJlcS0+aW9tZW1fYmFzZSkpCgkJCWJyZWFrOwoJfQojaWZkZWYgX19pMzg2X18KCWlmIChpID09IE5SX1BPUlRTKSB7CgkJZm9yIChpID0gNDsgaSA8IE5SX1BPUlRTOyBpKyspCgkJCWlmICgocnNfdGFibGVbaV0udHlwZSA9PSBQT1JUX1VOS05PV04pICYmCgkJCSAgICAocnNfdGFibGVbaV0uY291bnQgPT0gMCkpCgkJCQlicmVhazsKCX0KI2VuZGlmCglpZiAoaSA9PSBOUl9QT1JUUykgewoJCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKQoJCQlpZiAoKHJzX3RhYmxlW2ldLnR5cGUgPT0gUE9SVF9VTktOT1dOKSAmJgoJCQkgICAgKHJzX3RhYmxlW2ldLmNvdW50ID09IDApKQoJCQkJYnJlYWs7Cgl9CglpZiAoaSA9PSBOUl9QT1JUUykgewoJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCXJldHVybiAtMTsKCX0KCXN0YXRlID0gJnJzX3RhYmxlW2ldOwoJaWYgKHJzX3RhYmxlW2ldLmNvdW50KSB7CgkJcmVzdG9yZV9mbGFncyhmbGFncyk7CgkJcHJpbnRrKCJDb3VsZG4ndCBjb25maWd1cmUgc2VyaWFsICMlZCAocG9ydD0lbGQsaXJxPSVkKTogIgoJCSAgICAgICAiZGV2aWNlIGFscmVhZHkgb3BlblxuIiwgaSwgcG9ydCwgcmVxLT5pcnEpOwoJCXJldHVybiAtMTsKCX0KCXN0YXRlLT5pcnEgPSByZXEtPmlycTsKCXN0YXRlLT5wb3J0ID0gcG9ydDsKCXN0YXRlLT5mbGFncyA9IHJlcS0+ZmxhZ3M7CglzdGF0ZS0+aW9fdHlwZSA9IHJlcS0+aW9fdHlwZTsKCXN0YXRlLT5pb21lbV9iYXNlID0gcmVxLT5pb21lbV9iYXNlOwoJc3RhdGUtPmlvbWVtX3JlZ19zaGlmdCA9IHJlcS0+aW9tZW1fcmVnX3NoaWZ0OwoJaWYgKHJlcS0+YmF1ZF9iYXNlKQoJCXN0YXRlLT5iYXVkX2Jhc2UgPSByZXEtPmJhdWRfYmFzZTsKCWlmICgoaW5mbyA9IHN0YXRlLT5pbmZvKSAhPSBOVUxMKSB7CgkJaW5mby0+cG9ydCA9IHBvcnQ7CgkJaW5mby0+ZmxhZ3MgPSByZXEtPmZsYWdzOwoJCWluZm8tPmlvX3R5cGUgPSByZXEtPmlvX3R5cGU7CgkJaW5mby0+aW9tZW1fYmFzZSA9IHJlcS0+aW9tZW1fYmFzZTsKCQlpbmZvLT5pb21lbV9yZWdfc2hpZnQgPSByZXEtPmlvbWVtX3JlZ19zaGlmdDsKCX0KCWF1dG9jb25maWcoc3RhdGUpOwoJaWYgKHN0YXRlLT50eXBlID09IFBPUlRfVU5LTk9XTikgewoJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoJCXByaW50aygicmVnaXN0ZXJfc2VyaWFsKCk6IGF1dG9jb25maWcgZmFpbGVkXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKCglpZiAoKHN0YXRlLT5mbGFncyAmIEFTWU5DX0FVVE9fSVJRKSAmJiBDT05GSUdVUkVEX1NFUklBTF9QT1JUKHN0YXRlKSkKCQlzdGF0ZS0+aXJxID0gZGV0ZWN0X3VhcnRfaXJxKHN0YXRlKTsKCiAgICAgICBwcmludGsoS0VSTl9JTkZPICJ0dHlTJTAyZCBhdCAlcyAweCUwNGx4IChpcnEgPSAlZCkgaXMgYSAlc1xuIiwKCSAgICAgIHN0YXRlLT5saW5lICsgU0VSSUFMX0RFVl9PRkZTRVQsCgkgICAgICBzdGF0ZS0+aW9tZW1fYmFzZSA/ICJpb21lbSIgOiAicG9ydCIsCgkgICAgICBzdGF0ZS0+aW9tZW1fYmFzZSA/ICh1bnNpZ25lZCBsb25nKXN0YXRlLT5pb21lbV9iYXNlIDoKCSAgICAgIHN0YXRlLT5wb3J0LCBzdGF0ZS0+aXJxLCB1YXJ0X2NvbmZpZ1tzdGF0ZS0+dHlwZV0ubmFtZSk7Cgl0dHlfcmVnaXN0ZXJfZGV2ZnMoJnNlcmlhbF9kcml2ZXIsIDAsCgkJCSAgIHNlcmlhbF9kcml2ZXIubWlub3Jfc3RhcnQgKyBzdGF0ZS0+bGluZSk7IAoJdHR5X3JlZ2lzdGVyX2RldmZzKCZjYWxsb3V0X2RyaXZlciwgMCwKCQkJICAgY2FsbG91dF9kcml2ZXIubWlub3Jfc3RhcnQgKyBzdGF0ZS0+bGluZSk7CglyZXR1cm4gc3RhdGUtPmxpbmUgKyBTRVJJQUxfREVWX09GRlNFVDsKfQoKLyoqCiAqCXVucmVnaXN0ZXJfc2VyaWFsIC0gZGVjb25maWd1cmUgYSAxNng1MCBzZXJpYWwgcG9ydAogKglAbGluZTogbGluZSB0byBkZWNvbmZpZ3VyZQogKgogKglUaGUgcG9ydCBzcGVjaWZpZWQgaXMgZGVjb25maWd1cmVkIGFuZCBpdHMgcmVzb3VyY2VzIGFyZSBmcmVlZC4gQW55CiAqCXVzZXIgb2YgdGhlIHBvcnQgaXMgZGlzY29ubmVjdGVkIGFzIGlmIGNhcnJpZXIgd2FzIGRyb3BwZWQuIExpbmUgaXMKICoJdGhlIHBvcnQgbnVtYmVyIHJldHVybmVkIGJ5IHJlZ2lzdGVyX3NlcmlhbCgpLgogKi8KCnZvaWQgdW5yZWdpc3Rlcl9zZXJpYWwoaW50IGxpbmUpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzdHJ1Y3Qgc2VyaWFsX3N0YXRlICpzdGF0ZSA9ICZyc190YWJsZVtsaW5lXTsKCglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CglpZiAoc3RhdGUtPmluZm8gJiYgc3RhdGUtPmluZm8tPnR0eSkKCQl0dHlfaGFuZ3VwKHN0YXRlLT5pbmZvLT50dHkpOwoJc3RhdGUtPnR5cGUgPSBQT1JUX1VOS05PV047CglwcmludGsoS0VSTl9JTkZPICJ0dHlTJTAyZCB1bmxvYWRlZFxuIiwgc3RhdGUtPmxpbmUpOwoJLyogVGhlc2Ugd2lsbCBiZSBoaWRkZW4sIGJlY2F1c2UgdGhleSBhcmUgZGV2aWNlcyB0aGF0IHdpbGwgbm8gbG9uZ2VyCgkgKiBiZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4gKGllLCBQQ01DSUEgbW9kZW1zLCBvbmNlIGVqZWN0ZWQpCgkgKi8KCXR0eV91bnJlZ2lzdGVyX2RldmZzKCZzZXJpYWxfZHJpdmVyLAoJCQkgICAgIHNlcmlhbF9kcml2ZXIubWlub3Jfc3RhcnQgKyBzdGF0ZS0+bGluZSk7Cgl0dHlfdW5yZWdpc3Rlcl9kZXZmcygmY2FsbG91dF9kcml2ZXIsCgkJCSAgICAgY2FsbG91dF9kcml2ZXIubWlub3Jfc3RhcnQgKyBzdGF0ZS0+bGluZSk7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHJzX2Zpbmkodm9pZCkgCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgZTEsIGUyOwoJaW50IGk7CglzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvOwoKCS8qIHByaW50aygiVW5sb2FkaW5nICVzOiB2ZXJzaW9uICVzXG4iLCBzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24pOyAqLwoJZGVsX3RpbWVyX3N5bmMoJnNlcmlhbF90aW1lcik7CglzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CiAgICAgICAgcmVtb3ZlX2JoKFNFUklBTF9CSCk7CglpZiAoKGUxID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJpdmVyKSkpCgkJcHJpbnRrKCJzZXJpYWw6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIgKCVkKVxuIiwKCQkgICAgICAgZTEpOwoJaWYgKChlMiA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcigmY2FsbG91dF9kcml2ZXIpKSkKCQlwcmludGsoInNlcmlhbDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgY2FsbG91dCBkcml2ZXIgKCVkKVxuIiwgCgkJICAgICAgIGUyKTsKCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwoKCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CgkJaWYgKChpbmZvID0gcnNfdGFibGVbaV0uaW5mbykpIHsKCQkJcnNfdGFibGVbaV0uaW5mbyA9IE5VTEw7CgkJCWtmcmVlKGluZm8pOwoJCX0KCQlpZiAoKHJzX3RhYmxlW2ldLnR5cGUgIT0gUE9SVF9VTktOT1dOKSAmJiByc190YWJsZVtpXS5wb3J0KSB7CiNpZmRlZiBDT05GSUdfU0VSSUFMX1JTQQoJCQlpZiAocnNfdGFibGVbaV0udHlwZSA9PSBQT1JUX1JTQSkKCQkJCXJlbGVhc2VfcmVnaW9uKHJzX3RhYmxlW2ldLnBvcnQgKwoJCQkJCSAgICAgICBVQVJUX1JTQV9CQVNFLCAxNik7CgkJCWVsc2UKI2VuZGlmCgkJCQlyZWxlYXNlX3JlZ2lvbihyc190YWJsZVtpXS5wb3J0LCA4KTsKCQl9CiNpZiBkZWZpbmVkKEVOQUJMRV9TRVJJQUxfUENJKSB8fCBkZWZpbmVkKEVOQUJMRV9TRVJJQUxfUE5QKQoJCWlmIChyc190YWJsZVtpXS5pb21lbV9iYXNlKQoJCQlpb3VubWFwKHJzX3RhYmxlW2ldLmlvbWVtX2Jhc2UpOwojZW5kaWYKCX0KI2lmIGRlZmluZWQoRU5BQkxFX1NFUklBTF9QQ0kpIHx8IGRlZmluZWQoRU5BQkxFX1NFUklBTF9QTlApCglmb3IgKGk9MDsgaSA8IE5SX1BDSV9CT0FSRFM7IGkrKykgewoJCXN0cnVjdCBwY2lfYm9hcmRfaW5zdCAqYnJkID0gJnNlcmlhbF9wY2lfYm9hcmRbaV07CgoJCWlmIChzZXJpYWxfcGNpX2JvYXJkW2ldLmRldiA9PSAwKQoJCQljb250aW51ZTsKCQlpZiAoYnJkLT5ib2FyZC5pbml0X2ZuKQoJCQkoYnJkLT5ib2FyZC5pbml0X2ZuKShicmQtPmRldiwgJmJyZC0+Ym9hcmQsIDApOwoJCWlmIChERUFDVElWQVRFX0ZVTkMoYnJkLT5kZXYpKQoJCQkoREVBQ1RJVkFURV9GVU5DKGJyZC0+ZGV2KSkoYnJkLT5kZXYpOwoJfQojZW5kaWYJCglpZiAodG1wX2J1ZikgewoJCXVuc2lnbmVkIGxvbmcgcGcgPSAodW5zaWduZWQgbG9uZykgdG1wX2J1ZjsKCQl0bXBfYnVmID0gTlVMTDsKCQlmcmVlX3BhZ2UocGcpOwoJfQoJCiNpZmRlZiBFTkFCTEVfU0VSSUFMX1BDSQoJaWYgKHNlcmlhbF9wY2lfZHJpdmVyLm5hbWVbMF0pCgkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmc2VyaWFsX3BjaV9kcml2ZXIpOwojZW5kaWYKfQoKbW9kdWxlX2luaXQocnNfaW5pdCk7Cm1vZHVsZV9leGl0KHJzX2ZpbmkpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlN0YW5kYXJkL2dlbmVyaWMgKGR1bWIpIHNlcmlhbCBkcml2ZXIiKTsKTU9EVUxFX0FVVEhPUigiVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTZXJpYWwgY29uc29sZSBkcml2ZXIKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCgojZGVmaW5lIEJPVEhfRU1QVFkgKFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFKQoKc3RhdGljIHN0cnVjdCBhc3luY19zdHJ1Y3QgYXN5bmNfc2VyY29uczsKCi8qCiAqCVdhaXQgZm9yIHRyYW5zbWl0dGVyICYgaG9sZGluZyByZWdpc3RlciB0byBlbXB0eQogKi8Kc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3htaXRyKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCnsKCXVuc2lnbmVkIGludCBzdGF0dXMsIHRtb3V0ID0gMTAwMDAwMDsKCglkbyB7CgkJc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfTFNSKTsKCgkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0JJKQoJCQlsc3JfYnJlYWtfZmxhZyA9IFVBUlRfTFNSX0JJOwoJCQoJCWlmICgtLXRtb3V0ID09IDApCgkJCWJyZWFrOwoJfSB3aGlsZSgoc3RhdHVzICYgQk9USF9FTVBUWSkgIT0gQk9USF9FTVBUWSk7CgoJLyogV2FpdCBmb3IgZmxvdyBjb250cm9sIGlmIG5lY2Vzc2FyeSAqLwoJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ09OU19GTE9XKSB7CgkJdG1vdXQgPSAxMDAwMDAwOwoJCXdoaWxlICgtLXRtb3V0ICYmCgkJICAgICAgICgoc2VyaWFsX2luKGluZm8sIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0NUUykgPT0gMCkpOwoJfQkKfQoKCi8qCiAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKICoJYW55IHBvc3NpYmxlIHJlYWwgdXNlIG9mIHRoZSBwb3J0Li4uCiAqCiAqCVRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuCiAqLwpzdGF0aWMgdm9pZCBzZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsCgkJCQl1bnNpZ25lZCBjb3VudCkKewoJc3RhdGljIHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAmYXN5bmNfc2VyY29uczsKCWludCBpZXI7Cgl1bnNpZ25lZCBpOwoKCS8qCgkgKglGaXJzdCBzYXZlIHRoZSBJRVIgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzCgkgKi8KCWllciA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0lFUik7CglzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCAweDAwKTsKCgkvKgoJICoJTm93LCBkbyBlYWNoIGNoYXJhY3RlcgoJICovCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcysrKSB7CgkJd2FpdF9mb3JfeG1pdHIoaW5mbyk7CgoJCS8qCgkJICoJU2VuZCB0aGUgY2hhcmFjdGVyIG91dC4KCQkgKglJZiBhIExGLCBhbHNvIGRvIENSLi4uCgkJICovCgkJc2VyaWFsX291dChpbmZvLCBVQVJUX1RYLCAqcyk7CgkJaWYgKCpzID09IDEwKSB7CgkJCXdhaXRfZm9yX3htaXRyKGluZm8pOwoJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfVFgsIDEzKTsKCQl9Cgl9CgoJLyoKCSAqCUZpbmFsbHksIFdhaXQgZm9yIHRyYW5zbWl0dGVyICYgaG9sZGluZyByZWdpc3RlciB0byBlbXB0eQoJICogCWFuZCByZXN0b3JlIHRoZSBJRVIKCSAqLwoJd2FpdF9mb3JfeG1pdHIoaW5mbyk7CglzZXJpYWxfb3V0KGluZm8sIFVBUlRfSUVSLCBpZXIpOwp9CgpzdGF0aWMga2Rldl90IHNlcmlhbF9jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYykKewoJcmV0dXJuIE1LREVWKFRUWV9NQUpPUiwgNjQgKyBjLT5pbmRleCk7Cn0KCi8qCiAqCVNldHVwIGluaXRpYWwgYmF1ZC9iaXRzL3Bhcml0eS9mbG93IGNvbnRyb2wuIFdlIGRvIHR3byB0aGluZ3MgaGVyZToKICoJLSBjb25zdHJ1Y3QgYSBjZmxhZyBzZXR0aW5nIGZvciB0aGUgZmlyc3QgcnNfb3BlbigpCiAqCS0gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIHBvcnQKICoJUmV0dXJuIG5vbi16ZXJvIGlmIHdlIGRpZG4ndCBmaW5kIGEgc2VyaWFsIHBvcnQuCiAqLwpzdGF0aWMgaW50IF9faW5pdCBzZXJpYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCnsKCXN0YXRpYyBzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvOwoJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7Cgl1bnNpZ25lZCBjdmFsOwoJaW50CWJhdWQgPSA5NjAwOwoJaW50CWJpdHMgPSA4OwoJaW50CXBhcml0eSA9ICduJzsKCWludAlkb2Zsb3cgPSAwOwoJaW50CWNmbGFnID0gQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKCWludAlxdW90ID0gMDsKCWNoYXIJKnM7CgoJaWYgKG9wdGlvbnMpIHsKCQliYXVkID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgTlVMTCwgMTApOwoJCXMgPSBvcHRpb25zOwoJCXdoaWxlKCpzID49ICcwJyAmJiAqcyA8PSAnOScpCgkJCXMrKzsKCQlpZiAoKnMpIHBhcml0eSA9ICpzKys7CgkJaWYgKCpzKSBiaXRzICAgPSAqcysrIC0gJzAnOwoJCWlmICgqcykgZG9mbG93ID0gKCpzKysgPT0gJ3InKTsKCX0KCgkvKgoJICoJTm93IGNvbnN0cnVjdCBhIGNmbGFnIHNldHRpbmcuCgkgKi8KCXN3aXRjaChiYXVkKSB7CgkJY2FzZSAxMjAwOgoJCQljZmxhZyB8PSBCMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSAyNDAwOgoJCQljZmxhZyB8PSBCMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSA0ODAwOgoJCQljZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSAxOTIwMDoKCQkJY2ZsYWcgfD0gQjE5MjAwOwoJCQlicmVhazsKCQljYXNlIDM4NDAwOgoJCQljZmxhZyB8PSBCMzg0MDA7CgkJCWJyZWFrOwoJCWNhc2UgNTc2MDA6CgkJCWNmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CgkJY2FzZSAxMTUyMDA6CgkJCWNmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwoJCWNhc2UgOTYwMDoKCQlkZWZhdWx0OgoJCQljZmxhZyB8PSBCOTYwMDsKCQkJLyoKCQkJICogU2V0IHRoaXMgdG8gYSBzYW5lIHZhbHVlIHRvIHByZXZlbnQgYSBkaXZpZGUgZXJyb3IKCQkJICovCgkJCWJhdWQgID0gOTYwMDsKCQkJYnJlYWs7Cgl9Cglzd2l0Y2goYml0cykgewoJCWNhc2UgNzoKCQkJY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCWNhc2UgODoKCQkJY2ZsYWcgfD0gQ1M4OwoJCQlicmVhazsKCX0KCXN3aXRjaChwYXJpdHkpIHsKCQljYXNlICdvJzogY2FzZSAnTyc6CgkJCWNmbGFnIHw9IFBBUk9ERDsKCQkJYnJlYWs7CgkJY2FzZSAnZSc6IGNhc2UgJ0UnOgoJCQljZmxhZyB8PSBQQVJFTkI7CgkJCWJyZWFrOwoJfQoJY28tPmNmbGFnID0gY2ZsYWc7CgoJLyoKCSAqCURpdmlzb3IsIGJ5dGVzaXplIGFuZCBwYXJpdHkKCSAqLwoJc3RhdGUgPSByc190YWJsZSArIGNvLT5pbmRleDsKCWlmIChkb2Zsb3cpCgkJc3RhdGUtPmZsYWdzIHw9IEFTWU5DX0NPTlNfRkxPVzsKCWluZm8gPSAmYXN5bmNfc2VyY29uczsKCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOwoJaW5mby0+c3RhdGUgPSBzdGF0ZTsKCWluZm8tPnBvcnQgPSBzdGF0ZS0+cG9ydDsKCWluZm8tPmZsYWdzID0gc3RhdGUtPmZsYWdzOwojaWZkZWYgQ09ORklHX0hVQjYKCWluZm8tPmh1YjYgPSBzdGF0ZS0+aHViNjsKI2VuZGlmCglpbmZvLT5pb190eXBlID0gc3RhdGUtPmlvX3R5cGU7CglpbmZvLT5pb21lbV9iYXNlID0gc3RhdGUtPmlvbWVtX2Jhc2U7CglpbmZvLT5pb21lbV9yZWdfc2hpZnQgPSBzdGF0ZS0+aW9tZW1fcmVnX3NoaWZ0OwoJcXVvdCA9IHN0YXRlLT5iYXVkX2Jhc2UgLyBiYXVkOwoJY3ZhbCA9IGNmbGFnICYgKENTSVpFIHwgQ1NUT1BCKTsKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19hbHBoYV9fKQoJY3ZhbCA+Pj0gODsKI2Vsc2UgLyogIV9fcG93ZXJwY19fICYmICFfX2FscGhhX18gKi8KCWN2YWwgPj49IDQ7CiNlbmRpZiAvKiAhX19wb3dlcnBjX18gJiYgIV9fYWxwaGFfXyAqLwoJaWYgKGNmbGFnICYgUEFSRU5CKQoJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOwoJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQoJCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKCgkvKgoJICoJRGlzYWJsZSBVQVJUIGludGVycnVwdHMsIHNldCBEVFIgYW5kIFJUUyBoaWdoCgkgKglhbmQgc2V0IHNwZWVkLgoJICovCglzZXJpYWxfb3V0KGluZm8sIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7CS8qIHNldCBETEFCICovCglzZXJpYWxfb3V0KGluZm8sIFVBUlRfRExMLCBxdW90ICYgMHhmZik7CS8qIExTIG9mIGRpdmlzb3IgKi8KCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9ETE0sIHF1b3QgPj4gOCk7CQkvKiBNUyBvZiBkaXZpc29yICovCglzZXJpYWxfb3V0KGluZm8sIFVBUlRfTENSLCBjdmFsKTsJCS8qIHJlc2V0IERMQUIgKi8KCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9JRVIsIDApOwoJc2VyaWFsX291dChpbmZvLCBVQVJUX01DUiwgVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKCgkvKgoJICoJSWYgd2UgcmVhZCAweGZmIGZyb20gdGhlIExTUiwgdGhlcmUgaXMgbm8gVUFSVCBoZXJlLgoJICovCglpZiAoc2VyaWFsX2luKGluZm8sIFVBUlRfTFNSKSA9PSAweGZmKQoJCXJldHVybiAtMTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CgluYW1lOgkJInR0eVMiLAoJd3JpdGU6CQlzZXJpYWxfY29uc29sZV93cml0ZSwKCWRldmljZToJCXNlcmlhbF9jb25zb2xlX2RldmljZSwKCXNldHVwOgkJc2VyaWFsX2NvbnNvbGVfc2V0dXAsCglmbGFnczoJCUNPTl9QUklOVEJVRkZFUiwKCWluZGV4OgkJLTEsCn07CgovKgogKglSZWdpc3RlciBjb25zb2xlLgogKi8Kdm9pZCBfX2luaXQgc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQp7CglyZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zKTsKfQojZW5kaWYKCi8qCiAgTG9jYWwgdmFyaWFibGVzOgogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkuLi8uLi9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1waXBlIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1tYXJjaD1pNTg2IC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICAgLURFWFBPUlRfU1lNVEFCIC1jIHNlcmlhbC5jIgogIEVuZDoKKi8K