LyogdWlzcXVldWUuaAogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCi8qCiAqIFVuaXN5cyBJTyBWaXJ0dWFsaXphdGlvbiBoZWFkZXIgTk9URTogVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgTGludXgKICogc3BlY2lmaWMgc3RydWN0cy4gIEFsbCBPUy1pbmRlcGVuZGVudCBzdHJ1Y3RzIGFyZSBpbiBpb2NoYW5uZWwuaC54eAogKi8KCiNpZm5kZWYgX19VSVNRVUVVRV9IX18KI2RlZmluZSBfX1VJU1FVRVVFX0hfXwoKI2luY2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKI2luY2x1ZGUgImlvY2hhbm5lbC5oIgojaW5jbHVkZSAidW5pa2xvZy5oIgojaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KCiNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCiNpbmNsdWRlICJjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmgiCgpzdHJ1Y3QgdWlzcXVldWVfaW5mbyB7CgoJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqY2hhbjsKCS8qIGNoYW5uZWwgY29udGFpbmluZyBxdWV1ZXMgaW4gd2hpY2ggc2NzaSBjb21tYW5kcyAmCgkgKiByZXNwb25zZXMgYXJlIHF1ZXVlZAoJICovCglVNjQgcGFja2V0c19zZW50OwoJVTY0IHBhY2tldHNfcmVjZWl2ZWQ7CglVNjQgaW50ZXJydXB0c19zZW50OwoJVTY0IGludGVycnVwdHNfcmVjZWl2ZWQ7CglVNjQgbWF4X25vdF9lbXB0eV9jbnQ7CglVNjQgdG90YWxfd2FrZXVwX2NudDsKCVU2NCBub25fZW1wdHlfd2FrZXVwX2NudDsKCglzdHJ1Y3QgewoJCVNJR05BTF9RVUVVRV9IRUFERVIgUmVzZXJ2ZWQxOwkvKiAgKi8KCQlTSUdOQUxfUVVFVUVfSEVBREVSIFJlc2VydmVkMjsJLyogICovCgl9IHNhZmVfdWlzX3F1ZXVlOwoJdW5zaWduZWQgaW50ICgqc2VuZF9pbnRfaWZfbmVlZGVkKShzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqaW5mbywKCQkJCQkgICB1bnNpZ25lZCBpbnQgd2hpY2hjcXVldWUsCgkJCQkJICAgdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCgkJCQkJICAgVTY0IGludGVycnVwdEhhbmRsZSwKCQkJCQkgICB1bnNpZ25lZCBjaGFyIGlvX3Rlcm1pbmF0aW9uKTsKfTsKCi8qIHVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCBxdWV1ZXMgYSBjb21tbWFuZCBvciByZXNwb25zZQogKiB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlLCBhdCB0aGUgdGFpbCBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQKICogb2t0b3dhaXQgPT0gMCwgdGhlbiBpdCByZXR1cm4gMCBpbmRpY2F0aW5nIGZhaWx1cmUuICBvdGhlcndpc2UgaXQKICogd2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGJlY29tZSBub24tZnVsbC4gSWYgY29tbWFuZCBpcyBxdWV1ZWQsIHJldHVybgogKiAxIGZvciBzdWNjZXNzLgogKi8KI2RlZmluZSBET05UX0lTU1VFX0lOVEVSUlVQVCAwCiNkZWZpbmUgSVNTVUVfSU5URVJSVVBUCQkgMQoKI2RlZmluZSBET05UX1dBSVQJCQkgMAojZGVmaW5lIE9LX1RPX1dBSVQJCQkgMQojZGVmaW5lIFVJU0xJQl9MT0NLX1BSRUZJWCBcCgkJIi5zZWN0aW9uIC5zbXBfbG9ja3MsXCJhXCJcbiIgICBcCgkJX0FTTV9BTElHTiAiXG4iICAgICAgICAgICAgICAgICBcCgkJX0FTTV9QVFIgIjY2MWZcbiIgLyogYWRkcmVzcyAqLyBcCgkJIi5wcmV2aW91c1xuIiAgICAgICAgICAgICAgICAgICBcCgkJIjY2MTpcblx0bG9jazsgIgoKdW5zaWduZWQgbG9uZyBsb25nIHVpc3F1ZXVlX0ludGVybG9ja2VkT3IodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKCQkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyBTZXQpOwp1bnNpZ25lZCBsb25nIGxvbmcgdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKCQkJCQkgICB1bnNpZ25lZCBsb25nIGxvbmcgU2V0KTsKCnVuc2lnbmVkIGludCB1aXNxdWV1ZV9zZW5kX2ludF9pZl9uZWVkZWQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnBxdWV1ZWluZm8sCgkJCQkJIHVuc2lnbmVkIGludCB3aGljaHF1ZXVlLAoJCQkJCSB1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKCQkJCQkgVTY0IGludGVycnVwdEhhbmRsZSwKCQkJCQkgdW5zaWduZWQgY2hhciBpb190ZXJtaW5hdGlvbik7CgppbnQgdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sCgkJCQkJIHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwKCQkJCQkgdW5zaWduZWQgaW50IHF1ZXVlLAoJCQkJCSB2b2lkICppbnNlcnRsb2NrLAoJCQkJCSB1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKCQkJCQkgVTY0IGludGVycnVwdEhhbmRsZSwKCQkJCQkgY2hhciBva3Rvd2FpdCwKCQkJCQkgVTggKmNoYW5uZWxJZCk7CgovKiB1aXNxdWV1ZV9nZXRfY21kcnNwIGdldHMgdGhlIGNtZHJzcCBlbnRyeSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUKICogYW5kIGNvcGllcyBpdCB0byB0aGUgYXJlYSBwb2ludGVkIGJ5IGNtZHJzcCBwYXJhbS4KICogcmV0dXJucyAwIGlmIHF1ZXVlIGlzIGVtcHR5LCAxIG90aGVyd2lzZQogKi8KaW50Cgp1aXNxdWV1ZV9nZXRfY21kcnNwKHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sIHZvaWQgKmNtZHJzcCwKCQkgICAgdW5zaWduZWQgaW50IHF1ZXVlKTsKCiNkZWZpbmUgTUFYX05BTUVfU0laRV9VSVNRVUVVRSA2NAoKc3RydWN0IGV4dHBvcnRfaW5mbyB7CglVOCB2YWxpZDoxOwoJLyogaWYgMSwgaW5kaWNhdGVzIHRoaXMgZXh0cG9ydCBzbG90IGlzIG9jY3VwaWVkCgkgKiBpZiAwLCBpbmRpY2F0ZXMgdGhhdCBleHRwb3J0IHNsb3QgaXMgdW5vY2N1cGllZCAqLwoKCVUzMiBudW1fZGV2c191c2luZzsKCS8qIFdoZW4gZXh0cG9ydCBpcyBhZGRlZCwgdGhpcyBpcyBzZXQgdG8gMC4gIEZvciBleHBvcnRzCgkqIGxvY2F0ZWQgaW4gTkVUV09SSyBzd2l0Y2hlczoKCSogRWFjaCB0aW1lIGEgVk5JQywgaS5lLiwgaW50cG9ydCwgaXMgYWRkZWQgdG8gdGhlIHN3aXRjaCB0aGlzCgkqIGlzIHVzZWQgdG8gYXNzaWduIGEgcHJlZl9wbmljIGZvciB0aGUgVk5JQyBhbmQgd2hlbiBhc3NpZ25lZAoJKiB0byBhIFZOSUMgdGhpcyBjb3VudGVyIGlzIGluY3JlbWVudGVkLiBXaGVuIGEgVk5JQyBpcwoJKiBkZWxldGVkLCB0aGUgZXh0cG9ydCBjb3JyZXNwb25kaW5nIHRvIHRoZSBWTklDJ3MgcHJlZl9wbmljCgkqIGlzIGxvY2F0ZWQgYW5kIGl0cyBudW1fZGV2c191c2luZyBpcyBkZWNyZW1lbnRlZC4gRm9yIFZOSUNzLAoJKiBudW1fZGV2c191c2luZyBpcyBiYXNpY2FsbHkgdXNlZCB0byBsb2FkLWJhbGFuY2UgdHJhbnNtaXQKCSogdHJhZmZpYyBmcm9tIFZOSUNzLgoJKi8KCglzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOwoJc3RydWN0IFBjaUlkIHBjaV9pZDsKCWNoYXIgbmFtZVtNQVhfTkFNRV9TSVpFX1VJU1FVRVVFXTsKCXVuaW9uIHsKCQlzdHJ1Y3QgdmhiYV93d25uIHd3bm47CgkJdW5zaWduZWQgY2hhciBtYWNhZGRyW01BWF9NQUNBRERSX0xFTl07Cgl9Owp9OwoKc3RydWN0IGRldmljZV9pbmZvIHsKCXZvaWQgX19pb21lbSAqY2hhbnB0cjsKCVU2NCBjaGFubmVsQWRkcjsKCVU2NCBjaGFubmVsQnl0ZXM7CglHVUlEIGNoYW5uZWxUeXBlR3VpZDsKCUdVSUQgZGV2SW5zdEd1aWQ7CglzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOwoJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKCWNoYXIgZGV2aWRbMzBdOwkJLyogInZidXM8YnVzbm8+OmRldjxkZXZubz4iICovCglVMTYgcG9sbGluZzsKCXN0cnVjdCBzZW1hcGhvcmUgaW50ZXJydXB0X2NhbGxiYWNrX2xvY2s7CglVMzIgYnVzTm87CglVMzIgZGV2Tm87CglpbnQgKCppbnRlcnJ1cHQpKHZvaWQgKik7Cgl2b2lkICppbnRlcnJ1cHRfY29udGV4dDsKCXZvaWQgKnByaXZhdGVfZGF0YTsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVsczsKCXVuc2lnbmVkIGxvbmcgbG9uZyBtb3ZlZF90b190YWlsX2NudDsKCXVuc2lnbmVkIGxvbmcgbG9uZyBmaXJzdF9idXN5X2NudDsKCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X29uX2xpc3RfY250Owp9OwoKdHlwZWRlZiBlbnVtIHsKCVJFQ09WRVJZX0xBTiA9IDEsCglJQl9MQU4gPSAyCn0gU1dJVENIX1RZUEU7CgpzdHJ1Y3QgYnVzX2luZm8gewoJVTMyIGJ1c05vLCBkZXZpY2VDb3VudDsKCXN0cnVjdCBkZXZpY2VfaW5mbyAqKmRldmljZTsKCVU2NCBndWVzdEhhbmRsZSwgcmVjdkJ1c0ludGVycnVwdEhhbmRsZTsKCUdVSUQgYnVzSW5zdEd1aWQ7CglVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqcEJ1c0NoYW5uZWw7CglpbnQgYnVzQ2hhbm5lbEJ5dGVzOwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsJLyogcHJvYy91aXNsaWIvdmJ1cy88eD4gKi8KCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvOwkvKiBwcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvICovCgljaGFyIG5hbWVbMjVdOwoJY2hhciBwYXJ0aXRpb25OYW1lWzk5XTsKCXN0cnVjdCBidXNfaW5mbyAqbmV4dDsKCVU4IGxvY2FsVm5pYzsJCS8qIDEgaWYgbG9jYWwgdm5pYyBjcmVhdGVkIGludGVybmFsbHkKCQkJCSAqIGJ5IElPVk07IDAgb3RoZXJ3aXNlLi4uICovCn07CgojZGVmaW5lIERFRElDQVRFRF9TV0lUQ0gocFN3aXRjaCkgKChwU3dpdGNoLT5leHRQb3J0Q291bnQgPT0gMSkgJiYJXAoJCQkJICAgKHBTd2l0Y2gtPmludFBvcnRDb3VudCA9PSAxKSkKCnN0cnVjdCBzbl9saXN0X2VudHJ5IHsKCXN0cnVjdCB1aXNzY3NpX2Rlc3QgcGRlc3Q7CS8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IKCQkJCQkgKiBwaHlzIGRpc2sgKi8KCVU4IHNlcm51bVtNQVhfU0VSSUFMX05VTV07CS8qIHNlcmlhbCBudW0gb2YgcGh5c2ljYWwKCQkJCQkgKiBkaXNrLi4gVGhlIGxlbmd0aCBpcyBhbHdheXMKCQkJCQkgKiBNQVhfU0VSSUFMX05VTSwgcGFkZGVkIHdpdGgKCQkJCQkgKiBzcGFjZXMgKi8KCXN0cnVjdCBzbl9saXN0X2VudHJ5ICpuZXh0Owp9OwoKc3RydWN0IG5ldHdvcmtQb2xpY3kgewoJVTMyIHByb21pc2N1b3VzOjE7CglVMzIgbWFjYXNzaWduOjE7CglVMzIgcGVlcmZvcndhcmRpbmc6MTsKCVUzMiBub25vdGlmeToxOwoJVTMyIHN0YW5kYnk6MTsKCVUzMiBjYWxsaG9tZToyOwoJY2hhciBpcF9hZGRyWzMwXTsKfTsKCi8qCiAqIElPIG1lc3NhZ2VzIHNlbnQgdG8gVWlzbmljQ29udHJvbENoYW5GdW5jICYgVWlzc2RDb250cm9sQ2hhbkZ1bmMgYnkKICogY29kZSB0aGF0IHByb2Nlc3NlcyB0aGUgQ29udHJvbFZtIGNoYW5uZWwgbWVzc2FnZXMuCiAqLwoKCnR5cGVkZWYgZW51bSB7CglJT1BBUlRfQUREX1ZOSUMsCglJT1BBUlRfREVMX1ZOSUMsCglJT1BBUlRfREVMX0FMTF9WTklDUywKCUlPUEFSVF9BRERfVkhCQSwKCUlPUEFSVF9BRERfVkRJU0ssCglJT1BBUlRfREVMX1ZIQkEsCglJT1BBUlRfREVMX1ZESVNLLAoJSU9QQVJUX0RFTF9BTExfVkRJU0tTX0ZPUl9WSEJBLAoJSU9QQVJUX0RFTF9BTExfVkhCQVMsCglJT1BBUlRfQVRUQUNIX1BIQkEsCglJT1BBUlRfREVUQUNIX1BIQkEsCS8qIDEwICovCglJT1BBUlRfQVRUQUNIX1BOSUMsCglJT1BBUlRfREVUQUNIX1BOSUMsCglJT1BBUlRfREVUQUNIX1ZIQkEsCglJT1BBUlRfREVUQUNIX1ZOSUMsCglJT1BBUlRfUEFVU0VfVkRJU0ssCglJT1BBUlRfUkVTVU1FX1ZESVNLLAoJSU9QQVJUX0FERF9ERVZJQ0UsCS8qIGFkZCBnZW5lcmljIGRldmljZSAqLwoJSU9QQVJUX0RFTF9ERVZJQ0UsCS8qIGRlbCBnZW5lcmljIGRldmljZSAqLwp9IElPUEFSVF9NU0dfVFlQRTsKCnN0cnVjdCBhZGRfdmlydF9pb3BhcnQgewoJdm9pZCAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCglVNjQgZ3Vlc3RIYW5kbGU7CS8qIHVzZWQgdG8gY29udmVydCBndWVzdCBwaHlzaWNhbAoJCQkJICogYWRkcmVzcyB0byByZWFsIHBoeXNpY2FsIGFkZHJlc3MKCQkJCSAqIGZvciBETUEsIGZvciBleC4gKi8KCVU2NCByZWN2QnVzSW50ZXJydXB0SGFuZGxlOwkvKiB1c2VkIHRvIHJlZ2lzdGVyIHRvIHJlY2VpdmUKCQkJCQkgKiBidXMgbGV2ZWwgaW50ZXJydXB0cy4gKi8KCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIGNvbnRhaW5zIHJlY3YgJiBzZW5kCgkJCQkJICogaW50ZXJydXB0IGluZm8gKi8KCS8qIHJlY3ZJbnRlcnJ1cHRIYW5kbGUgaXMgdXNlZCB0byByZWdpc3RlciB0byByZWNlaXZlCgkqIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4gVXNlZCBieSBHdWVzdExpbnV4L1dpbmRvd3MKCSogSU8gZHJpdmVycyB0byBjb25uZWN0IHRvIGludGVycnVwdC4gIHNlbmRJbnRlcnJ1cHRIYW5kbGUgaXMKCSogdXNlZCBieSBJT1BhcnQgZHJpdmVycyBhcyBwYXJhbWV0ZXIgdG8KCSogSXNzdWVfVk1DQUxMX0lPX1FVRVVFX1RSQU5TSVRJT04gdG8gaW50ZXJydXB0IHRocmVhZCBpbgoJKiBndWVzdCBsaW51eC93aW5kb3dzIElPIGRyaXZlcnMgd2hlbiBkYXRhIGNoYW5uZWwgcXVldWUgZm9yCgkqIHZoYmEvdm5pYyBnb2VzIGZyb20gRU1QVFkgdG8gTk9OLUVNUFRZLiAqLwoJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsJLyogcG9pbnRlciB0byB0aGUgdmlydHVhbAoJCQkJCSAqIHN3aXRjaCB0byB3aGljaCB0aGUgdm5pYyBpcwoJCQkJCSAqIGNvbm5lY3RlZCAqLwoKCVU4IHVzZUcyR0NvcHk7CQkvKiBVc2VkIHRvIGRldGVybWluZSBpZiBhIHZpcnR1YWwgSEJBCgkJCQkgKiBuZWVkcyB0byB1c2UgRzJHIGNvcHkuICovCglVOCBGaWxsZXJbN107CgoJVTMyIGJ1c05vOwoJVTMyIGRldk5vOwoJY2hhciAqcGFyYW1zOwoJdWxvbmcgcGFyYW1zX2J5dGVzOwoKfTsKCnN0cnVjdCBhZGRfdmRpc2tfaW9wYXJ0IHsKCXZvaWQgKmNoYW5wdHI7CQkgICAgICAvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLwoJaW50IGltcGxpY2l0OwoJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsgICAgLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvciB2aXJ0IGRpc2sgKi8KCXN0cnVjdCB1aXNzY3NpX2Rlc3QgcGRlc3Q7ICAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgcGh5cyBkaXNrICovCglVOCBzZXJudW1bTUFYX1NFUklBTF9OVU1dOyAgICAvKiBzZXJpYWwgbnVtIG9mIHBoeXNpY2FsIGRpc2sgKi8KCVUzMiBzZXJsZW47CQkgICAgICAvKiBsZW5ndGggb2Ygc2VyaWFsIG51bSAqLwoJVTMyIGJ1c05vOwoJVTMyIGRldk5vOwp9OwoKc3RydWN0IGRlbF92ZGlza19pb3BhcnQgewoJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7ICAgLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvciB2aXJ0IGRpc2sgKi8KCVUzMiBidXNObzsKCVUzMiBkZXZObzsKfTsKCnN0cnVjdCBkZWxfdmlydF9pb3BhcnQgewoJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KCVUzMiBidXNObzsKCVUzMiBkZXZObzsKfTsKCnN0cnVjdCBkZXRfdmlydF9pb3BhcnQgewkgICAgIC8qIGRldGFjaCBpbnRlcm5hbCBwb3J0ICovCgl2b2lkICpjaGFucHRyOwkJICAgICAvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLwoJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKfTsKCnN0cnVjdCBwYXVyZXNfdmRpc2tfaW9wYXJ0IHsKCXZvaWQgKmNoYW5wdHI7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCglzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OyAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgdmlydCBkaXNrICovCn07CgpzdHJ1Y3QgYWRkX3N3aXRjaF9pb3BhcnQgewkgICAgIC8qIGFkZCBzd2l0Y2ggKi8KCXN0cnVjdCBzd2l0Y2hfaW5mbyAqc3d0Y2g7CgljaGFyICpwYXJhbXM7Cgl1bG9uZyBwYXJhbXNfYnl0ZXM7Cn07CgpzdHJ1Y3QgZGVsX3N3aXRjaF9pb3BhcnQgewkgICAgIC8qIGRlc3Ryb3kgc3dpdGNoICovCglzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOwp9OwoKc3RydWN0IGlvX21zZ3MgewoKCUlPUEFSVF9NU0dfVFlQRSBtc2d0eXBlOwoKCS8qIGFkZGl0aW9uYWwgcGFyYW1zIG5lZWRlZCBieSBzb21lIG1lc3NhZ2VzICovCgl1bmlvbiB7CgkJc3RydWN0IGFkZF92aXJ0X2lvcGFydCBhZGRfdmhiYTsKCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF92bmljOwoJCXN0cnVjdCBhZGRfdmRpc2tfaW9wYXJ0IGFkZF92ZGlzazsKCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF92aGJhOwoJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX3ZuaWM7CgkJc3RydWN0IGRldF92aXJ0X2lvcGFydCBkZXRfdmhiYTsKCQlzdHJ1Y3QgZGV0X3ZpcnRfaW9wYXJ0IGRldF92bmljOwoJCXN0cnVjdCBkZWxfdmRpc2tfaW9wYXJ0IGRlbF92ZGlzazsKCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF9hbGxfdmRpc2tzX2Zvcl92aGJhOwoJCXN0cnVjdCBhZGRfdmlydF9pb3BhcnQgYWRkX2RldmljZTsKCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF9kZXZpY2U7CgkJc3RydWN0IGRldF92aXJ0X2lvcGFydCBkZXRfaW50cG9ydDsKCQlzdHJ1Y3QgYWRkX3N3aXRjaF9pb3BhcnQgYWRkX3N3aXRjaDsKCQlzdHJ1Y3QgZGVsX3N3aXRjaF9pb3BhcnQgZGVsX3N3aXRjaDsKCQlzdHJ1Y3QgZXh0cG9ydF9pbmZvICpleHRQb3J0OwkvKiBmb3IgYXR0YWNoIG9yIGRldGFjaAoJCQkJCQkgKiBwbmljL2dlbmVyaWMgZGVsZXRlIGFsbAoJCQkJCQkgKiB2aGJhcy9hbGx2bmljcyBuZWVkIG5vCgkJCQkJCSAqIHBhcmFtZXRlcnMgKi8KCQlzdHJ1Y3QgcGF1cmVzX3ZkaXNrX2lvcGFydCBwYXVyZXNfdmRpc2s7Cgl9Owp9OwoKLyoKKiBHdWVzdCBtZXNzYWdlcyBzZW50IHRvIFZpcnRDb250cm9sQ2hhbkZ1bmMgYnkgY29kZSB0aGF0IHByb2Nlc3NlcwoqIHRoZSBDb250cm9sVm0gY2hhbm5lbCBtZXNzYWdlcy4KKi8KCnR5cGVkZWYgZW51bSB7CglHVUVTVF9BRERfVkJVUywKCUdVRVNUX0FERF9WSEJBLAoJR1VFU1RfQUREX1ZOSUMsCglHVUVTVF9ERUxfVkJVUywKCUdVRVNUX0RFTF9WSEJBLAoJR1VFU1RfREVMX1ZOSUMsCglHVUVTVF9ERUxfQUxMX1ZIQkFTLAoJR1VFU1RfREVMX0FMTF9WTklDUywKCUdVRVNUX0RFTF9BTExfVkJVU0VTLAkvKiBkZWxldGVzIGFsbCB2aGJhcyAmIHZuaWNzIG9uIGFsbAoJCQkJICogYnVzZXMgYW5kIGRlbGV0ZXMgYWxsIGJ1c2VzICovCglHVUVTVF9QQVVTRV9WSEJBLAoJR1VFU1RfUEFVU0VfVk5JQywKCUdVRVNUX1JFU1VNRV9WSEJBLAoJR1VFU1RfUkVTVU1FX1ZOSUMKfSBHVUVTVFBBUlRfTVNHX1RZUEU7CgpzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IHsKCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsIGZvciBidXMgLQoJCQkJCSAqIE5PVCBZRVQgVVNFRCAqLwoJVTMyIGJ1c05vOwkJLyogYnVzIG51bWJlciB0byBiZSBjcmVhdGVkL2RlbGV0ZWQgKi8KCVUzMiBkZXZpY2VDb3VudDsJLyogbWF4IG51bSBvZiBkZXZpY2VzIG9uIGJ1cyAqLwoJR1VJRCBidXNUeXBlR3VpZDsJLyogaW5kaWNhdGVzIHR5cGUgb2YgYnVzICovCglHVUlEIGJ1c0luc3RHdWlkOwkvKiBpbnN0YW5jZSBndWlkIGZvciBkZXZpY2UgKi8KfTsKCnN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgewoJVTMyIGJ1c05vOwkJLyogYnVzIG51bWJlciB0byBiZSBkZWxldGVkICovCgkvKiBvbmNlIHdlIHN0YXJ0IHVzaW5nIHRoZSBidXMncyBjaGFubmVsLCBhZGQgY2FuIGR1bXAgYnVzTm8KCSogaW50byB0aGUgY2hhbm5lbCBoZWFkZXIgYW5kIHRoZW4gZGVsZXRlIHdpbGwgbmVlZCBvbmx5IG9uZQoJKiBwYXJhbWV0ZXIsIGNoYW5wdHIuICovCn07CgpzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IHsKCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCglVMzIgYnVzTm87CQkvKiBidXMgbnVtYmVyIGZvciB0aGUgb3BlcmF0aW9uICovCglVMzIgZGV2aWNlTm87CQkvKiBudW1iZXIgb2YgZGV2aWNlIG9uIHRoZSBidXMgKi8KCUdVSUQgZGV2SW5zdEd1aWQ7CS8qIGluc3RhbmNlIGd1aWQgZm9yIGRldmljZSAqLwoJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogcmVjdi9zZW5kIGludGVycnVwdCBpbmZvICovCgkvKiByZWN2SW50ZXJydXB0SGFuZGxlIGNvbnRhaW5zIGluZm8gbmVlZGVkIGluIG9yZGVyIHRvCgkgKiByZWdpc3RlciB0byByZWNlaXZlIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4KCSAqIHNlbmRJbnRlcnJ1cHRIYW5kbGUgY29udGFpbnMgaGFuZGxlIHdoaWNoIGlzIHByb3ZpZGVkIHRvCgkgKiBtb25pdG9yIFZNQ0FMTCB0aGF0IHdpbGwgY2F1c2UgYW4gaW50ZXJydXB0IHRvIGJlIGdlbmVyYXRlZAoJICogZm9yIHRoZSBvdGhlciBlbmQuCgkgKi8KfTsKCnN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCB7Cgl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLwp9OwoKc3RydWN0IHJlc3VtZV92aXJ0X2d1ZXN0cGFydCB7Cgl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLwp9OwoKc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCB7Cgl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLwp9OwoKc3RydWN0IGluaXRfY2hpcHNldF9ndWVzdHBhcnQgewoJVTMyIGJ1c0NvdW50OwkJLyogaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mIGJ1c3NlcyAqLwoJVTMyIHN3aXRjaENvdW50OwkvKiBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2Ygc3dpdGNoZXMgKi8KfTsKCnN0cnVjdCBndWVzdF9tc2dzIHsKCglHVUVTVFBBUlRfTVNHX1RZUEUgbXNndHlwZTsKCgkvKiBhZGRpdGlvbmFsIHBhcmFtcyBuZWVkZWQgYnkgbWVzc2FnZXMgKi8KCXVuaW9uIHsKCQlzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IGFkZF92YnVzOwoJCXN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgYWRkX3ZoYmE7CgkJc3RydWN0IGFkZF92aXJ0X2d1ZXN0cGFydCBhZGRfdm5pYzsKCQlzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgcGF1c2VfdmhiYTsKCQlzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgcGF1c2Vfdm5pYzsKCQlzdHJ1Y3QgcmVzdW1lX3ZpcnRfZ3Vlc3RwYXJ0IHJlc3VtZV92aGJhOwoJCXN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgcmVzdW1lX3ZuaWM7CgkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfdmJ1czsKCQlzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0IGRlbF92aGJhOwoJCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVsX3ZuaWM7CgkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfYWxsX3ZoYmFzOwoJCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgZGVsX2FsbF92bmljczsKCQkvKiBkZWxfYWxsX3ZidXNlcyBuZWVkcyBubyBwYXJhbWV0ZXJzICovCgl9OwoJc3RydWN0IGluaXRfY2hpcHNldF9ndWVzdHBhcnQgaW5pdF9jaGlwc2V0OwoKfTsKCiNpZm5kZWYgX194ZwojZGVmaW5lIF9feGcoeCkgKCh2b2xhdGlsZSBsb25nICopKHgpKQojZW5kaWYKCi8qCiogIEJlbG93IGNvZGUgaXMgYSBjb3B5IG9mIExpbnV4IGtlcm5lbCdzIGNtcHhjaGcgZnVuY3Rpb24gbG9jYXRlZCBhdAoqICB0aGlzIHBsYWNlCiogIGh0dHA6Ly90Y3N4ZW9uOjgwODAvc291cmNlL3hyZWYvMDB0cnVuay1BcHBPUy1saW51eC9pbmNsdWRlL2FzbS14ODYvY21weGNoZ182NC5oIzg0CiogIFJlYXNvbiBmb3IgY3JlYXRpbmcgb3VyIG93biB2ZXJzaW9uIG9mIGNtcHhjaGcgYWxvbmcgd2l0aAoqICBVSVNMSUJfTE9DS19QUkVGSVggaXMgdG8gbWFrZSB0aGUgb3BlcmF0aW9uIGF0b21pYyBldmVuIGZvciBub24gU01QCiogIGd1ZXN0cy4KKi8KCiNkZWZpbmUgdWlzbGliY21weGNoZzY0KHAsIG8sIG4sIHMpIGNtcHhjaGcocCwgbywgbikKCiNlbmRpZgkJCQkvKiBfX1VJU1FVRVVFX0hfXyAqLwo=