IC8qCiAqIChDKSBDb3B5cmlnaHQgMjAwMQogKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KI2lmbmRlZiBfUENJX1BBUlRTX0hfCiNkZWZpbmUgX1BDSV9QQVJUU19IXwoKCi8qIEJvYXJkIHNwZWNpZmljIGZpbGUgY29udGFpbmluZzoKICogLSBQQ0kgTWVtb3J5IE1hcHBpbmcKICogLSBQQ0kgSU8gTWFwcGluZwogKiAtIFBDSSBJbnRlcnJ1cHQgTWFwcGluZwogKi8KCi8qIFBJUDQwNSBQQ0kgSU5UIFJvdXRpbmc6CiAqICAgICAgICAgICAgICAgICAgICAgIElSUTAgIFZFQ1RPUgogKiBQSVhYNCBJRFNFTCAgPSBBRDE2ICBJTlRBIyAgMjggKEZ1bmN0aW9uIDIgVVNCIGlzIElOVEQjID0gMzEpCiAqIFZHQSAgIElEU0VMICA9IEFEMTcgIElOVEIjICAyOQogKiBTQ1NJICBJRFNFTCAgPSBBRDE4ICBJTlRDIyAgMzAKICogUEMxMDQgSURTRUwwID0gQUQyMCAgSU5UQSMgIDI4CiAqIFBDMTA0IElEU0VMMSA9IEFEMjEgIElOVEIjICAyOQogKiBQQzEwNCBJRFNFTDIgPSBBRDIyICBJTlRDIyAgMzAKICogUEMxMDQgSURTRUwzID0gQUQyMyAgSU5URCMgIDMxCiAqCiAqIGJ1c2RldmZ1bmMgPSBFWFhYIFhYWFggQkJCQiBCQkJCIEREREQgREZGRiBSUlJSIFJSMDAKICogICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgXiAgICAgXiAgIF4KICogICAgICAgICAgICAgMzEgICAgICAgIDIzICAgICAgICAxNSAgICAxMCAgIDcKICogRSA9IEVuYWJsZWQKICogQiA9IEJ1c3NudW1iZXIKICogRCA9IERldmljZW51bWJlciAoRGV2aWNlMCA9IEFEMTApCiAqIEYgPSBGdW5jdGlvbm51bWJlcgogKiBSID0gUmVnaXN0ZXJudW1iZXIKICoKICogRGV2aWNlID0gKGJ1c2RldmZ1bmM+PjExKSArIDEwCiAqIFZlY3RvciA9IGRldmljZW51bWJlciAlIDQgKyAyOAogKgogKi8KI2RlZmluZSBQQ0lfSElHSEVTVF9PTl9CT0FSRF9JRAkxOQovKiNkZWZpbmUgUENJX0RFVl9OVU1CRVIoeCkJKCgoeD4+MTEpICYgMHgxZikgKyAxMCkgKi8KI2RlZmluZSBQQ0lfSVJRX1ZFQ1RPUih4KQkoKFBDSV9ERVYoeCkgKyAxMCkgJSA0KSArIDI4CgoKLyogUENJIERldmljZSBMaXN0IGZvciBQSVA0MDUgKi8KCi8qIE1hcHBpbmc6CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIKYgUENJIE1lbUFkZHIgfCBQQ0kgSU9BZGRyIHwgTG9jYWwgQWRkciB8IERldmljZSAvIEZ1bmN0aW9uICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4MDAwMDAwMDAgfCAgICAgICAgICAgIHwgMHhBMDAwMDAwMCB8IElTQSBNZW1vcnkgKGhhcmQgd2lyZWQpICAgICAgICB8CiAqIHwgIDB4MDBGRkZGRkYgfCAgICAgICAgICAgIHwgMHhBMEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgICAgICAgICAgICAgfCAweDAwMDAwMDAwIHwgMHhFODAwMDAwMCB8IElTQSBJTyAoaGFyZCB3aXJlZCkgICAgICAgICAgICB8CiAqIHwgICAgICAgICAgICAgfCAweDAwMDBGRkZGIHwgMHhFODAwRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4ODAwMDAwMDAgfCAgICAgICAgICAgIHwgMHg4MDAwMDAwMCB8IFZHQSBDb250cm9sbGVyIE1lbW9yeSAgICAgICAgICB8CiAqIHwgIDB4ODBGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4ODEwMDAwMDAgfCAgICAgICAgICAgIHwgMHg4MTAwMDAwMCB8IFNDU0kgQ29udHJvbGxlciBNZW1vcnkgICAgICAgICB8CiAqIHwgIDB4ODFGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MUZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqLwoKc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHsKCWludCAJCWluZGV4OyAJLyogYWRkcmVzcyAqLwoJdW5zaWduZWQgbG9uZyAJdmFsOwkvKiB2YWx1ZSAqLwoJaW50IAkJd2lkdGg7CS8qIGRhdGEgc2l6ZSAqLwp9OwoKZXh0ZXJuIHZvaWQgcGNpX3BpcDQwNV93cml0ZV9yZWdzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLAoJCQkJICBwY2lfZGV2X3QsCgkJCQkgIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICopOwoKLyogUElJWDQgSVNBIEJyaWRnZSBGdW5jdGlvbiAwICovCnN0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgcGlpeDRfaXNhX2JyaWRnZV9mMFtdID0gewoJe1BDSV9DRkdfUElJWDRfU0VSSVJRLAkweEQwLAkJMX0sIC8qIGVuYWJsZSBDb250aW5vdXMgU0VSSVJRIFBpbiAqLwoJe1BDSV9DRkdfUElJWDRfR0VOQ0ZHLAkweDAwMDE4MDQxLAk0fSwgLyogZW5hYmxlIFNFUklSUXMsIElTQSwgUE5QLCBHUEkxMSAqLwoJe1BDSV9DRkdfUElJWDRfVE9NLAkweEZFLAkJMX0sIC8qIFRvcCBvZiBNZW1vcnkJCSovCgl7UENJX0NGR19QSUlYNF9YQkNTLAkweDAyQzQsCQkyfSwgLyogZGlzYWJsZSBhbGwgcGVyaSBDUwkqLwoJe1BDSV9DRkdfUElJWDRfUlRDQ0ZHLAkweDIxLAkJMX0sIC8qIGVuYWJsZSBSVEMJICAgCSovCiNpZiBkZWZpbmVkKENPTkZJR19QSVA0MDUpCgl7UENJX0NGR19QSUlYNF9NQkRNQSwJMHg4MiwJCTF9LCAvKiBzZXQgTUJETUEwIHRvIERNQSAyICAgCSovCgl7UENJX0NGR19QSUlYNF9NQkRNQSsxLAkweDgzLAkJMX0sIC8qIHNldCBNQkRNQTEgdG8gRE1BIDMgICAJKi8KI2VuZGlmCgl7UENJX0NGR19QSUlYNF9ETEMsCTB4MCwJCTF9LCAvKiBkaXNhYmxlIHBhc3NpdmUgcmVsZWFzZSBmZWF0dXJlICovCgl7IH0JCQkJICAgIAkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZQkqLwp9OwoKLyogUElJWDQgSURFIENvbnRyb2xsZXIgRnVuY3Rpb24gMSAqLwpzdGF0aWMgc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHBpaXg0X2lkZV9jbnRybF9mMVtdID0gewoJe1BDSV9DRkdfUElJWDRfQk1JQkEsCTB4MDAwMTAwMCwJNH0sIC8qIHNldCBCTUkgdG8gYSB2YWxpZCBhZGRyZXNzICovCgl7UENJX0NPTU1BTkQsCQkweDAwMDEsCQkyfSwgLyogZW5hYmxlIElPIGFjY2VzcyAJKi8KI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQoJe1BDSV9DRkdfUElJWDRfSURFVElNLAkweDgwMDA4MDAwLAk0fSwgLyogZW5hYmxlIEJvdGggSURFIGNoYW5uZWxzCSovCiNlbHNlCgl7UENJX0NGR19QSUlYNF9JREVUSU0sCTB4MDAwMDgwMDAsCTR9LCAvKiBlbmFibGUgSURFIGNoYW5uZWwwCSovCiNlbmRpZgoJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZSAJKi8KfTsKCi8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDIgKi8Kc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF91c2JfY250cmxfZjJbXSA9IHsKI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQoJe1BDSV9JTlRFUlJVUFRfTElORSwJMzEsCQkxfSwgLyogSW50IHZlY3RvciA9IDMxIAkJKi8KCXtQQ0lfQkFTRV9BRERSRVNTXzQsCTB4MDAwMEUwMDEsCTR9LCAvKiBTZXQgSU8gQWRkcmVzcyB0byAweGUwMDAgdG8gMHhlMDFGICovCgl7UENJX0xBVEVOQ1lfVElNRVIsCTB4ODAsCQkxfSwgLyogTGF0ZW5jeSBUaW1lciAweDgwIAkqLwoJezB4QzAsCQkJMHgyMDAwLAkJMn0sIC8qIExlZ2FjeSBzdXBwb3J0IAkJKi8KCXtQQ0lfQ09NTUFORCwJCTB4MDAwNSwJCTJ9LCAvKiBlbmFibGUgSU8gYWNjZXNzIGFuZCBNYXN0ZXIgKi8KI2VuZGlmCgl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLwp9OwoKLyogUElJWDQgUG93ZXIgTWFuYWdlbWVudCBGdW5jdGlvbiAzICovCnN0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgcGlpeDRfcG1tX2NudHJsX2YzW10gPSB7Cgl7UENJX0NGR19QSUlYNF9QTUJBLAkweDAwMDA0MDAwLAk0fSwgLyogc2V0IFBNQkEgdG8gInZhbGlkIiB2YWx1ZSAqLwoJe1BDSV9DRkdfUElJWDRfU01CQkEsCTB4MDAwMDUwMDAsCTR9LCAvKiBzZXQgU01CQkEgdG8gInZhbGlkIiB2YWx1ZSAqLwoJe1BDSV9DRkdfUElJWDRfUE1NSVNDLAkweDAxLAkJMX0sIC8qIGVuYWJsZSBQTUJBIElPIGFjY2VzcwkqLwoJe1BDSV9DT01NQU5ELAkJMHgwMDAxLAkJMn0sIC8qIGVuYWJsZSBJTyBhY2Nlc3MgCSovCgl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLwp9OwovKiBQUEM0MDUgRHVtbXkgb25seSB1c2VkIHRvIHByZXZlbnQgYXV0b3NldHVwIG9uIHRoaXMgaG9zdCBicmlkZ2UgKi8Kc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwcGM0MDVfZHVtbXlbXSA9IHsKCXsgfQkJCQkgICAgCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLwp9OwoKdm9pZCBwY2lfNDA1Z3Bfc2V0dXBfdmdhKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKCQkJIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSk7CgoKc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9waXA0MDVfY29uZmlnX3RhYmxlW109ewoJe1BDSV9WRU5ET1JfSURfSUJNLCAJCQkvKiA0MDUgZHVtbXkgKi8KCSBQQ0lfREVWSUNFX0lEX0lCTV80MDVHUCwKCSBQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsCgkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBwYzQwNV9kdW1teX19LAoKCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAJCQkvKiBQSUlYNCBJU0EgQnJpZGdlIEZ1bmN0aW9uIDAgKi8KCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMCwKCSBQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsCgkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X2lzYV9icmlkZ2VfZjB9fSwKCgl7UENJX1ZFTkRPUl9JRF9JTlRFTCwJCQkvKiBQSUlYNCBJREUgQ29udHJvbGxlciBGdW5jdGlvbiAxICovCgkgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCLAoJIFBDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMSwKCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgcGlpeDRfaWRlX2NudHJsX2YxfX0sCgoJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMiAqLwoJIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8yLAoJIFBDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMiwKCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgcGlpeDRfdXNiX2NudHJsX2YyfX0sCgoJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMyAqLwoJIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLAoJIFBDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMywKCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgcGlpeDRfcG1tX2NudHJsX2YzfX0sCgoJe1BDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwKCSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKCSBwY2lfNDA1Z3Bfc2V0dXBfdmdhfSwKCgl7UENJX0FOWV9JRCwKCSBQQ0lfQU5ZX0lELAoJIFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKCSBwY2lfNDA1Z3Bfc2V0dXBfdmdhfSwKCgl7IH0KfTsKI2VuZGlmIC8qIF9QQ0lfUEFSVFNfSF8gKi8K