Lyogdmlzb3JjaGlwc2V0LmgKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fVklTT1JDSElQU0VUX0hfXwojZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXwoKI2luY2x1ZGUgInRpbXNrbW9kLmgiCiNpbmNsdWRlICJjaGFubmVsLmgiCiNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCiNpbmNsdWRlICJwYXJzZXIuaCIKI2luY2x1ZGUgInByb2NvYmplY3R0cmVlLmgiCiNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgojaW5jbHVkZSAidmJ1c2hlbHBlci5oIgoKLyoqIERlc2NyaWJlcyB0aGUgc3RhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygd2hpY2ggY29udHJvbHZtIG1lc3NhZ2VzIGhhdmUKICogIGJlZW4gcmVjZWl2ZWQgZm9yIGEgYnVzIG9yIGRldmljZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCVUzMiBjcmVhdGVkOjE7CglVMzIgYXR0YWNoZWQ6MTsKCVUzMiBjb25maWd1cmVkOjE7CglVMzIgcnVubmluZzoxOwoJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCgkvKiBSZW1haW5pbmcgYml0cyBpbiB0aGlzIDMyLWJpdCB3b3JkIGFyZSB1bnVzZWQuICovCn0gVklTT1JDSElQU0VUX1NUQVRFOwoKdHlwZWRlZiBlbnVtIHsKCS8qKiBhZGRyZXNzIGlzIGd1ZXN0IHBoeXNpY2FsLCBidXQgb3V0c2lkZSBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5CgkgKiAgcmVnaW9uIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUyAodGhpcyBpcyB0aGUgbm9ybWFsCgkgKiAgYWRkcmVzcyB0eXBlIGZvciBTdXBlcnZpc29yIGNoYW5uZWxzKQoJICovCglBRERSVFlQRV9sb2NhbFBoeXNpY2FsLAoKCS8qKiBhZGRyZXNzIGlzIGd1ZXN0IHBoeXNpY2FsLCBhbmQgd2l0aElOIHRoZSBjb25maW5lcyBvZiB0aGUKCSAqICBwaHlzaWNhbCBtZW1vcnkgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUy4KCSAqLwoJQUREUlRZUEVfbG9jYWxUZXN0LAp9IFZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRTsKCnR5cGVkZWYgZW51bSB7CglDUkFTSF9kZXYsCglDUkFTSF9idXMsCn0gQ1JBU0hfT0JKX1RZUEU7CgovKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgY2hhbm5lbC4KICovCnR5cGVkZWYgc3RydWN0IHsKCVZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRSBhZGRyVHlwZTsKCUhPU1RBRERSRVNTIGNoYW5uZWxBZGRyOwoJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKCVU2NCBuQ2hhbm5lbEJ5dGVzOwoJR1VJRCBjaGFubmVsVHlwZUd1aWQ7CglHVUlEIGNoYW5uZWxJbnN0R3VpZDsKCn0gVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTzsKCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBkZXZpY2UuCiAqICBBbnkgdmlzb3JjaGlwc2V0IGNsaWVudCBjYW4gcXVlcnkgdGhlc2UgYXR0cmlidXRlcyB1c2luZwogKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfZGV2aWNlX2luZm8oKSBvcgogKiAgdmlzb3JjaGlwc2V0X2dldF9zZXJ2ZXJfZGV2aWNlX2luZm8oKS4KICovCnR5cGVkZWYgc3RydWN0IHsKCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CglVMzIgYnVzTm87CglVMzIgZGV2Tm87CglHVUlEIGRldkluc3RHdWlkOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKCVUzMiBSZXNlcnZlZDE7CQkvKiBDT05UUk9MVk1fSUQgKi8KCVU2NCBSZXNlcnZlZDI7CglVMzIgc3dpdGNoTm87CQkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCglVMzIgaW50ZXJuYWxQb3J0Tm87CS8qIHdoZW4gZGV2U3RhdGUuYXR0YWNoZWQ9PTEgKi8KCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwkvKiBDT05UUk9MVk1fTUVTU0FHRSAqLwoJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLwoJdm9pZCAqYnVzX2RyaXZlcl9jb250ZXh0OwoKfSBWSVNPUkNISVBTRVRfREVWSUNFX0lORk87CgpzdGF0aWMgaW5saW5lIFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqCmZpbmRkZXZpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCnsKCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CgkJaWYgKHAtPmJ1c05vID09IGJ1c05vICYmIHAtPmRldk5vID09IGRldk5vKQoJCQlyZXR1cm4gcDsKCX0KCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgZGVsYnVzZGV2aWNlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBVMzIgYnVzTm8pCnsKCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcCwgKnRtcDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgdG1wLCBsaXN0LCBlbnRyeSkgewoJCWlmIChwLT5idXNObyA9PSBidXNObykgewoJCQlsaXN0X2RlbCgmcC0+ZW50cnkpOwoJCQlrZnJlZShwKTsKCQl9Cgl9Cn0KCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBidXMuCiAqICAoRm9yIGEgc2VydmljZSBwYXJ0aXRpb24gYWN0aW5nIGFzIHRoZSBzZXJ2ZXIgZm9yIGJ1c2VzL2RldmljZXMsIHRoZXJlCiAqICBpcyBhIDEtdG8tMSByZWxhdGlvbnNoaXAgYmV0d2VlbiBidXNzZXMgYW5kIGd1ZXN0IHBhcnRpdGlvbnMuKQogKiAgQW55IHZpc29yY2hpcHNldCBjbGllbnQgY2FuIHF1ZXJ5IHRoZXNlIGF0dHJpYnV0ZXMgdXNpbmcKICogIHZpc29yY2hpcHNldF9nZXRfY2xpZW50X2J1c19pbmZvKCkgb3Igdmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbygpLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKCVUzMiBidXNObzsKCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKCVZJU09SQ0hJUFNFVF9DSEFOTkVMX0lORk8gY2hhbkluZm87CglHVUlEIHBhcnRpdGlvbkd1aWQ7CglVNjQgcGFydGl0aW9uSGFuZGxlOwoJVTggKm5hbWU7CQkvKiBVVEY4ICovCglVOCAqZGVzY3JpcHRpb247CS8qIFVURjggKi8KCVU2NCBSZXNlcnZlZDE7CglVMzIgUmVzZXJ2ZWQyOwoJTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OwoJc3RydWN0IHsKCQlVMzIgc2VydmVyOjE7CgkJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCgkJLyogUmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgdW51c2VkLiAqLwoJfSBmbGFnczsKCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwkvKiBDT05UUk9MVk0gTXNnSGRyICovCgkvKiogRm9yIHByaXZhdGUgdXNlIGJ5IHRoZSBidXMgZHJpdmVyICovCgl2b2lkICpidXNfZHJpdmVyX2NvbnRleHQ7CglVNjQgZGV2Tm87Cgp9IFZJU09SQ0hJUFNFVF9CVVNfSU5GTzsKCnN0YXRpYyBpbmxpbmUgVklTT1JDSElQU0VUX0JVU19JTkZPICoKZmluZGJ1cyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBVMzIgYnVzTm8pCnsKCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CgkJaWYgKHAtPmJ1c05vID09IGJ1c05vKQoJCQlyZXR1cm4gcDsKCX0KCXJldHVybiBOVUxMOwp9CgovKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3Igc3dpdGNoLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJVTMyIHN3aXRjaE5vOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKCVU4ICphdXRoU2VydmljZTE7CglVOCAqYXV0aFNlcnZpY2UyOwoJVTggKmF1dGhTZXJ2aWNlMzsKCVU4ICpzZWN1cml0eUNvbnRleHQ7CglVNjQgUmVzZXJ2ZWQ7CglVMzIgUmVzZXJ2ZWQyOwkJLyogQ09OVFJPTFZNX0lEICovCglzdHJ1Y3QgZGV2aWNlIGRldjsKCUJPT0wgZGV2X2V4aXN0czsKCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwoKfSBWSVNPUkNISVBTRVRfU1dJVENIX0lORk87CgovKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgZXh0ZXJuYWwgcG9ydCwgd2hpY2ggaXMgY29ubmVjdGVkCiAqICB0byBhIHNwZWNpZmljIHN3aXRjaC4KICovCnR5cGVkZWYgc3RydWN0IHsKCVUzMiBzd2l0Y2hObzsKCVUzMiBleHRlcm5hbFBvcnRObzsKCVZJU09SQ0hJUFNFVF9TVEFURSBzdGF0ZTsKCUdVSUQgbmV0d29ya1pvbmVHdWlkOwoJaW50IHBkUG9ydDsKCVU4ICppcDsKCVU4ICppcE5ldG1hc2s7CglVOCAqaXBCcm9hZGNhc3Q7CglVOCAqaXBOZXR3b3JrOwoJVTggKmlwR2F0ZXdheTsKCVU4ICppcEROUzsKCVU2NCBSZXNlcnZlZDE7CglVMzIgUmVzZXJ2ZWQyOwkJLyogQ09OVFJPTFZNX0lEICovCglzdHJ1Y3QgZGV2aWNlIGRldjsKCUJPT0wgZGV2X2V4aXN0czsKCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwoKfSBWSVNPUkNISVBTRVRfRVhURVJOQUxQT1JUX0lORk87CgovKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgaW50ZXJuYWwgcG9ydCwgd2hpY2ggaXMgaG93IGEKICogIGRldmljZSBjb25uZWN0cyB0byBhIHBhcnRpY3VsYXIgc3dpdGNoLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJVTMyIHN3aXRjaE5vOwoJVTMyIGludGVybmFsUG9ydE5vOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJVTMyIGJ1c05vOwkJLyogdmFsaWQgb25seSB3aGVuIHN0YXRlLmF0dGFjaGVkID09IDEgKi8KCVUzMiBkZXZObzsJCS8qIHZhbGlkIG9ubHkgd2hlbiBzdGF0ZS5hdHRhY2hlZCA9PSAxICovCglVNjQgUmVzZXJ2ZWQxOwoJVTMyIFJlc2VydmVkMjsJCS8qIENPTlRST0xWTV9JRCAqLwoJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CglNWVBST0NPQkpFQ1QgKnByb2NPYmplY3Q7Cgp9IFZJU09SQ0hJUFNFVF9JTlRFUk5BTFBPUlRfSU5GTzsKCi8qICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdmlzb3JjaGlwc2V0IHdoZW4gY2VydGFpbgogKiAgZXZlbnRzIGhhcHBlbi4gIChUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGlzIG91dHNpZGUgb2YKICogIHZpc29yY2hpcHNldC4pCiAqLwp0eXBlZGVmIHN0cnVjdCB7Cgl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8pOwoJdm9pZCAoKmJ1c19kZXN0cm95KSh1bG9uZyBidXNObyk7Cgl2b2lkICgqZGV2aWNlX2NyZWF0ZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKCXZvaWQgKCpkZXZpY2VfcGF1c2UpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7Cgl2b2lkICgqZGV2aWNlX3Jlc3VtZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKCWludCAoKmdldF9jaGFubmVsX2luZm8pKEdVSUQgdHlwZUd1aWQsIHVsb25nICptaW5TaXplLAoJCQkJIHVsb25nICptYXhTaXplKTsKfSBWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUzsKCi8qICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbnNpZGUgdmlzb3JjaGlwc2V0LCBhbmQgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUKICogIHJlc3BvbnNlcyB0byBzcGVjaWZpYyBldmVudHMgKGJ5IGNvZGUgb3V0c2lkZSBvZiB2aXNvcmNoaXBzZXQpLgogKiAgRm9yIG5vdywgdGhlIHZhbHVlIGZvciBlYWNoIHJlc3BvbnNlIGlzIHNpbXBseSBlaXRoZXI6CiAqICAgICAgIDAgPSBpdCB3b3JrZWQKICogICAgICAtMSA9IGl0IGZhaWxlZAogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJdm9pZCAoKmJ1c19jcmVhdGUpKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOwoJdm9pZCAoKmJ1c19kZXN0cm95KSh1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKTsKCXZvaWQgKCpkZXZpY2VfY3JlYXRlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7Cgl2b2lkICgqZGV2aWNlX2Rlc3Ryb3kpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKCXZvaWQgKCpkZXZpY2VfcGF1c2UpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKCXZvaWQgKCpkZXZpY2VfcmVzdW1lKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7Cn0gVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTOwoKLyoqIFJlZ2lzdGVyIGZ1bmN0aW9ucyAoaW4gdGhlIGJ1cyBkcml2ZXIpIHRvIGdldCBjYWxsZWQgYnkgdmlzb3JjaGlwc2V0CiAqICB3aGVuZXZlciBhIGJ1cyBvciBkZXZpY2UgYXBwZWFycyBmb3Igd2hpY2ggdGhpcyBzZXJ2aWNlIHBhcnRpdGlvbiBpcwogKiAgdG8gYmUgdGhlIHNlcnZlciBmb3IuICB2aXNvcmNoaXBzZXQgd2lsbCBmaWxsIGluIDxyZXNwb25kZXJzPiwgdG8KICogIGluZGljYXRlIGZ1bmN0aW9ucyB0aGUgYnVzIGRyaXZlciBzaG91bGQgY2FsbCB0byBpbmRpY2F0ZSBtZXNzYWdlCiAqICByZXNwb25zZXMuCiAqLwp2b2lkCnZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXZfY2xpZW50KFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTICpub3RpZmllcnMsCgkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAoJCQkJICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqZHJpdmVySW5mbyk7CgovKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKICogIHdoZW5ldmVyIGEgYnVzIG9yIGRldmljZSBhcHBlYXJzIGZvciB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzCiAqICB0byBiZSB0aGUgY2xpZW50IGZvci4gIHZpc29yY2hpcHNldCB3aWxsIGZpbGwgaW4gPHJlc3BvbmRlcnM+LCB0bwogKiAgaW5kaWNhdGUgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UKICogIHJlc3BvbnNlcy4KICovCnZvaWQKdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9zZXJ2ZXIoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKCQkJCSAgICBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgKnJlc3BvbmRlcnMsCgkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpkcml2ZXJJbmZvKTsKCnR5cGVkZWYgdm9pZCAoKlNQQVJSRVBPUlRFVkVOVF9DT01QTEVURV9GVU5DKSAoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywKCQkJCQkgICAgICAgaW50IHN0YXR1cyk7Cgp2b2lkIHZpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOwoKQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKHVsb25nIGJ1c05vLCBWSVNPUkNISVBTRVRfQlVTX0lORk8gKmJ1c0luZm8pOwpCT09MIHZpc29yY2hpcHNldF9nZXRfZGV2aWNlX2luZm8odWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLAoJCQkJICBWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKmRldkluZm8pOwpCT09MIHZpc29yY2hpcHNldF9nZXRfc3dpdGNoX2luZm8odWxvbmcgc3dpdGNoTm8sCgkJCQkgIFZJU09SQ0hJUFNFVF9TV0lUQ0hfSU5GTyAqc3dpdGNoSW5mbyk7CkJPT0wgdmlzb3JjaGlwc2V0X2dldF9leHRlcm5hbHBvcnRfaW5mbyh1bG9uZyBzd2l0Y2hObywgdWxvbmcgZXh0ZXJuYWxQb3J0Tm8sCgkJCQkJVklTT1JDSElQU0VUX0VYVEVSTkFMUE9SVF9JTkZPCgkJCQkJKmV4dGVybmFsUG9ydEluZm8pOwpCT09MIHZpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQodWxvbmcgYnVzTm8sIHZvaWQgKmNvbnRleHQpOwpCT09MIHZpc29yY2hpcHNldF9zZXRfZGV2aWNlX2NvbnRleHQodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCB2b2lkICpjb250ZXh0KTsKaW50IHZpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KHZvaWQpOwppbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3Qodm9pZCk7CmludCB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKTsKdm9pZCB2aXNvcmNoaXBzZXRfY29udHJvbHZtX3Jlc3BvbmRfcmVwb3J0RXZlbnQoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywKCQkJCQkJdm9pZCAqcGF5bG9hZCk7CnZvaWQgdmlzb3JjaGlwc2V0X3NhdmVfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBDUkFTSF9PQkpfVFlQRSB0eXBlKTsKdm9pZCAqdmlzb3JjaGlwc2V0X2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLAoJCQkgICAgICAgQk9PTCBva190b19ibG9jaywgY2hhciAqZm4sIGludCBsbik7CnZvaWQgdmlzb3JjaGlwc2V0X2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsIHZvaWQgKnAsCgkJCSAgICAgY2hhciAqZm4sIGludCBsbik7CgojaWYgZGVmaW5lZChUUkFOU01JVEZJTEVfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCiNkZWZpbmUgREJHX0dFVEZJTEVfUEFZTE9BRChtc2csIGNvbnRyb2x2bV9oZWFkZXIpICAgICAgXAoJTE9HSU5GKG1zZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJICAgICAgICh1bG9uZyljb250cm9sdm1faGVhZGVyLlBheWxvYWRWbU9mZnNldCwgXAoJICAgICAgICh1bG9uZyljb250cm9sdm1faGVhZGVyLlBheWxvYWRNYXhCeXRlcykKI2RlZmluZSBEQkdfR0VURklMRShmbXQsIC4uLikgIExPR0lORihmbXQsICMjX19WQV9BUkdTX18pCiNkZWZpbmUgREJHX1BVVEZJTEUoZm10LCAuLi4pICBMT0dJTkYoZm10LCAjI19fVkFfQVJHU19fKQojZWxzZQojZGVmaW5lIERCR19HRVRGSUxFX1BBWUxPQUQobXNnLCBjb250cm9sdm1faGVhZGVyKQojZGVmaW5lIERCR19HRVRGSUxFKGZtdCwgLi4uKQojZGVmaW5lIERCR19QVVRGSUxFKGZtdCwgLi4uKQojZW5kaWYKCiNlbmRpZgo=