IC8qCiAqIChDKSBDb3B5cmlnaHQgMjAwMQogKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KI2lmbmRlZiBfUENJX1BBUlRTX0hfCiNkZWZpbmUgX1BDSV9QQVJUU19IXwoKCi8qIEJvYXJkIHNwZWNpZmljIGZpbGUgY29udGFpbmluZzoKICogLSBQQ0kgTWVtb3J5IE1hcHBpbmcKICogLSBQQ0kgSU8gTWFwcGluZwogKiAtIFBDSSBJbnRlcnJ1cHQgTWFwcGluZwogKi8KCi8qIFBJUDQwNSBQQ0kgSU5UIFJvdXRpbmc6CiAqICAgICAgICAgICAgICAgICAgICAgIElSUTAgIFZFQ1RPUgogKiBQSVhYNCBJRFNFTCAgPSBBRDE2ICBJTlRBIyAgMjggKEZ1bmN0aW9uIDIgVVNCIGlzIElOVEQjID0gMzEpCiAqIFZHQSAgIElEU0VMICA9IEFEMTcgIElOVEIjICAyOQogKiBTQ1NJICBJRFNFTCAgPSBBRDE4ICBJTlRDIyAgMzAKICogUEMxMDQgSURTRUwwID0gQUQyMCAgSU5UQSMgIDI4CiAqIFBDMTA0IElEU0VMMSA9IEFEMjEgIElOVEIjICAyOQogKiBQQzEwNCBJRFNFTDIgPSBBRDIyICBJTlRDIyAgMzAKICogUEMxMDQgSURTRUwzID0gQUQyMyAgSU5URCMgIDMxCiAqCiAqIGJ1c2RldmZ1bmMgPSBFWFhYIFhYWFggQkJCQiBCQkJCIEREREQgREZGRiBSUlJSIFJSMDAKICogICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgXiAgICAgXiAgIF4KICogICAgICAgICAgICAgMzEgICAgICAgIDIzICAgICAgICAxNSAgICAxMCAgIDcKICogRSA9IEVuYWJsZWQKICogQiA9IEJ1c3NudW1iZXIKICogRCA9IERldmljZW51bWJlciAoRGV2aWNlMCA9IEFEMTApCiAqIEYgPSBGdW5jdGlvbm51bWJlcgogKiBSID0gUmVnaXN0ZXJudW1iZXIKICoKICogRGV2aWNlID0gKGJ1c2RldmZ1bmM+PjExKSArIDEwCiAqIFZlY3RvciA9IGRldmljZW51bWJlciAlIDQgKyAyOAogKgogKi8KI2RlZmluZSBQQ0lfSElHSEVTVF9PTl9CT0FSRF9JRAkxOQovKiNkZWZpbmUgUENJX0RFVl9OVU1CRVIoeCkJKCgoeD4+MTEpICYgMHgxZikgKyAxMCkgKi8KI2RlZmluZSBQQ0lfSVJRX1ZFQ1RPUih4KQkoKFBDSV9ERVYoeCkgKyAxMCkgJSA0KSArIDI4CgoKLyogUENJIERldmljZSBMaXN0IGZvciBQSVA0MDUgKi8KCi8qIE1hcHBpbmc6CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIKYgUENJIE1lbUFkZHIgfCBQQ0kgSU9BZGRyIHwgTG9jYWwgQWRkciB8IERldmljZSAvIEZ1bmN0aW9uICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4MDAwMDAwMDAgfCAgICAgICAgICAgIHwgMHhBMDAwMDAwMCB8IElTQSBNZW1vcnkgKGhhcmQgd2lyZWQpICAgICAgICB8CiAqIHwgIDB4MDBGRkZGRkYgfCAgICAgICAgICAgIHwgMHhBMEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgICAgICAgICAgICAgfCAweDAwMDAwMDAwIHwgMHhFODAwMDAwMCB8IElTQSBJTyAoaGFyZCB3aXJlZCkgICAgICAgICAgICB8CiAqIHwgICAgICAgICAgICAgfCAweDAwMDBGRkZGIHwgMHhFODAwRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4ODAwMDAwMDAgfCAgICAgICAgICAgIHwgMHg4MDAwMDAwMCB8IFZHQSBDb250cm9sbGVyIE1lbW9yeSAgICAgICAgICB8CiAqIHwgIDB4ODBGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqIHwgIDB4ODEwMDAwMDAgfCAgICAgICAgICAgIHwgMHg4MTAwMDAwMCB8IFNDU0kgQ29udHJvbGxlciBNZW1vcnkgICAgICAgICB8CiAqIHwgIDB4ODFGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MUZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqLwoKc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHsKCWludAkJaW5kZXg7CS8qIGFkZHJlc3MgKi8KCXVuc2lnbmVkIGxvbmcJdmFsOwkvKiB2YWx1ZSAqLwoJaW50CQl3aWR0aDsJLyogZGF0YSBzaXplICovCn07CgpleHRlcm4gdm9pZCBwY2lfcGlwNDA1X3dyaXRlX3JlZ3Moc3RydWN0IHBjaV9jb250cm9sbGVyICosCgkJCQkgIHBjaV9kZXZfdCwKCQkJCSAgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKik7CgovKiBQSUlYNCBJU0EgQnJpZGdlIEZ1bmN0aW9uIDAgKi8Kc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF9pc2FfYnJpZGdlX2YwW10gPSB7Cgl7UENJX0NGR19QSUlYNF9TRVJJUlEsCTB4RDAsCQkxfSwgLyogZW5hYmxlIENvbnRpbm91cyBTRVJJUlEgUGluICovCgl7UENJX0NGR19QSUlYNF9HRU5DRkcsCTB4MDAwMTgwNDEsCTR9LCAvKiBlbmFibGUgU0VSSVJRcywgSVNBLCBQTlAsIEdQSTExICovCgl7UENJX0NGR19QSUlYNF9UT00sCTB4RkUsCQkxfSwgLyogVG9wIG9mIE1lbW9yeQkJKi8KCXtQQ0lfQ0ZHX1BJSVg0X1hCQ1MsCTB4MDJDNCwJCTJ9LCAvKiBkaXNhYmxlIGFsbCBwZXJpIENTCSovCgl7UENJX0NGR19QSUlYNF9SVENDRkcsCTB4MjEsCQkxfSwgLyogZW5hYmxlIFJUQwkJKi8KI2lmIGRlZmluZWQoQ09ORklHX1BJUDQwNSkKCXtQQ0lfQ0ZHX1BJSVg0X01CRE1BLAkweDgyLAkJMX0sIC8qIHNldCBNQkRNQTAgdG8gRE1BIDIJKi8KCXtQQ0lfQ0ZHX1BJSVg0X01CRE1BKzEsCTB4ODMsCQkxfSwgLyogc2V0IE1CRE1BMSB0byBETUEgMwkqLwojZW5kaWYKCXtQQ0lfQ0ZHX1BJSVg0X0RMQywJMHgwLAkJMX0sIC8qIGRpc2FibGUgcGFzc2l2ZSByZWxlYXNlIGZlYXR1cmUgKi8KCXsgfQkJCQkJICAgIC8qIGVuZCBvZiBkZXZpY2UgdGFibGUJKi8KfTsKCi8qIFBJSVg0IElERSBDb250cm9sbGVyIEZ1bmN0aW9uIDEgKi8Kc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF9pZGVfY250cmxfZjFbXSA9IHsKCXtQQ0lfQ0ZHX1BJSVg0X0JNSUJBLAkweDAwMDEwMDAsCTR9LCAvKiBzZXQgQk1JIHRvIGEgdmFsaWQgYWRkcmVzcyAqLwoJe1BDSV9DT01NQU5ELAkJMHgwMDAxLAkJMn0sIC8qIGVuYWJsZSBJTyBhY2Nlc3MJKi8KI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQoJe1BDSV9DRkdfUElJWDRfSURFVElNLAkweDgwMDA4MDAwLAk0fSwgLyogZW5hYmxlIEJvdGggSURFIGNoYW5uZWxzCSovCiNlbHNlCgl7UENJX0NGR19QSUlYNF9JREVUSU0sCTB4MDAwMDgwMDAsCTR9LCAvKiBlbmFibGUgSURFIGNoYW5uZWwwCSovCiNlbmRpZgoJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZQkqLwp9OwoKLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMiAqLwpzdGF0aWMgc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHBpaXg0X3VzYl9jbnRybF9mMltdID0gewojaWYgIWRlZmluZWQoQ09ORklHX01JUDQwNVQpCgl7UENJX0lOVEVSUlVQVF9MSU5FLAkzMSwJCTF9LCAvKiBJbnQgdmVjdG9yID0gMzEJCSovCgl7UENJX0JBU0VfQUREUkVTU180LAkweDAwMDBFMDAxLAk0fSwgLyogU2V0IElPIEFkZHJlc3MgdG8gMHhlMDAwIHRvIDB4ZTAxRiAqLwoJe1BDSV9MQVRFTkNZX1RJTUVSLAkweDgwLAkJMX0sIC8qIExhdGVuY3kgVGltZXIgMHg4MAkqLwoJezB4QzAsCQkJMHgyMDAwLAkJMn0sIC8qIExlZ2FjeSBzdXBwb3J0CQkqLwoJe1BDSV9DT01NQU5ELAkJMHgwMDA1LAkJMn0sIC8qIGVuYWJsZSBJTyBhY2Nlc3MgYW5kIE1hc3RlciAqLwojZW5kaWYKCXsgfQkJCQkJICAgIC8qIGVuZCBvZiBkZXZpY2UgdGFibGUJKi8KfTsKCi8qIFBJSVg0IFBvd2VyIE1hbmFnZW1lbnQgRnVuY3Rpb24gMyAqLwpzdGF0aWMgc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHBpaXg0X3BtbV9jbnRybF9mM1tdID0gewoJe1BDSV9DRkdfUElJWDRfUE1CQSwJMHgwMDAwNDAwMCwJNH0sIC8qIHNldCBQTUJBIHRvICJ2YWxpZCIgdmFsdWUgKi8KCXtQQ0lfQ0ZHX1BJSVg0X1NNQkJBLAkweDAwMDA1MDAwLAk0fSwgLyogc2V0IFNNQkJBIHRvICJ2YWxpZCIgdmFsdWUgKi8KCXtQQ0lfQ0ZHX1BJSVg0X1BNTUlTQywJMHgwMSwJCTF9LCAvKiBlbmFibGUgUE1CQSBJTyBhY2Nlc3MJKi8KCXtQQ0lfQ09NTUFORCwJCTB4MDAwMSwJCTJ9LCAvKiBlbmFibGUgSU8gYWNjZXNzCSovCgl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlCSovCn07Ci8qIFBQQzQwNSBEdW1teSBvbmx5IHVzZWQgdG8gcHJldmVudCBhdXRvc2V0dXAgb24gdGhpcyBob3N0IGJyaWRnZSAqLwpzdGF0aWMgc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHBwYzQwNV9kdW1teVtdID0gewoJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZQkqLwp9OwoKdm9pZCBwY2lfNDA1Z3Bfc2V0dXBfdmdhKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKCQkJIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSk7CgoKc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9waXA0MDVfY29uZmlnX3RhYmxlW109ewoJe1BDSV9WRU5ET1JfSURfSUJNLAkJCS8qIDQwNSBkdW1teSAqLwoJIFBDSV9ERVZJQ0VfSURfSUJNXzQwNUdQLAoJIFBDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwKCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgcHBjNDA1X2R1bW15fX0sCgoJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgSVNBIEJyaWRnZSBGdW5jdGlvbiAwICovCgkgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzAsCgkgUENJX0FOWV9JRCwKCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLAoJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBwaWl4NF9pc2FfYnJpZGdlX2YwfX0sCgoJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgSURFIENvbnRyb2xsZXIgRnVuY3Rpb24gMSAqLwoJIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQiwKCSBQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDEsCgkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X2lkZV9jbnRybF9mMX19LAoKCXtQQ0lfVkVORE9SX0lEX0lOVEVMLAkJCS8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDIgKi8KCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMiwKCSBQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDIsCgkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X3VzYl9jbnRybF9mMn19LAoKCXtQQ0lfVkVORE9SX0lEX0lOVEVMLAkJCS8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDMgKi8KCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywKCSBQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDMsCgkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X3BtbV9jbnRybF9mM319LAoKCXtQQ0lfQU5ZX0lELAoJIFBDSV9BTllfSUQsCgkgUENJX0NMQVNTX0RJU1BMQVlfVkdBLAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCgoJe1BDSV9BTllfSUQsCgkgUENJX0FOWV9JRCwKCSBQQ0lfQ0xBU1NfTk9UX0RFRklORURfVkdBLAoJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCgoJeyB9Cn07CiNlbmRpZiAvKiBfUENJX1BBUlRTX0hfICovCg==